特徴量選択の手法
フィルタ法(分散、相関)、ラッパー法(RFE)、組み込み法(L1 正則化)を扱います。
「特徴量選択の手法」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
特徴量を選択する理由
特徴量選択では、最も有用な列だけを残します。特徴量が少ないほど、学習が速くなり、過学習が抑えられ、解釈もしやすくなります。ノイズを取り除くことで、精度が向上する場合もあります。
3種類の手法
選択手法は次の3つのグループに分けられます:
- フィルタ法:統計量で特徴量を順位付けします(高速で、モデルに依存しません)
- ラッパー法:モデルを学習して部分集合を探索します(低速ですが高精度です)
- 組み込み法:モデルのフィッティング中に選択します
VarianceThreshold
最も単純なフィルタ法です。VarianceThresholdは、分散がしきい値を下回る特徴量を削除します。ほぼ定数の列には情報がありません。
from sklearn.feature_selection import VarianceThreshold
sel = VarianceThreshold(threshold=0.01)
X_reduced = sel.fit_transform(X)
print("Kept:", X_reduced.shape[1], "of", X.shape[1])f_classifを使ったSelectKBest
SelectKBestは、スコアが最も高いK個の特徴量を残します。f_classifを使うと、各特徴量とクラスラベルの関連の強さを測定するANOVAのF検定を使用します。
from sklearn.feature_selection import SelectKBest, f_classif
sel = SelectKBest(score_func=f_classif, k=10)
X_best = sel.fit_transform(X, y)
print(sel.get_support(indices=True))相互情報量
mutual_info_classifは、特徴量とターゲットの間にあるあらゆる依存関係(非線形なものを含む)を測定します。F検定とは異なり、ANOVAでは捉えられない非線形の関係も捉えられます。
from sklearn.feature_selection import SelectKBest, mutual_info_classif
sel = SelectKBest(score_func=mutual_info_classif, k=10)
X_mi = sel.fit_transform(X, y)f_classifとmutual_infoの比較
f_classifは高速で線形関係を検出します。一方、mutual_info_classifは低速ですが、非線形の関係も捉えます。複雑な関係が疑われる場合は、相互情報量を優先します。
import numpy as np
from sklearn.feature_selection import f_classif, mutual_info_classif
f_scores, _ = f_classif(X, y)
mi_scores = mutual_info_classif(X, y)
print("F-test top:", np.argsort(f_scores)[::-1][:5])
print("MI top:", np.argsort(mi_scores)[::-1][:5])再帰的特徴量削減
RFEはラッパー法の一つです。モデルを学習し、最も弱い特徴量を削除する処理を繰り返します。特徴量の順位付けには、モデル自身が持つ重要度の情報を使います。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
rfe = RFE(estimator=LogisticRegression(max_iter=1000), n_features_to_select=10)
rfe.fit(X, y)
print(rfe.support_)RFECV:個数を自動的に選択
RFECVはRFEに交差検証を追加し、固定値を指定するのではなく、検証スコアに基づいて最適な特徴量の個数を見つけます。
from sklearn.feature_selection import RFECV
from sklearn.ensemble import RandomForestClassifier
rfecv = RFECV(
estimator=RandomForestClassifier(),
cv=5,
scoring="accuracy",
)
rfecv.fit(X, y)
print("Optimal features:", rfecv.n_features_)Lassoを使ったSelectFromModel
組み込み法では、Lasso(L1)が重要でない係数を正確にゼロまで縮小します。その後、SelectFromModelがゼロでない係数に対応する特徴量だけを残します。
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import Lasso
sel = SelectFromModel(Lasso(alpha=0.01))
sel.fit(X, y)
X_lasso = sel.transform(X)
print("Kept:", X_lasso.shape[1])木の重要度を使ったSelectFromModel
SelectFromModelは、ランダムフォレストなど、feature_importances_を公開する任意の推定器でも使えます。"mean"や"median"などのthresholdを設定します。
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
sel = SelectFromModel(
RandomForestClassifier(n_estimators=200),
threshold="median",
)
sel.fit(X, y)手法の選び方
まずは低コストなフィルタ法(VarianceThreshold、SelectKBest)で明らかに不要な特徴量を削除します。バランスの良い方法として、組み込み法のSelectFromModelを使います。精度を最優先し、計算量にも余裕がある場合はRFECVを使います。
確認問題
特徴量選択についての知識を確認しましょう。
まとめ
まとめ: 特徴量選択には、フィルタ法(VarianceThreshold、SelectKBestとf_classifまたはmutual_info_classif)、ラッパー法(RFECV)、組み込み法(Lassoや木の重要度を使うSelectFromModel)があります。フィルタ法が最も高速で、RFECVが最も高精度です。非線形の関係には相互情報量を使います。
よくある質問
「特徴量選択の手法」レッスンは無料ですか?
はい。「特徴量選択の手法」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「特徴量選択の手法」で何を学びますか?
フィルタ法(分散、相関)、ラッパー法(RFE)、組み込み法(L1 正則化)を扱います。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「特徴量選択の手法」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。