機械学習における特徴選択の3つの代替手法

機械学習における特徴選択の3つの代替手法

ソレダッド・ガリ

翻訳者:趙青棠

企画丨孫淑娇、梁策

インターネットで「特徴選択」を検索してみると、特徴選択を「フィルター方式」「ラッパー方式」「埋め込み方式」の 3 種類にまとめた記事が多数見つかります。

「フィルター方法」では、特徴分布に基づいて特徴選択を実行する統計テスト方法を使用します。この方法は計算的には非常に高速ですが、実際にはモデルに最適な特徴を選択しません。さらに、データセットが大きい場合、統計テストの p 値は非常に小さくなる傾向があり、分布における重要ではない小さな有意差が拡大されてしまいます。

「ラッパー メソッド」カテゴリには、前方検索、後方検索、または網羅的検索に基づいて、すべての可能な機能の組み合わせを試す貪欲アルゴリズムが含まれます。各機能の組み合わせに対して、通常、クロス検証を使用して機械学習モデルをトレーニングし、モデルのパフォーマンスを正確に測定します。したがって、ラッピング方法は計算コストが高く、実装が困難な場合が多くあります。

一方、組み込みメソッドは、単一の機械学習モデルをトレーニングし、モデルによって返される特徴の重要度に基づいて特徴選択を実行します。これらは実際には非常にうまく機能し、計算もはるかに高速です。ただし、この方法には主に 3 つの欠点があります。

  1. すべての機械学習モデルから特徴の重要度値を導き出すことはできません。
  2. 共線性は、線形モデルによって返される係数値、または決定木ベースのアルゴリズムによって返される有意値に影響を及ぼし、それらの真の重要性を隠す可能性があります。
  3. 決定木ベースのアルゴリズムは、非常に大きな特徴空間ではうまく機能しない可能性があり、そのため、その重要度の値は信頼できない可能性があります。

フィルター メソッドはわかりにくく、実際にはあまり使用されません。ラッパー メソッドは計算コストが高く、実装が不可能な場合が多く、埋め込みメソッドはすべてのシナリオやすべての機械学習モデルに適用できるわけではありません。では、他にどのようにして予測機能を選択できるでしょうか?

幸いなことに、教師あり学習用の特徴を選択する方法は他にもあります。この記事では、モデルのパフォーマンスに基づいて特徴を選択するためのアルゴリズムを 3 つ詳しく紹介します。これらはラッピング法と埋め込み法の両方の特徴を備えているため、「ハイブリッド法」と呼ばれることもあります。これらの中には、複数のトレーニング済み機械学習モデルに依存するため、ラッピング法に少し似ているものもあります。一部の選択手順は、埋め込み方法のように、特徴の重要性に依存します。

機能選択の代替案 ✦

これらの方法は、業界やデータ サイエンスのコンテストで効果的に適用されており、特定のマシン モデルをトレーニングして特徴予測を実行するための方法を提供しています。

この記事では、これらの特徴選択方法のいくつかのロジックとフローを紹介し、オープンソース ライブラリ Feature-engine を使用して Python でそれらを実装する方法を示します。

ここでは、次の 3 つの特徴選択方法について説明します。

  • 機能の再配置
  • 特徴的なパフォーマンス
  • 目標平均パフォーマンス

機能の再配置 ✦

特徴シャッフルは、順列特徴重要度とも呼ばれ、モデルのパフォーマンス スコアの降順で単一の特徴を並べ替えることを指します。特徴値の順序(データセットの行内)を変更すると、特徴とターゲット間の元の関係が変わり、モデルのパフォーマンス スコアの降順は、モデルがその特徴にどの程度依存しているかを示します。

具体的なプロセスは以下のとおりです。

  1. 機械学習モデルをトレーニングし、そのパフォーマンスを判断します。
  2. 並べ替える機能を選択します。
  3. ステップ 1 でトレーニングしたモデルを使用して予測を行い、ステップ 2 で選択した機能のパフォーマンス値を取得します。
  4. ステップ 3 で取得した機能のパフォーマンス値がしきい値より低い場合、機能は保持され、それ以外の場合は機能が削除されます。
  5. すべての機能が検査されるまで、手順 2 から繰り返します。

