まだタイトルない

アウトプット用です

【本読んだ】機械学習のための特徴量エンジニアリング

こんにちは

パソコンが壊れてKaggleも出来なかったので、この本を買って勉強しました。
ちょっと求めてた内容とは違ったのですが、学ぶこととか不足してるものはたくさんあったので自分用にまとめます。 自分用なので何となくすでに知ってることとかは省略するため粒度がまばらになると思います。

1章 機械学習パイプライン

  • データにはノイズや欠損値はつきもの
  • 上手くデータから学習するために前処理や特徴量エンジニアリングが必要
  • いい特徴量を用意できれば続くモデリングが簡単になり、得られるモデルの性能も良いものになる

2章 数値データの取り扱い

  • 数値データでも変換は必要な場合がある
    • プラス/マイナスだけが重要な場合→2値化
    • 荒い粒度で良い→離散化
  • スケール(数値データの取る値の範囲)に影響を受ける手法を用いる時は正規化が必要
  • 決定木系統のモデルは基本的に入力のスケールに影響を受けない
    • 値の大小で分岐させるため
    • ただし、時間とともにデータが増え、スケールが変化する場合は考慮が必要
  • https://amalog.hateblo.jp/entry/decision-tree-scaling

2値化

  • データをヒストグラム化して値の大小より0か0出ないかが重要だと判断できる時、1以上を1に上書きし2値化する
  • 例)推薦システム作成用のデータで再生回数の特徴を2値化

離散化

  • 分位数を用いて階級を分けて離散化
  • 対数変換
    • 正の数値データが裾の重い分布を保つ場合に有効
      • 数値の大きい裾部分を圧縮し、数値の小さい部分を拡大して表現できる
      • 正規分布に近い分布に変換される
  • Box-Cox変換
    • データが正の場合のみ適用可能
    • λを指定する必要があるがPythonで利用する場合自動的に決定する機能がついている
    • 正直良く分からないけど、印象として対数返還以上に強くデータの分布を正規分布に近づけている

