分散(variance)が小さい特徴量の削除
分散がかなり小さい場合、その特徴量は一定に近いため、どのモデルに対しても特徴量として加える価値がない(まあ、当たり前)。scikit-learnに実装されているVarianceThreshold
で実現できる。
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
# データフレームの作成
data = pd.DataFrame([[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]],
columns=['col_0', 'col_1', 'col_2'])
sel = VarianceThreshold(threshold=(0.8 * (1 - 0.8))) # threshold: 閾値
sel.fit_transform(data)
mask = sel.get_support() # 各特徴量を選択したかどうか(True/False)
print(data.columns) # Index(['col_0', 'col_1', 'col_2'], dtype='object')
print(mask) # [False True True]
相関の高い特徴量を削除
異なる量的変数間の相関を計算するには、ピアソンの相関係数(Pearson correlation)やスピアマンの順位相関係数が使える。相関係数はnumpyのcorrcoef()
関数、スピアマンの順位相関係数はscipy.statsモジュールのspearmanr()
関数が使える。pandasのcorr()
関数を使う方法も便利である。
単変量特徴量選択(univariate feature selection)
単変量特徴量選択とは、与えられた目的変数の情報を用いて各特徴量を評価することである。相互情報量(Mutual information)、分散分析(ANOVA F-test)、カイ二乗検定(chi2) などが最も一般的な方法である。scikit-learnで使用するには2つの方法がある。
sklearn.feature_selection.SelectKBest
:上位k個の特徴量を保持。
公式チュートリアル
sklearn.feature_selection.SelectPercentile
:ユーザが指定した割合で上位の特徴量を保持。
公式チュートリアル
カイ二乗検定を使用できるのは、非負の性質をもつデータに限られる。
貪欲法(greedy feature selection)
最初にモデル・損失・評価指標を選択する。また、「有望な特徴量」の空のリストを作成しておく。その後、各特徴量を繰り返し評価し、損失や評価指標が改善された場合に「有望な特徴量」のリストに追加していく。この手法では、特徴量を評価するたびにモデルを学習する。そのため、計算量が大きくなり、特徴量選択に時間がかかる。
再帰的特徴量削減(recursive feature elimination, RFE)
すべての特徴量から始めて、反復するたびにモデルに最も寄与しない特徴量を1つずつ削除していく。各反復で特徴量の重要度が小さく、係数が0に近い特徴量を除去する。ロジスティック回帰のようなモデルを二値分類に使用する場合、特徴量の係数は正のクラスにとって重要であれば正、負のクラスにとって重要であれば負の値になる。scikit-learnで提供されているsklearn.feature_selection.RFE
で実装が利用できる。
sklearn.feature_selection.RFE
:公式チュートリアル
組み込み法(モデルベース)
モデルから出力される特徴量の係数や重要度を用いて一挙に特徴量を選ぶことができる。ランダムフォレスト・XGBoost・LightGBM・CatBoostのようなモデルから特徴量の重要度を可視化し、選択することができる。scikit-learnにはSelectFromModel
クラスがあり、与えられたモデルで直接特徴量を選べる。
sklearn.feature_selection.SelectFromModel
:公式チュートリアル
L1(Lasso)罰則項付きモデルを使った特徴量選択
正規化にL1罰則項を用いた場合、ほとんどの係数は0(または0に近い値)となり、0ではない係数を持つ特徴量を選択する。
参考
scikit-learn: Feature selection
Kaggleで勝つデータ分析の技術
Kaggle Grandmasterに学ぶ機械学習 実践アプローチ