機能を変換して選択することにはいくつかの利点があります。まず、機械学習モデルをトレーニングし、機械学習モデルを使用して特徴値を再配置するだけで済みます。次に、教師あり機械学習モデルの機能を選択できます。 3 つ目は、この選択プロセスを実装するためにオープンソースを使用することができ、具体的な方法については次の段落で紹介します。

アドバンテージ:

  1. トレーニングされる機械学習モデルは 1 つだけなので、非常に高速です。
  2. あらゆる教師あり機械学習モデルに適用可能です。
  3. Python オープンソース ライブラリ Feature-engine を使用できます。

欠点は、2 つの特徴が相関している場合、特徴の 1 つが乱れても、機械学習モデルは相関変数を通じて対応する情報を取得できるため、相関する両方の特徴が実際には重要であるにもかかわらず、その重要度の値が低くなる可能性があることです。さらに、特徴を選択するには、その値を下回る特徴が削除される有意性しきい値を定義する必要があります。しきい値が高くなるほど、選択される機能は少なくなります。最後に、特徴シャッフルによってランダム要素が導入されるため、重要度の値がしきい値に近い特徴の場合、アルゴリズムの異なる実行によって異なる特徴のサブセットが返される可能性があります。

注記:

  1. 相関関係の性質は、特徴の重要性の解釈に影響を与える可能性があります。
  2. ユーザーはしきい値を定義する必要があります。
  3. ランダム性の要素により、選択プロセスに不確実性が生じます。

これを念頭に置くと、特徴の順列はモデルのパフォーマンスに直接影響を与える変数を強調表示し、特徴の選択に最適な方法です。Scikit-learn を使用して順列の重要度を手動で導き出し、重要度が特定のしきい値を超える変数を選択できます。あるいは、Feature-engine を使用してプロセス全体を自動化することもできます。

Python実装✦

Feature エンジンを使用して、特徴の再配置による選択を実行する方法を見てみましょう。 Scikit-learn に付属する糖尿病データセットを選択します。まず、データをロードします。

 pandasをpd としてインポートする
sklearn.datasets からload_diabetes をインポートします
sklearn.linear_model からLinearRegression をインポートします
feature_engine.selection からSelectByShuffling をインポートします

# データセットをロード
diabetes_X diabetes_y = load_diabetes ( return_X_y = True )
X = pd .DataFrame (糖尿病_X )
y = pd .DataFrame (糖尿病_y )

次に、目的の機械学習モデルを構築します。

 # 線形回帰推定器を初期化する
linear_model =線形回帰( )

スコアリング = ''r2'' ドロップに基づく特徴選択には、3 フォールド交差検証を使用します。

 # 機能セレクタを初期化する
tr = SelectByShuffling (推定値= linear_model スコアリング= "r2" cv = 3 )

トランスフォーマーは fit() メソッドを使用して重要な変数 (つまり、再シャッフル時に r2 が減少する変数) を見つけます。デフォルトでは、パフォーマンスの低下がすべての機能によって生じる平均の低下よりも大きい場合に機能が選択されます。

 # フィットトランス
tr .fit ( X , y )

transform() メソッドを使用して、データセットから選択されていない機能を削除します。

 Xt = tr .transform ( X )

トランスフォーマーの属性を通じて各機能の重要性を照会できます。

 tr . パフォーマンスドリフト_

{ 0 : - 0.02368121940502793
1 : 0.017909161264480666 ,
2 : 0.18565460365508413 ,
3 : 0.07655405817715671 ,
4 : 0.4327180164470878 ,
5 : 0.16394693824418372 ,
6 : - 0.012876023845921625 ,
7 : 0.01048781540981647 ,
8 : 0.3921465005640224 ,
9 : - 0.01427065640301245 }

