2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

基本的な機械学習の手順:③特徴量の選択方法を比較検討する

Last updated at Posted at 2020-02-23

はじめに

基本的な機械学習の手順:①分類モデルでは、基本的な分類モデルの作成手順を整理しています。
今回は、その中で特徴量の選択にフォーカスして、様々な特徴量の選択方法を比較検討してみたいと思います。

これまでの手順

分析環境

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といったものもあるらしく、特徴量の選択と一言で言っても色々あって勉強になります。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?