スケーリング、正規化

  • 特徴量ごとにスケールが大きく異なる場合に役立つ
  • 正則化過学習を防ぐための手法の一つ
  • 対数変換と違いスケーリングによって特徴量の分布は変化しない
  • Min-Maxスケーリング
    • 特徴量の範囲を[0,1]にする
  • 標準化
    • 特徴量の平均を0、分散を1にする。 統計学で習うのと同じ
  • スパースデータにMin-Maxや標準化を適用すると、疎ベクトルを密ベクトルに変えてしまい計算不可を上げてしまうことがある
  • L2正規化
    • 特徴量ベクトルのノルムを1にする
    • 過学習防止のためにリッジやらラッソを見た記憶が。。。。うっ
  • TF-IDF(後で登場

余談

交互作用特徴量

  • 複数の特徴量の積として定義される
    • 2つの特徴量の席は「ペアワイズ交互作用特徴量」という
  • 線形モデルに組み込む場合明示的にモデルに組み込む必要があるが、決定木モデルではその必要はない。

特徴選択

  • 有用ではない特徴を取り除くことでモデルの複雑さを軽減する手法

  • 【フィルタ法】閾値を使って有用でないと思われる特徴量を除去する

  • 【 ラッパー法】特徴量の一部でモデルを作成し、制度を調べることで取捨選択をする
  • 【組み込み法】モデルの学習プロセスに組み込まれているもの

  • 計算コスト

    • ラッパー法 > 組み込み法 > フィルタ法
  • 品質
    • ラッパー法 > 組み込み法 > フィルタ法

3章 テキストデータの取り扱い

  • メインの方針は数値化して扱うこと

 Bag-of-Words

  • 単語の出現回数のベクトル
  • テキストデータ内に現れるすべての単語を集めたものが語彙
    • 語彙がnこの時BoWベクトルはn次元
  • テキストの順序情報は保持しない
    • テキストの意味理解にはあまり役立たない
  • scikit-learnのCountVectorizerを使って変換できる

Bag-of-n-Grams

  • nグラムで語彙を作成することで情報量の多いベクトルを作成する
  • ベクトルの次元は当然増大し取り扱いコストが大きくなる

単語除去

  • ストップワードを用いて除去
    • 代名詞、冠詞、前置詞のような内容によらずに使われる単語から特徴量を作っても精度に貢献できない。
  • 頻度に応じて除去
    • データセットに応じて、頻度の高い単語を除去(情報量が少ないから
    • 上位何個まで削除するかを決めて運用
    • レアな単語は除去するか、1つの特徴量として扱う
  • ステミング
    • 英語に対して使われることがある変化型を五感の形に変換し、同じ単語として認識させる。
    • 計算コストがかかり、完璧とも言えない手法なので使わない場合もある。
    • comment:日本語でやるならMecabとかの語幹が使える・・・?

コロケーション抽出

  • 有名なフレーズのことをコロケーションと呼ぶ
  • 意味のあるフレーズを残すことで特徴量の数を削減することができる
  • コーパスのメンテは手作業になるため、ツイート、ブログ、ニュース記事等新語が登場しやすいものには現実的なアプローチではない
  • 仮説検定を用いたコロケーション抽出方法が研究されている

流れ

  • htmlやjsonのタグを除去しテキストだけにする
  • トークン化(形態素解析
  • 単語やnグラムに変換
    • ステミングや単語除去で特徴量をコンパクトにする

※ ツイートのような短いデータには特徴量生成とモデリングに別の手法を使う必要がある

4章 TF-IDF

  • すべての単語を同様にカウントすると必要以上に強調されてしまう単語が生まれるためTF-IDFを求める
  • 出現頻度がレアな単語の影響を大きく、出現頻度の高い単語の影響を小さくする
  • 学習データにない単語がテストデータに現れた場合、新しい単語に対する文章頻度は得られない
    • 新しい単語をテストデータから取り除く
    • ゴミとして一つの特徴量にまとめる

ロジスティック回帰

  • シンプルな線形分類器
  • シンプルだから、最初に試すアルゴリズムに適している
  • 例)bowやl2正規化、tf-idf変換を施したデータをロジスティック回帰でクラス分類
  • 劣決定に注意
    • 特徴量がデータ数より多いときに最適なモデルを探す問題のこと
    • 正則化をすることで対応
      • 正則化パラメータはハイパーパラメータなのでチューニングが必要

5章 カテゴリ変数の取り扱い

  • 2つの値がどれくらい違うかを知ることより、値が異なることが重要な場合はカテゴリ変数を使うと良い

種類

  • One-Hotエンコーディング
    • M5コンペでsnapを表現することに使った
    • 冗長なのでモデルの係数が一位に定まらない
    • 特徴量がカテゴリに対応している
  • ダミーコーディング
    • 1つは0のみで表すことによりOne-Hotよりベクトルの次元数を下げる
    • 0のみで表すカテゴリを参照カテゴリという
    • 0ベクトルが使われているため欠損データを簡単に処理できない
  • Effectコーディング
    • 参照カテゴリを全て-1のベクトルにしたもの
    • 欠損データを処理できるようにしたが-1のベクトルは密なベクトルなのでコストが高い

上記3種の手法は、カテゴリ数が非常に大きくなるとうまく機能しない

カテゴリ数の多いデータへの対応

  1. 気にしない。計算が軽いシンプルなモデルで学習をする
  2. 圧縮する
    1. 特徴量ハッシング
    2. ビンカウンティング

特徴量ハッシング

  • 線形モデルで利用されがち
  • ハッシュ関数を使って圧縮(信号処理とかででてくるハッシュと同じ
  • 大きなバイアスが発生することはない

ビンカウンティング

  • カテゴリ地をエンコードして特徴量にする代わりに、何らかの値を集計した統計量を使用する。
    • 誰がクリックしたかよりも、何割クリックされてるかに変える とか
  • レアなカテゴリにはバックオフや最小カウントスケッチで対応
  • リークに注意
  • 統計量を作るので決定木モデルにも使うことができる

6章 PCA

  • 特徴涼感の線形相関を元二次元削減を狙う
  • 特徴量が非常に多いときは計算コストがかかるので向いていない
  • 全体の分散の何%まで説明するかをscikit-learnで設定できる
  • 生の集計データをPCAしようとすると外れ値に大きな影響を受ける可能性があるため、スケーリング等前処理をすること

ユースケース

  • 時系列データの異常検知
  • 金融(株価変動要因の分析
  • 画像の深層学習領域の前処理としてPCAやZCA(ゼロ位相成分分析)を使用する場合あり

7章 k-meansを使ったスタッキング

クラス分類用の特徴量作成

  • 所属するクラスタのIDを使ってデータ点を表現できる
  • クラスタ特徴量ありのロジスティック回帰は、クラスタ特徴量なしの綴じスティック回帰と比べて非常に性能が良い
  • 非線形分類機と同程度の性能を確認できた(速度は非線形のほうが遅い
    • ※この本の実験において。 k-means+ロジスティック回帰は非線形モデルと戦えるポテンシャルは確認できる
  • 勾配Boostingやモデルスタッキングにつながる考え方
    • kaggleでよく見る技術でまだ使ったことなければ理解もしてないので今後学んで自分の武器にする必要がある
  • データのリークは起こりうるがそこまで深刻な問題でない らしい

8章 画像特徴量の抽出と深層学習

SHIFTとHOG

いぜんからHOG特徴量というのは聞いたことがあったので、そのことかなと思って読みましたが今ひとつSHIFTとHOGのかき分けがキレイにされてなく理解に至りませんでした。画像分野はDeepLearningに変わっていってる点も理解しようというやる気のでなさに影響しましたね。

ピクセル単位で見るのは賢くないので、ピクセル値間の画像勾配を求めて特徴量にしようっていうやつ。

DeepLearningについてはゼロから作るを読んだほうが絶対にいいです。
読んだときの記事はこちら teyoblog.hatenablog.com

一点だけ

  • 全結合層は計算不可が高いが広範囲のパターンを検出することに向いているので、AlexNetの最後2層に使われている。
  • 畳み込みは部分的なパターンの抽出ができる

2点でした。

9章

これから写経します。

あとがき

今回このまとめを作るまで、10時間くらいで1周目を読んで、更に10時間くらいかけて1周目のメモを見ながらまとめ直しました。自分用のメモ=この記事になっていて自分用のメモはもう少し粒度細かく、本の内容ゴリゴリでいい気がしてます。

理想は本単位で自分用メモを作成。そこから技術ごとの総合的なメモに追加と、ブログ用に抽出をするほうがいいと思ってます。

自分なりの勉強法、まとめ方教えてもらえると嬉しいです。
色んな人の技術書一冊を学ぶ過程が知りたい。