削除される機能の名前には、別の属性を通じてアクセスできます。

 tr .削除する機能

[ 0 , 1 , 3 , 6 , 7 , 9 ]

これで、Xt のデータ フレームが縮小されました。

特徴 ✦

特徴の重要性を判断する最も簡単な方法は、その特徴のみを使用して機械学習モデルをトレーニングすることです。この場合、機能の「重要度」はモデルのパフォーマンス スコアによって決まります。言い換えれば、単一の特徴に基づいてトレーニングされたモデルがターゲットを予測する際にどれだけ効果的であるかということです。パフォーマンス スコアが低い場合、機能が弱いか予測不可能であることを示します。

プロセスは次のとおりです。

  1. 各機能に対して機械学習モデルをトレーニングします。
  2. 各モデルについて、ターゲット予測が行われ、モデルのパフォーマンスが決定されます。
  3. パフォーマンス インデックスがしきい値を超える機能を選択します。

この選択プロセス中に、各機能に対して機械学習モデルをトレーニングします。モデルは単一の特徴を使用してターゲット変数を予測します。次に、クロス検証を使用してモデルのパフォーマンスを計算し、最終的にパフォーマンスが設定されたしきい値を超える機能が選択されます。

一方、この方法では、トレーニングする必要のあるモデルの数が多く、同じデータセット内の特徴の数が多いため、計算コストが高くなります。一方、単一の特徴でトレーニングされたモデルは非常に高速になる傾向があります。

このアプローチを使用すると、パフォーマンス メトリックによって重要度が決定されるため、関心のある機能のモデルを学習できます。欠点は、特徴選択のためのしきい値を提供する必要があることです。しきい値が高くなるほど、選択される機能グループの数は少なくなります。いくつかのしきい値は非常に直感的です。たとえば、パフォーマンス メトリックが roc-auc の場合、パフォーマンスが 0.5 を超える機能を選択できます。精度などの他の指標については、合理的なしきい値が何であるかは明確ではありません。

アドバンテージ:

  1. あらゆる教師あり機械学習モデルに適用可能です。
  2. 機能を個別に調査できるため、相関の問題を回避できます。
  3. Python オープンソース プロジェクト Feature-engine を使用できます。

注記:

  1. 各機能ごとにモデルをトレーニングするには、計算コストがかかります。
  2. ユーザーはしきい値をカスタマイズする必要があります。
  3. 関連する機能を識別できません。

Feature-engine を使用して、単一の機能のパフォーマンスを選択できます。

Python実装✦

Scikit-learn から糖尿病データセットを読み込みます。

 pandasをpd としてインポートする
sklearn.datasets からload_diabetes をインポートします
sklearn.linear_model からLinearRegression をインポートします
feature_engine.selection からSelectBySingleFeaturePerformance をインポートします

# データセットをロード
diabetes_X diabetes_y = load_diabetes ( return_X_y = True )
X = pd .DataFrame (糖尿病_X )
y = pd .DataFrame (糖尿病_y )

線形回帰と3倍交差検証を使用して、r2 > 0.01の特徴が選択されました。

 # 機能セレクタを初期化する
sel =単一機能パフォーマンスによる選択(
推定量= LinearRegression ( ) スコアリング= "r2" CV = 3 しきい値= 0.01 )

トランスフォーマーは fit() メソッドを使用して各機能にモデルを適合させ、そのパフォーマンスを計算し、重要な機能を選択します。

 # フィットトランス
sel.fit ( X , y )を使います。
破棄される機能を見てみましょう:

破棄される機能を見てみましょう。

 削除するフィーチャを選択

[ 1 ]

各機能のパフォーマンスを確認することもできます。

 sel .feature_performance_

{ 0 : 0.029231969375784466
1 : - 0.003738551760264386 ,
2 : 0.336620809987693 ,
3 : 0.19219056680145055 ,
4 : 0.037115559827549806 ,
5 : 0.017854228256932614 ,
6 : 0.15153886177526896 ,
7 : 0.17721609966501747 ,
8 : 0.3149462084418813 ,
9 : 0.13876602125792703 }

