特徴量エンジニアリングのお勉強
この記事は、主に自分がkaggleをやるにあたって勉強した内容をまとめます。
今回は特徴量エンジニアリングについてです。
kaggleに初めて取り組む人は、”titanic”のコンペのkernelを読み、基本的なデータ分析のワークフローを学ぶことになると思います。
実際にKernelのNotebookを読んだり、書かれているコードを実行しながら雰囲気を掴むことになるのですが、比較的最初の方から次のような疑問を抱くのではないかと思います。
- やたらグラフとか作ってるけど、EDAって結局どういう方針で進めるの?
- 特徴量エンジニアリングも色々なことをしているけど、基本的な方針とかないの?
はい、自分も未だにこのように感じています。
ということで、オライリーから出ている「機械学習のための特徴量エンジニアリング」でよくある方法について勉強することにしました。
この記事も含め、何記事かにわたって特徴量エンジニアリングについてまとめてみようと思います。特に、今回は「特徴量」そのものについて整理します。
そもそも特徴量とは?
最初「特徴量」という言葉を目にしたとき、その実態は何なのだろうか?と思う方が大半ではないでしょうか?
自分の場合、画像処理で登場する「HOG特徴量」などには聞き覚えがあったものの、テーブルデータに対する「特徴量」というもののイメージは全く湧きませんでした。
kaggleのカーネルを読んでも、
- EDA
- 前処理
- 特徴量エンジニアリング
- モデル作成・学習
- パラメータチューニング
- 予測・データ提出
という一連のプロセスは当たり前のものとして扱われており、そもそも「特徴量とは何か?」のような説明は見当たりませんでした(もしあったら教えてほしいです)。
今回参考にしている書籍には以下のように定義されています。
「特徴量は生データを数値として表現したものである」
シンプルですね。なんだか言われてみれば当たり前のような気がします。
もう少し掘り下げるために具体例で考えてみることにしましょう。
例えば生データとして、以下のような文章を考えてみることにします。
“It is a puppy and it is extremely cute”
これはテキストデータなので、当然このままではモデルに入力することはできません。
何らかの方法で数値化する必要がある訳ですね。テキストデータの場合、単純な数値への変換方法として「各単語の出現回数」をカウントするというものがあります(これをBag-of -Words表現というそうです)。
上記の例では、
- it:2回
- is:2回
- a :1回
- puppy:1回
- and:1回
- extremely:1回
- cute:1回
となるので、ベクトル化すると\( [2\ 2\ 1\ 1\ 1\ 1\ 1\ ] \)という表現ができるわけです。
この場合、生データ・特徴量は
- 生データ:”It is a puppy and it is extremely cute”
- 特徴量(特徴ベクトル): \( [2\ 2\ 1\ 1\ 1\ 1\ 1\ ] \)
という対応付けになります。つまり、必ずしも数値データとは限らない生データを、何らかの規則で「数値化」して表現したものが「特徴量」ということですね。
これは先ほどの定義とも合致します。
そして、この「生データを数値化」した特徴量を作成するプロセスが「特徴量エンジニアリング」ということになります。
要は数値とは限らない生データを何とかして数値データに変換する規則を模索するという行為が特徴量エンジニアリングということでしょうか。
また、とにかく生データを数値化できればそれでよいか、というとそうでもなく、データから予測したい事項に適したもの・使用するモデルに適したものを作成する必要があります。
先ほどの例では「単語の出現回数」で生データを数値ベクトルに変換していますが、これでは「it」が何を指すのかとか、「is not」のように、組み合わせで意味を持つ部分の情報が欠落することになります。
実現したいタスクが「翻訳」だった場合にはこのような変換では不十分だろうということが予想できます。
このように、「何を実現したいか?」ということにも依存して、「良い特徴量は何か?」という部分の答えは変わってくるということですね。
まとめると、以下の3点になるでしょうか。
- 特徴量とは「生データ」を「数値」へと変換したもの
- この「数値データ」を作成する過程が「特徴量エンジニアリング」
- 何が良い特徴量か?という問題の答えは、問題設定と使用モデルに依存する
以後、特徴量エンジニアリングについて考える際には
- 数値以外のデータ(カテゴリー変数)をどう数値化するか?
- 数値化されたデータからモデルに合った情報を抽出するにはどうすればよいか?
- 解きたい問題に沿った情報がデータから抜き出せないか?
といったことを念頭に置くとやっていることが明確になるかもしれません(勉強中なので頓珍漢なことを書いているかもしれませんが。。。)
今後の予定
まずはテーブルデータの特徴量エンジニアリングについてまとめられればと思っています。
- 数値データ
- カテゴリ変数
の二つについて、コードと併せてまとめていく予定です。
細かい数式などについてはまた別途、という形にしようかなと考え中です。
また、特徴量エンジニアリングの実践として、featuretoolsなどを使用して機械的に特徴量作成をし、重要度などから特徴量を選択していくということも記事として残していけたらと思っています。
まとめ
今回は導入ということで「特徴量」そのものがいったい何なのかということを、書籍に記載されていた定義をベースに整理してみました。
今月は kaggle のコンペに時間を割きたいので、その過程で知識も整理しつつ、メモとして記事に残していければと思います。
コメント