Pythonではじめる機械学習 7回目

created at 2017/12/14 13:02:20

nownab.log | Pythonではじめる機械学習 6回目

週一でやっていて、毎週読む範囲を決めて資料にまとめて発表するという感じでやっている。

また、勉強会で書いたコードや疑問点などをまとめるためにGitHubのレポジトリを活用している。
Wondershake/machine-learning-study: 機械学習勉強会

この記事は資料作りの下書き的扱い。

7章 テキストデータの処理

  • 連続値特徴量とカテゴリ特徴量の他に、多くのアプリケーションに現れる第3の特徴量としてテキストがある

7.1 文字列として表現されているデータのタイプ

  • 文字列データには次の4種がある
    • カテゴリデータ
      • 色など
    • 意味的にはカテゴリデータだが自由記述な文字列
      • 自由記述で得られた色など
    • 構造化された文字列
      • 住所や人名、電話番号など
    • テキストデータ
      • ツイート、レビュー、チャットログなど
  • コーパス (corpus)
    • テキスト解析におけるデータセットのこと
  • 文書 (document)
    • 1つのテキストとして表現されるデータポイント

7.2 例題アプリケーション: 映画レビューのセンチメント分析

  • 例題としてIMDb (Internet Moview Database)を使う
  • scikit-learnのload_files関数はサブディレクトリとラベルを対応付けてデータを読み込む
  • テキストのままだと機械学習アルゴリズムは扱えないので変換する必要がある

7.3 Bag of Wordsによるテキスト表現

  • BoW (bag-of-words)
    • 最も単純で効率がよく、機械学習で広く用いられているテキストデータ表現
    • 単語の出現回数だけをみる
    • 語順などテキストの構造は失われる
  • BoW表現を作る手順
    • トークン分割 (tokenize): 文書を単語に分割する
    • ボキャブラリ構築 (vocabulary building): 全文書に現れる各単語にユニークな番号を割り当てる
    • エンコード: 各文書に対してボキャブラリの単語の出現回数を数える

7.3.1 トイデータセットに対するBoW

  • scikit-learnではCountVectorizerでBoWに変換できる

7.3.2 映画レビューのBoW

  • CountVectorizerget_feature_namesでボキャブラリを得られる
  • CountVectorizermin_dfオプションで文書頻度によるフィルタリングができる

7.4 ストップワード

  • scikit-learnでは英語のストップワードリストがfeature_extraction.textモジュールに用意されている

7.5 tf-idfを用いたデータのスケール変換

  • tf-idf (term frequency-inverse document frequency)
    • $tfidf(w, d) = tf \times \log(\displaystyle \frac{N + 1}{N_w + 1}) + 1$
  • scikit-learnではTfidfTransformerTfidfVectorizerが用意されている

7.6 モデル係数の調査

7.7 1単語よりも大きい単位のBag-of-Words (n-グラム)

  • 単語Nグラムを特徴量として加えるとコンテキストを学習できる
    • バイグラム (bigram): 連続する2つのトークン
    • トリグラム (trigram): 連続する3つのトークン
  • CountVectorizerTfidfVectorizerngram_rangeオプションで設定できる

7.8 より進んだトークン分割、語幹処理、見出し語化

  • 語幹処理 (stemming)
    • 単語を語幹 (word stem)を使って表現する
  • 見出し語化 (lemmatization)
    • 単語を見出し語 (lemma) を使って表現する
  • 見出し語化のほうが高度でより良い結果が得られる

7.9 トピックモデリングと文書クラスタリング

  • トピックモデリング (topic modeling)
    • テキストデータによく用いられる
    • それぞれの文書に1つ以上のトピックを割り当てる

7.9.1 LDA (Latent Dirichlet Allocation)

  • LDAは同時に現れる頻度の高いトピック(単語の集合)を探す
  • それぞれの文書をトピックの重み付き和として表現する
  • 大規模なデータを理解するのに有用
  • 教師データが少ないときにLDAの結果を教師データありとすると有効

7.10 まとめと展望

  • 自然言語処理 (NLP: natural language processing)について、映画レビューのクラス分類を例に説明した
  • BoW表現は以下で特に有効
    • SPAM検出
    • 詐欺検出
    • センチメント分析
    • テキストのクラス分類
  • オライリーの「入門 自然言語処理」がオススメ
  • 情報検索の基礎」もオススメ
  • 自然言語処理はword2vecで飛躍的に進展した
  • RNN (recurrent neural networks)が勢いある

8章 おわりに

8.1 機械学習問題へのアプローチ

  • 機械学習は大きなデータ解析と意思決定過程のごく一部
  • 機械学習でゴールを達成したとき月数万ドル稼げるならやってもいい
  • ステップ
    • 問題定義
    • 効果の確認
    • 成功の測定方法の確認
    • データ収集
    • プロトタイプ構築
  • 機械学習アプリケーションは本番投入しても大きなフィードバックループからは抜けられない

8.1.1 人間をループに組み込む

  • 簡単なものだけ機械が判断し、難しいものは人間が判断するというようなアプリケーションの設計もある

8.2 プロトタイプから運用システムへ

  • scikit-learnやPythonは解析とプロトタイプ構築に有用だが、運用システムとしても用いられる
  • 運用システムは別のツールセットで構築することもある
  • 運用システムには使い捨ての解析スクリプトとは別の性質が要求される
  • 複雑な機械学習システムを構築するならMachine Learning: The High Interest Credit Card of Technical Debtを読め

8.3 運用システムのテスト

  • オフライン評価: 事前に収集したテストセットで評価する方法
  • ライブテスト: アルゴリズムを導入したシステム全体の評価
    • A/Bテスト

8.4 独自Estimatorの構築

  • scikit-learnと互換性のあるEstimatorを実装すれば、独自アルゴリズムでもPipelineやGridSearchCVが使える
  • 前処理
    • BaseEstimatorTransformerMixinを継承
    • __init__fittransformを実装
  • クラス分類器
    • BaseEstimatorClassifierMixinを継承
    • __init__fitpredictを実装
  • 回帰器
    • BaseEstimatorRegressorMixinを継承
    • __init__fitpredictを実装

8.5 ここからどこへ行くのか

8.5.1 理論

8.5.2 他の機械学習フレームワークとパッケージ

8.5.3 ランキング、推薦システム、その他の学習

  • 本書で紹介しなかった機械学習タスク
    • ランキング
      • 例えばサーチエンジン
    • 推薦システム

8.5.4 確率モデル、推論、確率プログラミング

  • 既存のアルゴリズムを使わず、問題に特化したモデルを直接計算する
  • 確率プログラミング言語

8.5.5 ニューラルネットワーク

  • 最近の人工知能技術のブレークスルーはすべてニューラルネットワークによるもの

8.5.6 大規模データセットへのスケール

  • メモリが足りない場合の戦略は2つ
    • アウトオブコア学習
      • メインメモリに入り切らないデータを1台の計算機で処理する
      • 外部記憶装置から1サンプルもしくは複数サンプルずつ学習し、逐次モデルを更新する
      • 時間がかかる
      • 実装できないアルゴリズムもある
    • クラスタ並列化
      • Hadoop、Spark
      • vw

8.5.7 名誉を得る

8.6 結論

  • おつ!

所感

  • おわったーーー!! :tada:
  • Scikit-learnの使い方が実践しながら学べてとてもよかった
  • 理論にはほぼ触れず、実践する方法にフォーカスしてたのも良い
  • この本で学びながら同時に業務で活かせてたので良かった