はじめに
特徴選択は機械学習における重要なステップです。これは、データセットから最も関連性の高い特徴を選択して、モデルの精度と性能を向上させることを含みます。scikit-learn では、sklearn.feature_selection モジュールが特徴選択と次元削減のためのさまざまな方法を提供しています。
この実験では、scikit-learn を使った特徴選択のプロセスを案内します。分散の低い特徴の削除、単変量特徴選択、再帰的特徴削除、および SelectFromModel を使った特徴選択などの手法を扱います。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替えて、Jupyter Notebook を使った練習にアクセスします。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
分散の低い特徴の削除
scikit-learn の VarianceThreshold クラスを使って、分散の低い特徴を削除することができます。分散の低い特徴は、通常、モデルにとってあまり情報を提供しません。ここでは、VarianceThreshold を使ってゼロ分散の特徴を削除する方法を示します。
from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
## 分散の 80% の閾値で VarianceThreshold を初期化
sel = VarianceThreshold(threshold=(.8 * (1 -.8)))
## 高い分散を持つ特徴を選択
X_selected = sel.fit_transform(X)
print("元の X の形状:", X.shape)
print("選択された特徴を持つ X の形状:", X_selected.shape)
print("選択された特徴:", sel.get_support(indices=True))
このコード スニペットは、データセットからゼロ分散の特徴を削除するために VarianceThreshold をどのように使うかを示しています。出力には、データセットの元の形状と、高い分散を持つ特徴を選択した後の形状が表示されます。
単変量特徴選択
単変量特徴選択は、単変量統計検定に基づいて最適な特徴を選択することによって機能します。scikit-learn には、単変量特徴選択を実装するいくつかのクラスがあります。
SelectKBest:上位 k 個の最も高いスコアを持つ特徴を選択しますSelectPercentile:ユーザ指定の割合の最も高いスコアを持つ特徴を選択しますSelectFpr:偽陽性率に基づいて特徴を選択しますSelectFdr:偽発見率に基づいて特徴を選択しますSelectFwe:家族全体の誤差に基づいて特徴を選択しますGenericUnivariateSelect:構成可能な戦略を使った選択を可能にします
ここでは、Iris データセットから 2 つの最適な特徴を選択するために SelectKBest を使う例を示します。
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
## Iris データセットを読み込む
X, y = load_iris(return_X_y=True)
## f_classif スコア関数と k=2 で SelectKBest を初期化する
selector = SelectKBest(f_classif, k=2)
## 最適な特徴を選択する
X_selected = selector.fit_transform(X, y)
print("元の X の形状:", X.shape)
print("選択された特徴を持つ X の形状:", X_selected.shape)
print("選択された特徴:", selector.get_support(indices=True))
この例では、f_classif スコア関数を使って、Iris データセットから 2 つの最適な特徴を選択します。出力には、データセットの元の形状と、最適な特徴を選択した後の形状が表示されます。
再帰的特徴削除
再帰的特徴削除 (RFE) は、最も重要な特徴を選択するために、徐々に小さくなる特徴のセットを再帰的に考慮する特徴選択方法です。これは、特徴に割り当てられた重み付きで外部推定器を訓練し、最も重要でない特徴を削除することによって機能します。
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import RFE
## Iris データセットを読み込む
X, y = load_iris(return_X_y=True)
## 外部推定器として SVC を初期化する
estimator = SVC(kernel="linear")
## 外部推定器と 2 つの特徴を選択するように RFE を初期化する
selector = RFE(estimator, n_features_to_select=2)
## 最適な特徴を選択する
X_selected = selector.fit_transform(X, y)
print("元の X の形状:", X.shape)
print("選択された特徴を持つ X の形状:", X_selected.shape)
print("選択された特徴:", selector.get_support(indices=True))
この例では、外部推定器としてサポートベクトル分類器 (SVC) を使って、Iris データセットから 2 つの最適な特徴を選択します。出力には、データセットの元の形状と、最適な特徴を選択した後の形状が表示されます。
SelectFromModel を使った特徴選択
SelectFromModel クラスは、各特徴に重要度を割り当てる任意の推定器とともに使用できるメタ変換器です。これは、特徴の重要度に基づいて特徴を選択し、指定された閾値未満の特徴を削除します。
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
## Iris データセットを読み込む
X, y = load_iris(return_X_y=True)
## 推定器として RandomForestClassifier を初期化する
estimator = RandomForestClassifier()
## 推定器と "mean" の閾値で SelectFromModel を初期化する
selector = SelectFromModel(estimator, threshold="mean")
## 最適な特徴を選択する
X_selected = selector.fit_transform(X, y)
print("元の X の形状:", X.shape)
print("選択された特徴を持つ X の形状:", X_selected.shape)
print("選択された特徴:", selector.get_support(indices=True))
この例では、推定器としてランダムフォレスト分類器を使用し、平均重要度よりも高い重要度を持つ特徴を選択します。出力には、データセットの元の形状と、最適な特徴を選択した後の形状が表示されます。
まとめ
機械学習において、モデルの精度と性能を向上させるために、特徴選択は不可欠なステップです。この実験では、分散の低い特徴の削除、単変量特徴選択、再帰的特徴削除、および SelectFromModel を使った特徴選択など、様々な手法を扱いました。これらの手法は、最も関連性の高い特徴を選択し、データセットの次元数を削減することで、モデルの性能を向上させます。