特徴量抽出について
こんにちは。Yotです。
現在、SIGNATEで公開されている某コンペに勉強を兼ねて参加中です。
そのコンペの説明変数の数が大きく、特徴量抽出をしなければとなったので、
調べたことをメモに残しておこうと思います。
今回、特徴量抽出を行った理由
・モデルの精度を上げる
・計算量を少なくし、学習時間を短縮
・過学習を防ぐ
主に上二つの目的が大きいです。
今回のコンペのデータは、各説明変数に名前が与えられていなかったためデータの内容を想像することができず、変数の数が多いことからも、学習に使う変数を何かしらの手法で選択しなければならないと思いました。
特徴量抽出方法について
この記事にまとめられていました。
正直、この私の記事読まなくても、ここに飛べば分かる。
このコンペは、あるスコア(連続数)を予測するという内容のものだったので、
Piasonの相関分析とANOVAを行いました。
相関係数の算出方法
PandasのDataFrame.corr()を使うと簡単に出せます。
戻り値がDataFrameなところも、to_csv()で簡単に出力できて便利です。
計算結果をCSVに出力しておくと、相関係数の値で説明変数をフィルタリングしやすく、再計算も必要ないので、オススメです。
説明変数の組み合わせ全パターンの相関係数を計算しているため、ちょっと計算時間は長かったですが、いずれ参考にするかもしれないので、まあいいかなという感じでした。
ANOVA(分散分析)の算出方法
scipyのstats.f_one_way()を使いました。
前述の通り、説明変数の説明がないため、カテゴリ変数がどれかわからず、
とりあえずone-hotぽいデータ(0か1しかないデータ)に対して行いました。
ただ今回はデータ数が1万を超えているため、p値が低く出やすくあまり参考にはならなかった印象です。
(ランダムにデータを抽出して分散分析しても良いものわからず。。)
今回、特徴量抽出してみての感想
説明変数のデータの種類によって抽出方法が違うことは勉強になりました。
また、説明変数を一つづつモデルに追加しながら、予測値の変化を追う手法もあるようで、どこかで試してみたいですね。
ちなみにランダムに500個の説明変数を利用して予測した結果より、相関係数の絶対値が大きなもの200個を利用した予測の方が精度が高く、過学習も抑えられていました。
ただし、まだまだ予測精度が低かったので、特徴量抽出以外にもまだまだ別の前処理していかないとダメそうでした。
続きの話は、区切りがつき次第、別の記事にしていこうと思います。