Python
機械学習
MachineLearning
scikit-learn

sklearn.feature_selection による特徴量選択

More than 1 year has passed since last update.

単変量統計

各説明変数と目的変数との間の関係を計算し、最も高い確信度で関連している特徴量を選択する。

SelectKBest

説明変数のうち上位k個を選択する。通常、引数 score_func は分類では f_classif(デフォルト値)、回帰では f_regression を指定する。引数 k に選択する特徴量の数を指定する。

from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest, f_regression

boston = load_boston()
X = boston.data
y = boston.target

# 5つの特徴量を選択
selector = SelectKBest(score_func=f_regression, k=5) 
selector.fit(X, y)
mask = selector.get_support()    # 各特徴量を選択したか否かのmaskを取得
print(boston.feature_names)
print(mask)

# 選択した特徴量の列のみ取得
X_selected = selector.transform(X)
print("X.shape={}, X_selected.shape={}".format(X.shape, X_selected.shape))

出力

['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
[False False  True False False  True False False False  True  True False
  True]
X.shape=(506, 13), X_selected.shape=(506, 5)

SelectPercentile

説明変数のうち上位k個を選択する。通常、引数 score_func は分類では f_classif(デフォルト値)、回帰では f_regression を指定する。引数 percentile に選択する特徴量の割合(0~100)を指定する。

from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectPercentile, f_regression

boston = load_boston()
X = boston.data
y = boston.target

# 特徴量のうち40%を選択
selector = SelectPercentile(score_func=f_regression, percentile=40) 
selector.fit(X, y)
mask = selector.get_support()
print(boston.feature_names)
print(mask)

# 選択した特徴量の列のみ取得
X_selected = selector.transform(X)
print("X.shape={}, X_selected.shape={}".format(X.shape, X_selected.shape))

出力

['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
[False False  True False False  True False False False  True  True False
  True]
X.shape=(506, 13), X_selected.shape=(506, 5)

GenericUnivariateSelect

mode でモード(‘percentile’, ‘k_best’, ‘fpr’, ‘fdr’, ‘fwe’) 、param で各モードのパラメータを設定する。
例えば、

selector = GenericUnivariateSelect(mode='percentile', score_func=f_regression, param=40)

selector = SelectPercentile(score_func=f_regression, percentile=40) 

は同値である。

モデルベース特徴量選択

モデルで得られる特徴量の重要性をあらわした feature_importances_ 属性を利用して特徴量を選択する。

SelectFromModel

引数には estimator、および閾値 threshold を指定する。

from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestRegressor

boston = load_boston()
X = boston.data
y = boston.target

# estimator として RandomForestRegressor を使用。重要度が median 以上のものを選択
selector = SelectFromModel(RandomForestRegressor(n_estimators=100, random_state=42), threshold="median")    
selector.fit(X, y)
mask = selector.get_support()
print(boston.feature_names)
print(mask)

# 選択した特徴量の列のみ取得
X_selected = selector.transform(X)
print("X.shape={}, X_selected.shape={}".format(X.shape, X_selected.shape))

出力

['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
[ True False False False  True  True False  True False  True  True False
  True]
X.shape=(506, 13), X_selected.shape=(506, 7)

反復特徴量選択

まったく特徴量を使わないところから、ある基準が満たされるまで1つずつ重要度が高い特徴量を加えていく、もしくは、すべての特徴量を使う状態から1つずつ特徴量を取り除いていくという操作を繰り返すことで特徴量を選択する。

RFE

RFE(Recursive Feature Elimination; 再帰的特徴量削減)は、すべての特徴量から開始してモデルを作り、そのモデルで最も重要度が低い特徴量を削除する。そしてまたモデルを作り、最も重要度が低い特徴量を削除する。この過程を事前に定めた数の特徴量になるまで繰り返す、という手法である。

引数には estimator、および特徴量の数 n_features_to_select を指定する。

(特徴量数 - n_features_to_select) 回、モデル作成=>特徴量削除 が行われるので処理時間がかかる。

from sklearn.datasets import load_boston
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestRegressor

boston = load_boston()
X = boston.data
y = boston.target

# estimator として RandomForestRegressor を使用。特徴量を5個選択
selector = RFE(RandomForestRegressor(n_estimators=100, random_state=42), n_features_to_select=5)
selector.fit(X, y)
mask = select.get_support()
print(boston.feature_names)
print(mask)

# 選択した特徴量の列のみ取得
X_selected = selector.transform(X)
print("X.shape={}, X_selected.shape={}".format(X.shape, X_selected.shape))

出力

['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
[ True False False False  True  True False  True False False False False
  True]
X.shape=(506, 13), X_selected.shape=(506, 5)

参考