8
7

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 1 year has passed since last update.

特徴量の選択について勉強したことをまとめてみた

Last updated at Posted at 2022-02-21

分散(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:ユーザが指定した割合で上位の特徴量を保持。
公式チュートリアル

カイ二乗検定を使用できるのは、非負の性質をもつデータに限られる。

scikit-learnで単変量特徴量選択をやってみた

貪欲法(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に学ぶ機械学習 実践アプローチ

8
7
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
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?