transform() メソッドを使用して、データセットから特徴を削除します。

 # 変数をドロップする
Xt = sel.transform ( X )

このようにして、データセットが縮小されます。

目標平均パフォーマンス✦

これから説明する選択方法は、KDD 2009 データ サイエンス コンペティションでミラー氏とその同僚によって導入されました。著者はこの手法に名前を付けていませんが、各データ グループの平均ターゲット値を予測子として使用するため、私はこの手法を「ターゲット平均パフォーマンス選択」と呼ぶことにします。

この選択方法では、各機能に「重要度」の値も割り当てられます。この重要度の値は、パフォーマンス指標に基づいて決定されます。興味深いことに、このモデルは機械学習モデルをトレーニングしません。代わりに、非常に単純な指標値を使用して予測を行います。

つまり、この選択方法では、各カテゴリまたは各間隔 (変数が連続している場合) の平均ターゲット値を予測子として使用します。この予測から、r2、精度、または事実に対して予測を評価するその他のメトリックなどのパフォーマンス メトリックを取得できます。

では、この選択方法はどのように機能するのでしょうか?

カテゴリ変数の場合:

  1. データ フレームをトレーニング セットとテスト セットに分割します。
  2. 各カテゴリ項目について、各項目の平均目標値を計算します (トレーニング セットを使用)。
  3. テスト セット内の各カテゴリ項目を、そのカテゴリの目標平均に置き換えます。
  4. パフォーマンス メトリックは、エンコードされた機能とターゲット値 (テスト セット内) を使用して計算されます。
  5. パフォーマンスがしきい値を超える機能を選択します。

各カテゴリ項目について、トレーニング セットに基づいて各カテゴリのターゲットの平均が決定されます。次に、テスト セット内の各カテゴリ項目が、学習したばかりのターゲット平均に置き換えられ、これらの値を使用してパフォーマンス メトリックが決定されます。

連続変数の場合、プロセスはカテゴリ変数の場合と同様です。

  1. データ フレームをトレーニング セットとテスト セットに分割します。
  2. 連続的な特徴ごとに、値を個別のビンに分類します (このステップではトレーニング セットを使用します)。
  3. 各間隔の平均目標値を決定します (トレーニング セットを使用)。
  4. ステップ 2 で適切な間隔に従ってテスト セット内の変数をグループ化して並べ替えます。
  5. テスト セットの対応する間隔の値を、対応する間隔の目標平均に置き換えます。
  6. テスト セットの場合、指定されたエンコード機能とターゲットを使用してパフォーマンス メトリックが計算されます。
  7. パフォーマンスがしきい値を超える機能を選択します。

連続変数の場合、著者はまずすべての項目を異なるグループに分割します。このプロセスは離散化とも呼ばれます。彼らは 1% の分位値を使用し、トレーニング セット内の各グループの目標平均を計算し、テスト セット内の対応する間隔の値を対応する間隔の目標平均に置き換えて、パフォーマンスを評価しました。

この機能選択方法は非常にシンプルで、各ビン(クラスまたは間隔)の平均を計算し、これらの値を使用してパフォーマンス メトリックを取得します。シンプルですが、多くの利点があります。

まず、機械学習モデルのトレーニングを必要としないため、計算が非常に高速です。 2 番目に、ターゲットとの非線形関係をキャプチャできます。 3 番目に、既存のほとんどの選択アルゴリズムとは異なり、カテゴリ変数に対して機能します。これは外れ値の処理にも適用され、これらの極端な値は極端なグループに割り当てられます。著者によれば、この方法はカテゴリ変数または数値変数に対して比較的客観的なパフォーマンスを提供できるという。また、モデルとは一切関係ありません。理論的には、このように選択された特徴は、あらゆる機械学習モデルに適用できるはずです。

