はじめに
基本的な機械学習の手順:①分類モデルでは、基本的な分類モデルの作成手順を整理しています。
今回は、その中で特徴量の選択にフォーカスして、様々な特徴量の選択方法を比較検討してみたいと思います。
これまでの手順
分析環境
Google BigQuery
Google Colaboratory
対象とするデータ
①分類モデルと同様に、下記の様なテーブル構造で購買データが格納されています。
id | result | product1 | product2 | product3 | product4 | product5 |
---|---|---|---|---|---|---|
001 | 1 | 2500 | 1200 | 1890 | 530 | null |
002 | 0 | 750 | 3300 | null | 1250 | 2000 |
特徴量の選択が目的なので、横軸を300くらいもたせます。
0.対象とする特徴量の選択方法
特徴量選択についてから、次の手法を選びました。
- Embedded Method(SelectFromModel)
- Wrapper Method(RFE)
また、scikit-learnではないけど、ランダムフォレストと検定を用いた特徴量選択手法 Borutaで紹介されていた、Wrapper Methodの1つであるBorutaも用いたいと思います。
- Wrapper Method(Boruta)
同じ条件で比較するために、特徴量選択で用いる分類機は、全てRandomForestClassifierを用いたいと思います。
1.Embedded Method(SelectFromModel)
まずは、基本的な機械学習の手順:①分類モデルで用いた、Embedded Methodを使います。
Embedded Methodは、特定のモデルに特徴量を組み込んで、最適な特徴量を選択します。
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
# numpy配列に変更
label = np.array(df.loc[0:, label_col])
features = np.array(df.loc[0:, feature_cols])
# 変数選択
clf = RandomForestClassifier(max_depth=7)
## Embedded Methodを用いて変数を選択
feat_selector = SelectFromModel(clf)
feat_selector.fit(features, label)
df_feat_selected = df.loc[0:, feature_cols].loc[0:, feat_selector.get_support()]
選ばれた変数は、36個。
これらの変数を用いて出た精度が次の通り。かなり高いですが、Recallが少し改善したいですね。
- Accuracy : 92%
- Precision : 99%
- Recall : 84%
2.Wrapper Method(RFE)
続いて、Wrapper Methodを用います。こちらは、特徴量の部分集合で予測モデルを回して、最適な部分集合を見つけるという手法です。
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFE
# numpy配列に変更
label = np.array(df.loc[0:, label_col])
features = np.array(df.loc[0:, feature_cols])
# 変数選択
clf = RandomForestClassifier(max_depth=7)
## Embedded Methodを用いて変数を選択
feat_selector = RFE(clf)
feat_selector.fit(features, label)
df_feat_selected = df.loc[0:, feature_cols].loc[0:, feat_selector.get_support()]
選ばれた変数は、146個。Embedded Methodに比べると、かなり多いです。
これらの変数を用いて出た精度が次の通り。小数点以下は多少違いまずが、Embedded Methodとほぼ同程度です。
- Accuracy : 92%
- Precision : 99%
- Recall : 84%
3.Wrapper Method(Boruta)
最後はBorutaです。Borutaは、Colaboratoryで標準インストールされていないので、まずはpip installします。
pip install boruta
こちらも、Wrapper Methodですので、最適な部分集合を見つけていきます。
ただ、先のRFEに比べて時間はかなり掛かります。進捗が出てるので、ゆっくりと待ちましょう。
from boruta import BorutaPy
# numpy配列に変更
label = np.array(df.loc[0:, label_col])
features = np.array(df.loc[0:, feature_cols])
# 変数選択
## ここでは分類を想定して、ランダムフォレスト(RandomForestClassifier)を用いる
clf = RandomForestRegressor(max_depth=7)
## Borutaを用いて変数を選択
feat_selector = BorutaPy(clf, n_estimators='auto', two_step=False, verbose=2, random_state=42)
feat_selector.fit(features, label)
df_feat_selected=df.loc[0:, feature_cols].loc[0:, feat_selector.support_]
選ばれた変数は、97個。
これらの変数を用いて出た精度が次の通り。変わらない。。。
- Accuracy : 92%
- Precision : 99%
- Recall : 84%
おわりに
本当は、変数の選択の仕方によって、精度が結構変わっていく!という結果にしたかったのですが、残念ながらほぼ同程度の結果になりました。(サンプルにしたデータがいけなかったかな)
今回は、3種類だけを比較しましたが、先にも参照させていただいた特徴量選択のまとめでは、Wrapper MethodのStep ForwardやStep backwardなど、今回試せていない手法もあるので、今後試していきたいと思います。
2/26追記
特徴量選択のまとめを参考に、Wrapper MethodのStep ForwardやStep backwardを試してみましたが、遅い。というか終わらない。
特徴量が300とそれなりに多いせいかもしれませんし、Colabのパワーのせいかもしれませんが、特徴量を足していく・引いていく手法は、実際に使うのは難しいんですかね。
それ以外でも、特徴量選択の自動化フレームワークのOptunaといったものもあるらしく、特徴量の選択と一言で言っても色々あって勉強になります。