糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン) 読んだ

www.amazon.co.jp

訳者よりご恵贈いただきました.8年前に kaggle のアカウントを作ったきりの人間であるため,この文章にさほど価値があるとは思えませんが感想を書きたいと思います.

ロジスティック回帰や決定木,ランダムフォレストやニューラルネットワークなどの機械学習アルゴリズムにどのようにデータを入力するか,ただのデータをよりアルゴリズムのパフォーマンスが改善するように加工する作業を「特徴量エンジニアリング」と呼びます.

本書はその特徴量エンジニアリングの基礎である

  • 変数の値をそのまま使うのか,二値化するのか,区分に分けて離散化するのか,対数を取るのか,値を一定の区間に揃えるのか
  • テキストをどのように特徴量にするのか,どう処理すべきか,どう重み付けるのか
  • カテゴリ変数をどのように扱うのか,カテゴリの数が増えた時にどう対処するか
  • 変数の数が多い時にどう減らせば良いのか
  • k-means クラスタリングを用いることで非線形な特徴量抽出が可能になること
  • 画像の特徴量をどう取り出すのか,そして深層学習がどのように特徴量を抽出するのか

といった内容を,「なぜこの加工を行う必要があるのか」「どう嬉しいのか」「どのように問題があるのか」を踏まえながら紹介しています.

また,最後には類似論文の検索アルゴリズムについて,仮説構築,データ加工,実験,仮説の再検証の 4 ステップを繰り返すことでこれまで取り組んできた内容の実践を行っています.

僕が読んでいて面白かったトピックを取り上げます.

  • 5章. カテゴリ変数の取り扱い
    • 僕が日々扱うデータはカテゴリ変数であることがメインであるため,この章は非常に示唆深いものでした. Hasing を用いたカテゴリ変数はどうにも飲み込めていなかったため,本書の説明で理解が明瞭になりました.
    • また,ビンカウンティング (このような呼び方をするのも学びです) についても,次に予測モデルを構築することがあったらぜひ試そうと思えるものでした.
  • 7章. 非線形特徴量の生成 : k-means を使ったスタッキング
    • 「目的変数と説明変数に非線形な関係がある時,または説明変数が非線形多様体上に分布している時 (余談ですがこの『多様体』という単語の使い方は多様体を専門にしている人にとっては許されるものなのでしょうか) 線形モデルでそれをどのように表現するか」という時の対応策として,説明変数に k-means クラスタリングを適用することにより,非線形特徴量が抽出できることを説明しています.
    • この操作がどの程度効果があるのかは図7-7 を見れば一目瞭然です. k-means によって説明変数が割り振られたクラスタを説明変数に追加することにより,ただのロジスティック回帰がランダムフォレストや SVM などに匹敵する AUC を示しています.
    • すぐにこの操作に飛びつかぬよう,計算量の問題やデータリークが起こることへの言及がなされている点も良いと思います.
  • 9章. バック・トゥ・ザ・「フィーチャー」 : 学術論文レコメンドアルゴリズムの構築
    • 単にこれは僕がステップ・バイ・ステップで作業を進めながら検証を行う様子が好きなのでこの章に言及しました.

おそらく,本書に最も価値があるのは「何気なくやっている操作を言語化・テキスト化した」という点ではないでしょうか. 大体の場合僕たちは何も考えずに対数を取ったり正規化をしたり TF-IDF を計算するわけですが,では「なぜその操作を行うのか」「そのデメリットは何か」を説明しようとした時,たとえば入社一年目の新人に聞かれた時,少し戸惑ってしまうのではないでしょうか (説明が全く無理とは言っていません). 「Python は書けるし scikit-learn のドキュメントも読めるので予測モデルを作ってみたい」という入社一年目の新人に「一通り抑えてほしい内容が書かれているのでまずは全部読んでくれ」とこの本を渡し,可能であればそれぞれ試してみて精度や計算時間,メモリ使用量がどう変わるかを試してもらうのが良いのではないでしょうか (本書の例でも必ずしも精度がめざましく改善する,つまり,特徴量エンジニアリングがいつでも「銀の弾丸」となるわけではないことが示されており,ここにもリアリティを感じます).

しかし,わがままを言えば,更に突っ込んで欲しかった話題があります.それは「ニューラルネットワークや勾配ブースティングのような十分複雑なモデルを用いる上で特徴量エンジニアリングはどれだけ貢献するのか,貢献するものとしないものがあるのではないか」というものです.先程述べたような k-means による特徴量変換はロジスティック回帰に投入することで精度の改善を説明していますが,同じ特徴量を Random Forest に投入するとどうなるのでしょうか.さすがに kaggle のような競技プログラミングや実務に寄り過ぎた話題であるため本書の範疇外だとは思いますが.kaggle の kernel を読めという話なのかもしれません.