アドバンテージ:

  1. 機械学習モデルをトレーニングする必要がないため、速度が速くなります。
  2. カテゴリ変数と数値変数の両方に適用可能です。
  3. 異常な状況に対処できます。
  4. 特徴とターゲット間の非線形関係を捉えることができます。
  5. モデルによる制限はありません。

この選択方法にもいくつかの制限があります。まず、連続変数の場合、ユーザーは値を並べ替えるために任意の数の間隔を定義する必要があります。これは、歪んだ変数データの大部分が同じグループにのみ属する可能性がある歪んだ変数に対して問題を引き起こします。第二に、ラベル付け頻度の低いカテゴリ変数は、これらのカテゴリのデータが少なく、そのようなカテゴリの平均目標値が信頼できないため、信頼できない結果につながる可能性があります。極端な場合、トレーニング セットにクラスが存在しない場合は、パフォーマンスを計算するための平均ターゲット値を取得できません。

注記:

  1. 歪んだ変数の間隔の数を調整する必要があります。
  2. まれなクラスは、信頼性の低いパフォーマンス指標を提供する可能性があり、この方法には適さない可能性があります。

これらの要素を考慮すると、Feature-engine を使用して、目標平均パフォーマンスに基づいて変数を選択できます。

Python実装✦

このアプローチを使用して、数値変数とカテゴリ変数が混在するタイタニック データセットから変数を選択します。データをロードするときに、デモンストレーションの目的で前処理を行ってから、トレーニング セットとテスト セットに分割します。

 pandasをpd としてインポートする
numpyをnp としてインポートする
sklearn.model_selection からtrain_test_split をインポートします
sklearn.metrics からroc_auc_scoreをインポートします
feature_engine.selection からSelectByTargetMeanPerformance をインポートします

# データを読み込む
データ= pd .read_csv ( 'https://www.openml.org/data/get_csv/16826755/phpMYEkMl' )


# キャビンレターを抽出
データ[ 'キャビン' ] =データ[ 'キャビン' ] .str [ 0 ]

# 使用頻度の低いキャビンをN 置き換える
data [ 'キャビン' ] = np.where ( data [ 'キャビン' ] .isin ( [ 'T' , 'G' ] ) , 'N' , data [ 'キャビン' ] )

# 最大を制限する
データ[ 'parch' ] = np .where (データ[ 'parch' ] > 3 , 3 ,データ[ 'parch' ] )
データ[ 'sibsp' ] = np .where (データ[ 'sibsp' ] > 3 , 3 ,データ[ 'sibsp' ] )

# 変数をオブジェクトとしてキャストしてカテゴリとして扱う
データ[ [ 'pclass' , 'sibsp' , 'parch' ] ] =データ[ [ 'pclass' , 'sibsp' , 'parch' ] ] .astype ( 'O' )

# トレーニングセットテストセットを分ける
X_train X_test y_train y_test = train_test_split (
データ.drop ( [ '生き残った' ] , axis = 1 ) ,
データ[ '生き残った' ]
テストサイズ= 0.3
ランダム状態= 0 )

roc-auc に基づく特徴選択には 2 段階交差検証を使用します。最初に注目すべき点は、Feature-engine を使用すると相互検証を使用できることです。これは、著者が説明した元のアプローチよりも改善されています。

Feature-engine を使用すると、数値変数の間隔を決定する方法も決定できます。等頻度または等幅の間隔を選択できます。著者らは 1% の分位値を使用しましたが、これは値が適切に分布している連続変数には適していますが、歪んだ変数には一般的に不適切です。この例では、数値変数を等しい頻度間隔に分割します。最後に、roc-auc が 0.6 より大きい特徴を選択します。

 # 機能-エンジンが選択を自動化
# カテゴリ変数数値変数

sel =ターゲット平均パフォーマンスで選択(
変数=なし
スコアリング= "roc_auc_score"
閾値= 0.6
ビン= 3
戦略= "equal_frequency"
cv = 2 # クロス検証
random_state = 1 # 再現性のためのシード

fit() メソッドを使用すると、トランスフォーマーは次のことが可能になります。

  1. カテゴリを目標平均値に置き換える
  2. 数値変数を同じ頻度のグループに分類する
  3. 区間内の変数を目標平均値で置き換える
  4. 目標平均エンコード変数を使用してroc-aucを返す
  5. roc-auc > 0.6の特徴を選択する

各特徴の ROC-AUC を計算できます。

 sel .feature_performance_

{ 'pclass' : 0.6802934787230475 ,
'性別' : 0.7491365252482871 ,
'年齢' : 0.5345141148737766 ,
'シブスプ' : 0.5720480307315783 ,
'パーチ' : 0.5243557188​​989476 ,
「運賃」 : 0.6600883312700917 ,
「キャビン」 : 0.6379782658154696 ,
'搭乗' : 0.5672382248783936 }

データから削除する特徴を見つけることができます:

 削除するフィーチャを選択

[ '年齢' '年齢' '年齢' '年齢' ]

transform() メソッドを使用すると、データセットから特徴を削除できます。

 # 機能を削除
X_train = sel.transform ( X_train )
X_test = sel .transform ( X_test )

これまでのところ、トレーニング セットとテスト セットの合理化されたバージョンができました。

結論 ✦

Python でのフィルタリング、ラッピング、埋め込み、ハイブリッド特徴選択メソッドの実装については、Scikit-learn、MLXtend、Feature-engine の選択モジュールを参照してください。これらのライブラリには、基礎となる方法論を理解するのに役立つ詳細なドキュメントが付属しています。

翻訳者紹介✦

51CTO コミュニティ エディターの Zhao Qingtiao 氏は、長年にわたりドライバー開発に携わってきました。彼の研究対象は、セキュア OS とネットワーク セキュリティです。彼は、陝西数学モデリング賞を受賞し、ネットワーク関連の特許を公開しています。


<<:  機械学習の錬金術の理論的根拠はどれほど強固なのでしょうか?

>>:  Python での機械学習アルゴリズムの実装: ニューラル ネットワーク

ブログ    
ブログ    

推薦する

...

...

ジェネレーティブAIを管理する方法

ドム・クッドウェル著ノアが編集制作:51CTO テクノロジースタック(WeChat ID:blog)...

米国保健福祉省がAIとブロックチェーンを活用してサービスを改善する方法

今日、ますます多くの国や地域が、業務効率の向上、国民へのより良いサービスの提供、そして任務遂行能力の...

ベクトルデータベースは AI をどのように改善するのでしょうか?

翻訳者 |ブガッティレビュー | Chonglou事前トレーニング済みのAIモデルがすぐに利用できる...

...

自動運転車の未来に関するレポート:乗用車の95%が消滅し、7兆ドルの旅行市場に4つの大きなチャンスがある

[[199334]]自動運転車は20年以内に世界経済を劇的に変え、保険、メディア、セキュリティ、物流...

自動運転、ただ約束するだけではもう効果がないのか?

北京市宜荘市内の約60平方キロメートルの制限区域内で、数十台のロボタクシー(無人タクシー)が現在、公...

ネイチャーが中国のAIの現状を分析。2030年に世界をリードできるか?

ネイチャー誌の最近の分析記事では、中国の人工知能研究は質の面で急速な進歩を遂げているが、影響力の大き...

...

論文の90%はモデル中心です。AIの分野では、データとモデルのどちらが重要ですか?

モデルとデータは AI システムの基盤であり、これら 2 つのコンポーネントはモデルの開発において重...

BAT や他の人たちは人工知能に関してどのようなことを話しましたか?

9月17日、上海の西外灘で2018年世界人工知能大会が正式に開幕した。ジャック・マー、ポニー・マー...

...

...

高性能な PyTorch はどのように実現されるのでしょうか?経験豊富な専門家がまとめた落とし穴を避ける10のヒント

最小限の労力で最も効率的な PyTorch トレーニングを完了するにはどうすればよいでしょうか? P...