機械学習とニューラルネットワーク - ページ 74

 

13.1 特徴選択のさまざまなカテゴリ (L13: 特徴選択)


13.1 特徴選択のさまざまなカテゴリ (L13: 特徴選択)

前回のビデオでは、次元削減のサブカテゴリとしての特徴選択の概念について説明しました。特徴の選択には、機械学習モデルのパフォーマンスを向上させるためにデータセットから特徴のサブセットを選択することが含まれます。予測パフォーマンスと計算効率の向上、ストレージスペースの最適化、データの洞察の獲得など、機能選択のさまざまな動機について話し合いました。

ここで、特徴選択アルゴリズムのさまざまなカテゴリ (フィルター メソッド、埋め込みメソッド、ラッパー メソッド) をさらに詳しく見てみましょう。フィルター メソッドは、特徴自体の固有のプロパティに焦点を当てており、モデルや分類子は関与しません。分散やペアごとの相関など、個々の特性に基づいて特徴を分析します。たとえば、特徴の分散を計算すると、異なるトレーニング サンプルを区別するためのその有用性を判断するのに役立ちます。特徴値が軸全体に広がっている場合、それはその重要性を示します。一方、相関性の高い特徴は冗長性を示唆しており、多くの情報を失うことなくそのうちの 1 つを削除できます。フィルター手法は、単一または変数のペアを分析するため、単変量統計または二変量統計と呼ばれることがよくあります。

埋め込みメソッドは、その名前が示すように、学習アルゴリズム内に特徴選択を組み込んでいます。これらのメソッドはモデル最適化プロセスに組み込まれており、目的関数を最適化することを目的としています。 1 つの例は、ツリーの成長中に機能が内部的に選択されるデシジョン ツリーです。デシジョン ツリーは、各分割での情報利得を最大化する特徴を選択し、その結果、重要な特徴が選択されます。最終的なデシジョンツリーで使用されない特徴は、それほど重要ではないと考えることができます。

ラッパー メソッドは、予測パフォーマンスを最適化するという目標と密接に連携しています。これらの方法には、モデルをさまざまな特徴サブセットに適合させ、モデルのパフォーマンスに基づいて特徴を選択または削除することが含まれます。さまざまな特徴サブセットでトレーニングされたモデルのパフォーマンスを比較することで、各特徴の重要性を判断できます。たとえば、特徴量を削除すると精度が大幅に低下する場合、その特徴量がモデルのパフォーマンスにとって重要であることが示唆されます。ラッパー メソッドは、モデルの精度を直接使用することで、機能の重要性についての貴重な洞察を提供します。

ラッパー メソッドは正確な特徴選択を提供しますが、特に大規模な特徴セットを扱う場合、計算コストが高くなる可能性があります。モデルをさまざまなサブセットに適合させ、そのパフォーマンスを評価するプロセスには時間がかかる場合があります。対照的に、フィルター メソッドは計算効率が高くなりますが、ラッパー メソッドほど正確な結果が得られない可能性があります。精度と計算効率の間のトレードオフは、機能を選択する際の重要な考慮事項です。

今後のビデオでは、特徴選択アルゴリズムの各カテゴリをさらに詳しく説明します。フィルター メソッドをさらに詳しく説明し、その後、埋め込みメソッドとラッパー メソッドを見ていきます。これらの手法を理解することで、特徴の選択と、それを機械学習モデルの改善にどのように適用できるかを包括的に理解できます。

次のビデオを楽しみにしていてください。そこではフィルター方法について詳しく説明します。

13.1 The Different Categories of Feature Selection (L13: Feature Selection)
13.1 The Different Categories of Feature Selection (L13: Feature Selection)
  • 2021.12.09
  • www.youtube.com
In this video, I am introducing the three main categories of feature selection: filter methods, embedded methods, and wrapper methods.Slides: https://sebasti...
 

13.2 特徴選択のフィルター方法 -- 分散しきい値 (L13: 特徴選択)


13.2 特徴選択のフィルター方法 -- 分散しきい値 (L13: 特徴選択)

はい、前回のビデオでは、フィルター メソッド、埋め込みメソッド、ラッパー メソッドという 3 つの異なるカテゴリの機能選択について説明しました。ここで、カテゴリの 1 つであるフィルター メソッドをさらに詳しく見てみましょう。今後のビデオでは、埋め込みメソッドとラッパー メソッドについても説明します。ただし、ここでは主なトピックとしてフィルター メソッドに焦点を当てましょう。

フィルター メソッドは、主に特徴自体の固有のプロパティを考慮した特徴選択手法です。機能の選択において特定のモデルに依存しません。フィルター方法の一例は、分散しきい値です。分散しきい値がどのように機能するかを詳しく見てみましょう。

特徴の選択に分散しきい値を使用する場合、各特徴の分散を計算します。分散が大きい特徴には、分類子または回帰モデルをトレーニングするためのより有用な情報が含まれている可能性があると仮定されています。しかし、なぜこれが真実なのでしょうか?これを理解するために、X1 と呼ばれる機能について考えてみましょう。左側には、分散が高い特徴があり、特徴値は十分に分散しています。右側には、分散が低い特徴があり、特徴値の分散が小さくなっています。分散が大きいほど、その特徴に基づいて決定境界を再構築できます。これは正確な予測を行うために非常に重要です。クラスが重複する最悪のシナリオでも、十分に分散された特徴は意思決定の境界を構築するのに役立ちます。

この概念をさらに説明するために、二項分類のケースを考えてみましょう。クラス スクエアとクラス スターという 2 つのクラスがあるとします。最良のシナリオでは、1 つのクラスのすべてのデータ ポイントが一方の側にあり、もう一方のクラスのすべてのデータ ポイントがもう一方の側にあります。これにより、クラスを完全に分離する決定境界を簡単に構築できます。ただし、現実のシナリオでは、完全な分離が常に達成できるとは限りません。クラスが重複している場合でも、分散が大きい特徴は、決定境界の構築に役立ちます。たとえば、コード例で示されているように、デシジョン ツリーは、広範囲にわたる特徴に基づいてデータ ポイントを正確に分類できます。

分散の重要性を理解したところで、特徴選択の尺度として分散をどのように使用できるかについて説明します。離散確率変数の分散は、特定の式を使用して計算できますが、実際には、確率分布がわからないデータセットを扱うことがよくあります。したがって、均一な重みを仮定し、観察されたデータ ポイントに基づいて分散を計算します。たとえば、カテゴリ特徴量を扱う場合、ワンホット エンコーディングを実行してバイナリ変数を作成します。この場合、ベルヌーイ変数の分散は p * (1 - p) として計算できます。ここで、p は値 1 が観測される確率です。この分散計算は、カテゴリカル特徴シナリオでの特徴選択に特に役立ちます。

分散ベースの特徴選択を実装するために、Scikit-learn は VarianceThreshold クラスを提供します。このクラスを使用すると、分散の低い特徴を削除できます。分散のしきい値を指定することで、一定の割合のラベルが同じである特徴列を除外できます。たとえば、ラベルの 80% 以上が類似している特徴を削除したい場合は、分散しきい値を 0.16 (0.8 * (1 - 0.8) として計算) に設定できます。このしきい値により、識別力がほとんどない特徴が確実に破棄されます。

要約すると、分散しきい値などのフィルター手法は、特徴の固有の特性を考慮するため、特徴の選択に役立ちます。特徴の分散を分析することで、分類または回帰タスクに限られた情報を提供する特徴を特定して削除できます。

13.2 Filter Methods for Feature Selection -- Variance Threshold (L13: Feature Selection)
13.2 Filter Methods for Feature Selection -- Variance Threshold (L13: Feature Selection)
  • 2021.12.10
  • www.youtube.com
Sorry, I had some issues with the microphone (a too aggressive filter to remove background noise). Should be better in the next vids!Description: This video ...
 

13.3.1 埋め込み特徴選択としての L1 正規化ロジスティック回帰 (L13: 特徴選択)


13.3.1 埋め込み特徴選択としての L1 正規化ロジスティック回帰 (L13: 特徴選択)

前回のビデオでは、特徴選択のさまざまな方法について、特に特徴のプロパティに基づくフィルター方法に焦点を当てて説明しました。ここで、機能選択の 2 つの異なるカテゴリ、埋め込みメソッドとラッパー メソッドを詳しく見てみましょう。これらのカテゴリは両方とも、特徴の選択に分類器などのモデルの使用を伴います。このビデオでは、モデルのトレーニングまたは最適化プロセスの一部として特徴の選択が暗黙的に行われる埋め込みメソッドに焦点を当てます。

埋め込みメソッドは、特徴の選択をモデルのトレーニング プロセスに統合します。この概念を、Lasso 回帰とも呼ばれる L1 正規化ロジスティック回帰のコンテキストで検討します。先に進む前に、このビデオはロジスティック回帰に関する基本的な知識を前提としていることに注意することが重要です。ただし、脱線しすぎないように、重要な概念のみを説明します。

花びらの長さと幅という 2 つの特徴を持つアヤメ データセットを使用して、2 つのクラスを持つバイナリ ロジスティック回帰モデルを検討することから始めましょう。ロジスティック回帰では、2 つのクラスを分離する線形の決定境界が生成されます。決定境界は、非線形変換を受ける入力の重み付き合計にしきい値を適用することによって決定されます。

ロジスティック回帰をより深く理解するために、モデルのグラフ表現を調べてみましょう。この図では、左側に重み (w) があり、w1 と w2 は 2 つの特徴の重みを表しています。さらに、切片項として機能するバイアス ユニット (B) があります。重み付けされた合計は、各重みとそれに対応する特徴の積とバイアス項の合計として計算されます。この加重合計は、ロジスティック シグモイドとも呼ばれるシグモイド関数に渡され、0 ~ 1 の値が出力されます。この値はクラス メンバーシップ確率を表し、観測された特徴を考慮してデータ ポイントがクラス 1 に属する確率を示します。 。しきい値 (通常は 0.5) を適用すると、データ ポイントをクラス 0 またはクラス 1 に分類してバイナリ予測を行うことができます。

ロジスティック回帰の基本を理解したところで、L1 正則化ロジスティック回帰に焦点を当てましょう。 L1 正則化の重要な点は、重みの大きさを測定する L1 ノルム項を含めることです。この項は損失関数に追加され、大きな重みを持つ複雑なモデルに効果的にペナルティを与えます。ロジスティック回帰では、重みを最小化しながら損失関数を最小化することを目指します。

これを視覚化するには、損失関数を表す等高線を想像してください。外側の等高線は大きな損失値に対応し、中心に近い等高線はより小さな損失値を表します。正則化を行わない損失関数のグローバル最小値は中心で発生し、損失を最小限に抑えるための最適な重みを示します。ただし、L1 ペナルティ項はより小さい重みを好み、単純化を促進します。この違約金条項を導入することで、損失の最小化と違約金の最小化の間のバランスを追求します。注目すべきことに、L1 正規化ロジスティック回帰では、まばらな重みが生成される傾向があり、一部の重みは正確にゼロになります。この特徴選択の側面が、L1 正則化を魅力的なものにしています。

L1 正規化ロジスティック回帰を実際に示すために、ワイン データセットを使用します。このデータセットには、ワインのさまざまな特性に関連する 13 の異なる特徴が含まれており、タスクはワインをさまざまなタイプに分類することです。まず、機械学習では一般的な方法として、データをトレーニング セットとテスト セットに分割します。

詳細なコード例と詳細な説明は、このビデオに付属するノートブックに記載されています (以下に説明します)。

次に、Lasso とも呼ばれる L1 正則化アプローチを使用した特徴選択部分に移りましょう。 scikit-learn のロジスティック回帰モデルを使用します。これにより、L1 正則化ペナルティを適用できます。

 from sklearn.linear_model import LogisticRegression

# Create a Logistic Regression model with L1 regularization
model = LogisticRegression(penalty= 'l1' , solver= 'liblinear' )

# Fit the model on the training data
model.fit(X_train, y_train)

ペナルティ パラメータを「l1」に設定することで、L1 正則化を使用することを指定します。ソルバー パラメーターは「liblinear」に設定されており、これは、私たちが扱っているような小さなデータセットに適しています。

モデルをトレーニング データに適合させた後、各特徴に割り当てられた重みを表す学習された係数にアクセスできます。係数を出力しましょう:

# Get the learned coefficients
coefficients = model.coef_

# Print the coefficients
for i, coef in enumerate(coefficients[ 0 ]):
    print(f 'Feature {i+1}: {coef:.4f}' )
モデルの coef_ 属性には係数が含まれます。係数を反復処理して出力し、各係数を対応する特徴に関連付けます。

次に、ゼロ以外の係数を持つ特徴を特定できます。これらは選択された特徴であるためです。選択したフィーチャを見つけて印刷してみましょう。

# Find the indices of non-zero coefficients
selected_features = [i for i, coef in enumerate(coefficients[ 0 ]) if coef != 0 ]

# Print the selected features
print( 'Selected features:' )
for feature in selected_features:
    print(f 'Feature {feature+1}' )
係数を再度繰り返し、今回は非ゼロ係数のインデックスを selected_features リストに保存します。最後に、選択した特徴を出力します。

L1 正則化を適用することにより、ロジスティック回帰モデルは一部の係数をゼロにすることで暗黙的に特徴選択を実行します。ゼロ以外の係数を持つ特徴は、モデルの予測にとって重要であるとみなされます。

正則化パラメーター C の選択が、適用される正則化の程度に影響することに注意することが重要です。 C 値が小さいほど、正則化が強くなり、係数がゼロの特徴が多くなる可能性があります。

これで、ロジスティック回帰における L1 正則化を使用した埋め込み特徴選択方法を理解できました。次のビデオでは、デシジョン ツリーとランダム フォレストを使用した特徴選択について説明します。

次のビデオでは、デシジョン ツリーとランダム フォレストを使用した特徴の選択について説明します。これらの方法はアンサンブル方法として知られており、分類問題と回帰問題の両方に使用できます。

デシジョン ツリーは、特徴空間を領域に分割し、各領域にラベルを割り当てることで予測を行う、シンプルかつ強力なモデルです。一方、ランダム フォレストはデシジョン ツリーのアンサンブルであり、各ツリーはデータと特徴のランダムなサブセットでトレーニングされます。

まず、scikit-learn のランダム フォレスト分類器を使用して特徴を選択しましょう。

 from sklearn.ensemble import RandomForestClassifier

# Create a Random Forest Classifier
model = RandomForestClassifier()

# Fit the model on the training data
model.fit(X_train, y_train)

モデルをトレーニング データに適合させた後、モデルの予測における各特徴の相対的な重要性を表す特徴重要度にアクセスできます。機能の重要度を出力してみましょう。

# Get the feature importances
importances = model.feature_importances_

# Print the feature importances
for i, importance in enumerate(importances):
    print(f 'Feature {i+1}: {importance:.4f}' )
モデルの feature_importances_ 属性には、特徴の重要度が含まれます。重要度を繰り返して出力し、各重要度を対応する機能に関連付けます。

次に、重要性に基づいて特徴をランク付けし、上位 k 個の特徴を選択します。上位 k 個の特徴を見つけて出力してみましょう。

# Rank the features based on importances
feature_ranks = sorted(range(len(importances)), key=lambda i: importances[i], reverse=True)

# Select the top k features
k = 5   # Number of top features to select
top_features = feature_ranks[:k]

# Print the top features
print(f 'Top {k} features:' )
for feature in top_features:
    print(f 'Feature {feature+1}' )

特徴のインデックスをその重要性に基づいて降順に並べ替えます。次に、feature_ranks リストをスライスして上位 k 個の特徴を選択します。最後に、上位の特徴を出力します。

ランダム フォレストでは、アンサンブル内のすべてのデシジョン ツリーにわたる各特徴の平均寄与度が考慮されます。重要性が高いほど、その機能が予測を行う際の影響力が大きくなります。

このように、ランダム フォレストは、重要度スコアに基づいて特徴選択を実行する簡単な方法を提供します。

これで、デシジョン ツリーとランダム フォレストを使用した特徴選択について理解できました。次のビデオでは、再帰的特徴除去方法について説明します。

13.3.1 L1-regularized Logistic Regression as Embedded Feature Selection (L13: Feature Selection)
13.3.1 L1-regularized Logistic Regression as Embedded Feature Selection (L13: Feature Selection)
  • 2021.12.13
  • www.youtube.com
Without going into the nitty-gritty details behind logistic regression, this lecture explains how/why we can consider an L1 penalty --- a modification of the...
 

13.3.2 デシジョン ツリーとランダム フォレストの特徴の重要性 (L13: 特徴の選択)


13.3.2 デシジョン ツリーとランダム フォレストの特徴の重要性 (L13: 特徴の選択)

視聴者の皆さん、こんにちは!前回のビデオでは、正則化ロジスティック回帰の例に焦点を当て、特徴選択のための埋め込み手法についての議論を開始しました。今日は、埋め込みメソッドの別の例であるデシジョン ツリーを詳しく掘り下げ、各ノードで特徴がどのように選択されるかを調べます。また、すでによく知られている概念であるランダム フォレスト機能の重要性との関係についても説明します。それでは、早速始めましょう!

しかし、先に進む前に、ちょっとしたお知らせがあります。残念ながら、iPad のペンシルまたはペンが機能しなくなったので、ペン タブレットの使用に切り替えました。ただし、予想していたよりも慣れるのが少し大変だったことは認めざるを得ません。本当に快適に使いこなせるようになるには、さらにいくつかのビデオが必要になるかもしれません。また、新しい画面注釈ソフトウェアを試しているので、問題がある場合はご容赦ください。今後のビデオでは、注釈のプロセスがよりスムーズになることを願っています。さて、本題に戻りましょう。

要約すると、機能の選択は、フィルター メソッド、ラッパー メソッド、埋め込みメソッドの 3 つの主なメソッドに大別できます。前回のビデオでは、埋め込み手法の例として Lasso または L1 正規化ロジスティック回帰を検討しました。今日は、ディシジョン ツリーとランダム フォレストに焦点を移します。

まず、デシジョン ツリーと、デシジョン ツリーが特徴選択を実行する方法について説明します。これを説明するために、以前に調べたデータセットを考えてみましょう。これは、x1 と x2 の 2 つの特徴と、正方形 (クラス 0) と三角形 (クラス 1) の 2 つのクラスで構成されます。私たちの目標はデータ ポイントを分類することであり、決定境界を 2 つのクラスを分ける境界線として視覚化できます。後で説明するように、複数の決定境界によってこれを実現できます。

ここで、デシジョン ツリーがデータセットをどのように分割するかを詳しく見てみましょう。 scikit-learn を使用してデシジョン ツリーをトレーニングし、プロットしました。この木には 2 つの分岐があります。最初の分割はフィーチャ x1 でカットオフ値 5.5 で発生し、データを 2 つのグループに分割します。 2 番目の分割はカットオフ値 10.5 でフィーチャ x2 で行われ、データがさらに分割されます。これらの分割を行うことにより、デシジョン ツリーはデータセットを正常に分類します。クラス内の混合または無秩序のレベルを示すエントロピーを調べることによって、これらの分割の有効性を評価できます。私たちの目標は、エントロピーを可能な限り低減し、理想的には完全な分類を意味する値 0 に達することです。この例では、分割するたびにエントロピーが減少し、最終的にはゼロに達することが観察されます。

興味深いのは、デシジョン ツリーが本質的に特徴選択を実行することです。各ノードで、ツリーは分割にどの機能を使用するかを決定します。この決定は、エントロピーの減少を最大化するか、情報利得を最大化する特徴に基づいています。その結果、デシジョン ツリーは、分類モデルを構築するために最も有益な特徴を自動的に選択します。

ここで、決定木のアンサンブルであるランダム フォレストに焦点を移してみましょう。ランダム フォレストは、特徴の重要性を推定する手段を提供します。これを実証するために、ワイン データセットに目を向けてみましょう。このデータセットは、アルコール含有量、リンゴ酸、灰分など、ワインのさまざまな特性に関連する 13 個の異なる特徴で構成されています。右側には、ランダム フォレストによって生成された特徴重要度プロットが表示されます。特徴の重要度の範囲は 0 から 1 で、合計は 1 になり、各特徴の相対的な重要性を表します。プロットは降順で並べ替えられ、最も重要な特徴が左側に表示されます。

このプロットを生成するために、ランダム フォレスト モデルに基づいて特徴量の重要度を計算する scikit-learn の feature_importances_ 属性を利用しました。ご覧のとおり、このデータセットで最も重要な特徴はプロリンであり、次にフラバノイドと色の強度が続きます。

特徴の重要度の値は、ランダム フォレスト内のすべてのデシジョン ツリーにわたる各特徴の分割によって達成される不純物の合計の減少 (多くの場合、ジニ不純物またはエントロピーによって測定される) を測定することによって決定されます。一貫して不純物の大幅な削減につながる機能は、より重要であると考えられます。

特徴の重要性は、ランダム フォレスト モデルのコンテキスト内での相対的な尺度であることに注意することが重要です。値はトレーニングしたランダム フォレストに固有のものであり、他のモデルやデータセットに一般化できない場合があります。ただし、予測を行う際にどの機能が最も影響力があるかについて貴重な洞察を提供することはできます。

デシジョン ツリーとランダム フォレストについて説明したので、これまでに学んだことをまとめてみましょう。デシジョン ツリーは、エントロピーを低減して分類を改善することを目的として、各分割で最も有益な特徴を選択することによって暗黙的に特徴選択を実行します。一方、ランダム フォレストはデシジョン ツリーのアンサンブルとして、すべてのツリーにわたって各特徴によって達成される不純物の合計の削減を評価することにより、特徴の重要性の尺度を提供します。

機能の重要性を理解することは、さまざまな点で有益です。これは、ターゲット変数を予測するために最も関連性の高い特徴を特定するのに役立ち、最も有益な特徴に焦点を当てることで次元の削減を可能にし、特徴とターゲット変数の間の根底にある関係についての洞察を提供します。

ここで、ランダム フォレストにおける特徴の重要性を評価するプロセスを詳しく見てみましょう。順列重要性と呼ばれる方法を検討します。その前に、ブートストラップ サンプリングとアウトオブバッグ サンプルの概念を簡単に振り返ってみましょう。

ブートストラップ サンプリングでは、元のデータセットを置換してランダムにサンプリングするため、データ ポイントが重複します。その結果、一部のサンプルはブートストラップ サンプルに含まれず、アウトオブバッグ サンプルと呼ばれるものが作成されます。これらのサンプルはトレーニング中にツリーで認識されないため、検証セットまたは評価セットとして機能します。

ここで、方法 B (順列の重要性) に焦点を当てましょう。先ほど説明したバッグから取り出したサンプルを利用します。まず、トレーニング中にランダム フォレスト内のデシジョン ツリーの予測パフォーマンスを評価できます。各ツリーについて、袋外サンプルの予測を行うことができ、これはそのツリー専用の検証またはテスト データ ポイントとして機能します。

順列の重要度を計算するには、out-of-bag サンプルの元の特徴値を含む特徴行列から始めます。ランダム フォレスト内の各決定木について、out-of-bag サンプルの特徴 J の値を並べ替えます。これは、クラス ラベルを変更せずに、特徴値をランダムにシャッフルすることを意味します。

次に、並べ替えられた特徴行列を使用して、現在のデシジョン ツリーを使用して out-of-bag サンプルの予測を行います。これらの予測は並べ替えられた特徴値に基づいているため、特徴 J がランダム化されたときのモデルのパフォーマンスを表すことに注意してください。

並べ替えられた予測を各 out-of-bag サンプルの元の予測と比較し、特徴 J の並べ替えによって正しいクラス予測が何回変化したかをカウントします。このカウントは、モデルの精度に対する特徴 J の影響を反映しています。特徴 J が重要な場合、その値を並べ替えると、予測精度が大幅に低下するはずです。

データセット内のフィーチャごとにこのプロセスを繰り返し、モデルの精度に対する各フィーチャの影響を計算します。特徴の順列が予測に与える影響が大きいほど、その特徴はより重要であると考えられます。

特徴の重要性を定量化するために、各特徴を並べ替えることによって生じる精度の低下を計算します。これは、元の精度から置換された精度を減算し、ランダム フォレスト内のすべてのデシジョン ツリーでこの差を平均することによって行われます。

最後に、特徴の重要度の値の合計が 1 になるように特徴の重要度の値を正規化し、特徴間の重要性の相対的な尺度を提供します。この正規化により、重要度の値が比較可能であり、解釈可能であることが保証されます。

ただし、順列重要度法にはいくつかの制限と考慮事項があることを認識することが重要です。

まず、順列の重要性により、相関のある特徴の重要性が過小評価される可能性があります。 1 つの特徴を並べ替えると、他の相関する特徴の予測が変化する可能性があります。その結果、それらの相関のある特徴の重要性が特徴重要度プロットに正確に反映されない可能性があります。機能の重要性を解釈する際には、機能間の相関関係を考慮することが重要です。

第 2 に、置換の重要度は、特徴の重要度がモデルの予測精度のみに基づいていることを前提としています。予測精度は重要な要素ですが、機能の重要性のすべての側面を把握できるわけではありません。機能の解釈可能性やドメイン知識の関連性など、他の重要な側面が存在する可能性があります。

これらの制限にもかかわらず、順列の重要性は、特徴の重要性の貴重な定量的尺度を提供します。これにより、研究者や実務者は、どの特徴がモデルの予測に最も大きな影響を与えるかを理解できるようになり、特徴の選択、モデルの解釈、次元削減に関連する決定を導くことができます。

次のビデオでは、ラッパー メソッドと呼ばれる別のカテゴリの特徴選択メソッドを検討します。ラッパー手法には、特定の機械学習モデルを使用して機能のさまざまなサブセットを評価することが含まれます。再帰的な特徴の削除と前方/後方の特徴の選択について詳しく説明します。これらの方法は、特徴の数が多く、モデルのパフォーマンスにとって最も関連性の高いサブセットの選択が重要になる場合に特に役立ちます。

要約すると、特徴選択の手法として、埋め込み手法、特にデシジョン ツリーとランダム フォレストについて説明しました。デシジョン ツリーは、エントロピーを低減して分類を改善することを目的として、各分割で最も有益な特徴を選択することによって暗黙的に特徴選択を実行します。ランダム フォレストは、デシジョン ツリーのアンサンブルとして、すべてのツリーにわたって各特徴によって達成される不純物の合計の削減を評価することにより、特徴の重要性の尺度を提供します。また、特徴値を並べ替え、モデルの精度に対するその影響を測定することによって特徴の重要性を定量化する、並べ替え重要度法についても説明しました。

機能の重要性を理解することで、データ サイエンティストや実務者は、情報に基づいて機能の選択に関する決定を下し、モデルを解釈し、機能とターゲット変数の間の根底にある関係について洞察を得ることができるようになります。これは、モデルのパフォーマンスと理解の向上に貢献できる、機械学習ツールキットの貴重なツールです。

これまでのビデオでは、フィルター方法、ラッパー方法、埋め込み方法など、機能を選択するためのさまざまな方法を説明しました。このビデオでは、ラッパー手法、特に再帰的特徴除去 (RFE) と前方/後方特徴選択に焦点を当てます。

ラッパー手法は、特定の機械学習モデルを使用して特徴のさまざまなサブセットを評価することを含む特徴選択手法です。統計的測定に依存するフィルター手法や、特徴の選択をモデルのトレーニング プロセスに統合する埋め込み手法とは異なり、ラッパー メソッドは、モデルのパフォーマンスを特徴の選択基準として使用します。

まず、再帰的特徴除去 (RFE) について説明します。 RFE は、特徴を再帰的に削除し、残りの特徴に基づいてモデルを構築することで機能する、反復的な特徴選択アプローチです。まず、完全な機能セットでモデルをトレーニングし、重要性に基づいて機能をランク付けします。次に、最も重要度の低いフィーチャを削除し、残りのフィーチャを使用してプロセスを繰り返します。この反復プロセスは、指定された特徴数に達するか、事前定義されたパフォーマンスしきい値に達するまで継続されます。

RFE の背後にある考え方は、重要性の低い機能を再帰的に削除することで、モデルのパフォーマンスに最も貢献する最も有益な機能に焦点を当てるというものです。 RFE は、特徴の重要性または特徴の重みの尺度を提供する任意の機械学習モデルで使用できます。 RFE で使用される一般的なモデルには、ロジスティック回帰、サポート ベクター マシン、ランダム フォレストなどがあります。

次に、前方/後方の機能の選択に進みましょう。これらは、モデルのパフォーマンスへの寄与に基づいて機能を繰り返し追加または削除することによって、機能の最適なサブセットを検索する 2 つの関連するラッパー メソッドです。

前方特徴選択は空の特徴セットから始まり、一度に 1 つの特徴を繰り返し追加します。各反復で、相互検証または別の評価メトリクスを使用してモデルのパフォーマンスを評価し、パフォーマンスを最も向上させる機能を選択します。このプロセスは、所望の機能数に達するか、パフォーマンス向上のプラトーに達するなど、事前に定義された停止基準が満たされるまで継続されます。

一方、後方特徴選択は、完全な特徴セットから開始され、一度に 1 つの特徴を繰り返し削除します。各反復でモデルのパフォーマンスを評価し、パフォーマンスへの影響が最も少ない機能を削除します。このプロセスは、停止基準が満たされるまで続行されます。

特に多数の特徴を扱う場合、前方特徴選択と後方特徴選択の両方で計算コストが高くなる可能性があります。これを軽減するために、ヒューリスティックや近似を使用して検索プロセスを高速化するなど、さまざまな戦略を採用できます。

RFE、前方選択、後方選択などのラッパー手法は、使用する評価指標と機械学習モデルの選択に影響される可能性があることに注意してください。評価指標が異なると、選択した機能のサブセットが異なる場合があり、選択した機能のパフォーマンスがモデルごとに異なる場合があります。

実際には、相互検証を実行するか、外部検証セットを使用して、さまざまな特徴サブセットを使用したモデルのパフォーマンスの確実な推定値を取得することをお勧めします。これは、過剰適合を回避し、目に見えないデータに対して適切に一般化する特徴を選択するのに役立ちます。

要約すると、再帰的特徴除去 (RFE)、前方特徴選択、後方特徴選択などのラッパー メソッドは、モデルのパフォーマンスに基づいて特徴のさまざまなサブセットを評価する特徴選択の反復手法です。これらの方法は、特定の機械学習タスクに最も関連する特徴を特定し、モデルの解釈可能性を向上させ、特徴空間の次元を削減するのに役立ちます。

次のビデオでは、遺伝的アルゴリズムや主成分分析 (PCA) など、特徴選択のための他の高度なテクニックを検討します。これらの方法では、さまざまな最適化原理や統計手法に基づいて特徴を選択するための追加オプションが提供されます。乞うご期待!

特徴の選択は機械学習パイプラインにおける重要なステップであり、適切な特徴選択方法の選択は、特定のデータセット、機械学習タスク、およびモデルのパフォーマンス、解釈可能性、計算効率の間の望ましいトレードオフによって異なります。

13.3.2 Decision Trees & Random Forest Feature Importance (L13: Feature Selection)
13.3.2 Decision Trees & Random Forest Feature Importance (L13: Feature Selection)
  • 2021.12.22
  • www.youtube.com
This video explains how decision trees training can be regarded as an embedded method for feature selection. Then, we will also look at random forest feature...
 

13.4.1 再帰的な特徴の削除 (L13: 特徴の選択)


13.4.1 再帰的な特徴の削除 (L13: 特徴の選択)

このセクションでは、フィルター メソッドと埋め込みメソッドに関するこれまでの説明に基づいて、機能選択のためのラッパー メソッドのトピックを検討します。ラッパー メソッドは、特徴を選択するためにモデルを明示的に使用します。ラッパー メソッドの一般的な例の 1 つは再帰的特徴除去 (RFE) であり、このビデオではこれに焦点を当てます。さらに、今後のビデオでは、ラッパー技術を使用した他の特徴選択方法についても詳しく説明します。

概要を説明すると、機能選択には主にフィルター メソッド、埋め込みメソッド、ラッパー メソッドという 3 つの方法があります。今日はラッパー メソッドに焦点を当てます。 RFE の背後にある中心的な考え方は 3 つのステップに要約できます。

まず、通常は線形回帰やロジスティック回帰などの線形モデルを使用して、モデルをデータセットに適合させます。このステップは特別なことではありません。

次に、モデルを調べて特にモデル係数を調べます。これについては後ほど詳しく説明します。これらの係数の大きさに基づいて、係数が最も小さい特徴を削除します。最小の係数を持つ特徴を最も重要ではないとみなすことにより、それをさらなる検討から除外することができます。このプロセスでは、機能を同等の規模にするために、機能の正規化または標準化が重要であることに注意してください。これについては後で具体的な例を見ていきます。

最後のステップでは、必要な数の特徴に達するまでステップ 1 と 2 を繰り返します。本質的には、必要な特徴のセットが得られるまで、継続的にモデルを適合させ、最も重要でない特徴を削除します。このシンプルかつ効果的な方法は、特徴選択への直接的なアプローチを提供します。

再帰的特徴除去の重要な側面の 1 つは、モデル係数または重みの除去にあります。これを説明するために、線形回帰モデルとロジスティック回帰モデルを考えてみましょう。線形回帰は連続ターゲットのモデル化に使用されますが、ロジスティック回帰は離散ラベルまたはカテゴリラベルの分類子です。これらのモデルについては以前の講義で説明したため、ここでは詳しく説明しません。

線形回帰とロジスティック回帰の両方で、モデルには係数または重みがあります。線形回帰では、これらの重みは傾きを表しますが、ロジスティック回帰では、分類結果に対する各特徴の影響に関連付けられます。これらの重みの大きさを調べることで、各特徴の重要性を判断できます。最小の重みまたは係数を持つ特徴を削除すると、その特徴は事実上考慮から除外されます。あるいは、重みをゼロに設定すると、重み付き合計の計算で特徴の寄与が除外されるため、同じ結果が得られます。

特徴除去がどのように機能するかをよりよく理解するために、ロジスティック回帰を使用した例を見てみましょう。 2 つの特徴 x1 と x2 を含む二項分類問題があり、クラスのメンバーシップ確率を決定したいと考えています。特徴値とモデルの重みを使用して重み付き合計を計算することにより、正味の入力が得られます。ロジスティック シグモイド関数を正味入力に適用して、クラス メンバーシップ確率を導き出します。この確率をしきい値 (通常は 0.5) と比較することで、クラス ラベルを割り当てることができます。

重要な点は、これらのモデルの重みが各機能の重要性を反映しているということです。重みが大きいほど、正味入力への寄与が大きくなり、その後分類結果に影響を与えるため、重要性が高くなります。重みを標準化または正規化すると、重みが同じスケールになることが保証され、重みの重要性をより適切に解釈することが容易になります。

次に、scikit-learn で wine データセットを使用して再帰的特徴除去を使用する例を見てみましょう。ここに示されているコードは、そのプロセスを示しています。まずデータセットをトレーニング セットとテスト セットに分割して準備し、次に特徴を標準化します。次に、scikit-learn の RFE クラスから RFE オブジェクトをインスタンス化します。ロジスティック回帰推定量を RFE オブジェクトに渡し、選択する特徴の望ましい数 (たとえば、この場合は 5) を指定します。

RFE オブジェクトをインスタンス化したら、fit メソッドを使用してそれをトレーニング データに適合させることができます。これにより、再帰的な特徴除去プロセスが開始されます。 RFE オブジェクトは、トレーニング データに基づいてロジスティック回帰モデルをトレーニングし、係数が最小の特徴を削除します。必要な特徴数に達するまで、このプロセスが繰り返し繰り返されます。

RFE オブジェクトを適合させた後、support_ 属性を使用して選択した機能にアクセスできます。この属性は、どのフィーチャが選択されたかを示すブール マスクを返します。また、ranking_ 属性を使用して、重要性に基づいて特徴のランキングを取得することもできます。ランクが低いほど、機能の重要性が高くなります。

次のステップでは、RFE オブジェクトの変換メソッドを使用して、選択した特徴のみを含むように元のトレーニング データとテスト データを変換できます。これにより、選択した機能のみを含む新しい機能セットが作成されます。

最後に、変換されたトレーニング データでロジスティック回帰モデルをトレーニングし、変換されたテスト データでそのパフォーマンスを評価できます。これにより、特徴選択プロセスの有効性を評価し、それによってモデルの予測精度が向上したかどうかを判断できます。

選択する特徴の数とステップ サイズは、特定のデータセットとモデルに最適な構成を見つけるために調整できるハイパーパラメーターであることに注意してください。グリッド検索またはその他のハイパーパラメータ最適化手法を使用して、これらのパラメータの最適な組み合わせを見つけることができます。

全体として、再帰的特徴除去は、モデルのトレーニングと重要度の低い特徴を反復的に除去することに依存する特徴選択のラッパー方法です。これは回帰問題と分類問題の両方に適用でき、さまざまなタイプのモデルで使用できます。特徴の選択は、モデルによって特徴に割り当てられた係数または重みに基づいて行われます。 RFE は、重要度の低い特徴を繰り返し削除することで、最も有益な特徴に焦点を当て、モデルのパフォーマンスを向上させることを目指しています。

13.4.1 Recursive Feature Elimination (L13: Feature Selection)
13.4.1 Recursive Feature Elimination (L13: Feature Selection)
  • 2021.12.27
  • www.youtube.com
In this video, we start our discussion of wrapper methods for feature selection. In particular, we cover Recursive Feature Elimination (RFE) and see how we c...
 

13.4.2 特徴順列の重要性 (L13: 特徴選択)


13.4.2 特徴順列の重要性 (L13: 特徴選択)

このビデオへようこそ。順列の重要性について詳しく説明します。順列の重要性は、前のビデオで簡単に説明した、特徴選択のラッパー メソッドの一部です。ラッパー メソッドには、モデルを使用して特徴の選択を実行したり、特徴の重要性を推定したりすることが含まれます。前回の講義では、ラッパー メソッドの例として再帰的な特徴の削除について説明しました。ここで、順列の重要性に焦点を移します。今後のビデオでは、逐次特徴選択と呼ばれる別の方法についても説明します。

順列の重要性がどのように機能するかの核心的な詳細に入る前に、この方法の簡潔な概要を説明しましょう。基本的に、順列の重要度には、データセット内の各特徴列をシャッフルすることが含まれます。次に、すでにトレーニング済みのモデルを使用して、シャッフルされたデータセットでのモデルのパフォーマンスを評価し、元のパフォーマンスと比較します。通常、特徴列がシャッフルされるとパフォーマンスの低下が観察されます。このパフォーマンスの低下は、機能の重要性を示す指標として機能します。もちろん、この方法をたった 2 つのステップで要約するのは少し複雑に見えるかもしれません。そのため、次のスライドでは、プロセスをより詳細にゆっくりと説明します。

データセット内の各列に順列重要度を適用することで、各特徴の重要性を示す棒グラフを生成できます。さらに、必要に応じて、プロットに重要度の値の標準偏差を含めることができます。次のビデオでは、そのようなプロットを作成する方法のコード例を紹介します。

さて、順列の重要性とその背後にあるアルゴリズムについて詳しく説明する前に、いくつかの注目すべき事実を見てみましょう。順列の重要度は、不純物に基づくランダム フォレストの特徴の重要度と同様の結果をもたらすことがよくあります。ただし、順列重要度の利点は、モデルに依存しないことです。つまり、あらゆる種類の機械学習アルゴリズムまたはモデルで使用できることを意味します。順列重要度は厳密には特徴選択方法ではありませんが、モデルが最も依存する特徴についての洞察を提供することに注意することが重要です。したがって、特徴の重要度の尺度を特徴を選択するための基礎として使用できます。

ランダム フォレストの特徴の重要性に関する前回の説明を思い出していただければ、順列の重要性は、いずれかの方法、特にそのビデオの方法 B の一般化として考えることができます。ただし、out-of-bag サンプルを使用する代わりに、順列重要度ではホールドアウト セットが使用されます。バッグから取り出した例について復習が必要な場合は、前のビデオをもう一度ご覧ください。

ここで、順列の重要性に関する段階的なアルゴリズムを見ていきましょう。まず、トレーニング セットに適合したモデルから始めます。このモデルには、任意の機械学習モデルまたはアルゴリズムを使用できます。例として、ランダム フォレスト分類子を考えてみましょう。トレーニング セットでランダム フォレストをトレーニングします。これは標準的なステップです。

次に、検証セットやテスト セットなどの独立したデータセットに対するモデルの予測パフォーマンスを推定します。このパフォーマンスをベースライン パフォーマンスとして記録します。たとえば、適合したランダム フォレスト モデルを使用して検証セットで 99% の精度を達成したとします。これをベースライン パフォーマンスとみなします。

データセット内の各特徴列について、他の列とクラス ラベルを変更しないまま、その特定の列をランダムにシャッフルします。このシャッフル プロセスをデータセットの例で説明します。 3 つの特徴列と 4 つのトレーニング サンプルを含むデータセットがあるとします。この例では異なる色で表されている列 1 のシャッフルに焦点を当てます。シャッフル後、その列の値の順序が変わります。列 2 と列 3 の元の値を維持しながら、値をランダムに並べ替えます。

順列重要性のもう 1 つの利点は、相関のある特徴を適切に処理できることです。各機能の値をシャッフルすることによって各機能の重要性を個別に評価するため、他の機能との相関関係に関係なく、モデルのパフォーマンスに対する各機能の固有の寄与が捕捉されます。これは、相互に関連するフィーチャを持つ高次元データセットが存在するシナリオで特に役立ちます。

順列重要度は、一部のモデルによって提供される固有の特徴重要度よりも信頼できる特徴重要度の尺度も提供します。たとえば、デシジョン ツリーやランダム フォレストでは、特徴の重要性は、データの分割時に達成される不純物の削減に基づいています。ただし、この測定は、多くの可能性のある分割があるフィーチャ、またはツリー構造の上位に表示されるフィーチャに偏る可能性があります。順列重要度は、各特徴をシャッフルした場合の影響を直接評価することにより、特徴の重要性をより直接的かつ不偏に推定します。

欠点としては、特にモデルのトレーニング プロセスに時間がかかる場合や、特徴量が多い場合には、順列の重要度によって計算コストが高くなる可能性があります。並べ替えプロセスではモデルのパフォーマンスを複数回再評価する必要があるため、大幅なオーバーヘッドが追加される可能性があります。ただし、並列コンピューティングの使用や順列数の削減など、この問題を軽減するのに役立つ最適化手法と並列化戦略があります。

順列の重要性は、特徴の選択やモデルの解釈に対する特効薬ではないことに注意してください。これは個々の機能の重要性について貴重な洞察を提供しますが、他の技術やドメインの知識と組み合わせて使用する必要があります。特徴の重要性だけでは、特徴の予測力や関連性が保証されません。コンテキスト、特定の問題、モデルの制限を考慮することが重要です。

要約すると、順列重要度は、機械学習モデルの特徴の重要性を評価するための強力でモデルに依存しない方法です。特徴値をシャッフルし、シャッフル前後のモデルのパフォーマンスを比較することにより、特徴の重要性の信頼できる尺度が提供されます。理解しやすく、相関する特徴を適切に処理し、過学習の影響を受けません。ただし、計算コストが高くなる可能性があるため、包括的な特徴選択とモデル解釈のために他の手法と併用する必要があります。

13.4.2 Feature Permutation Importance (L13: Feature Selection)
13.4.2 Feature Permutation Importance (L13: Feature Selection)
  • 2021.12.29
  • www.youtube.com
This video introduces permutation importance, which is a model-agnostic, versatile way for computing the importance of features based on a machine learning c...
 

13.4.3 特徴順列重要度のコード例 (L13: 特徴選択)


13.4.3 特徴順列重要度のコード例 (L13: 特徴選択)

さて、順列の重要性についての基本的な概要を説明したので、実際に順列の重要性をどのように使用できるかをいくつかのコード例を見てみましょう。はい、いつものように、ビデオの下にリンクされている Jupyter Notebook のコード例も掲載しています。また、いつもとは異なり、物事をシンプルにするために、再び風データセットを使用します。

したがって、風のデータセットも 13 列で構成されるデータセットです。最初の 5 行がどのようになっているかの概要を次に示します。したがって、クラス 1、クラス 2、およびクラス 3 の 3 つのクラスがあります。 13 列ありますが、スペースの都合上、すべての列がここに示されているわけではありません。ただし、この風データセットについてはこれまでに何度も見てきたので、あまり詳しく説明しません。

はい、そしていつものように、データセットをトレーニング セットとテスト セットに分割します。ここでは、ラベル列である最初の列を除いてデータセットを取得しています。したがって、データセットをトレーニング セットとテスト セットに分割し、データの 30% がテストに使用され、70% がそれに応じてトレーニングに使用されます。ここでは、検証セットを作成していないことに注意してください。したがって、それは私の個人的な意見です。しかし、順列パフォーマンスを計算する場合、必ずしも検証セットが必要であるとは思えません。そう、通常はテスト セットを独立させておく必要があるからです。しかし、前のビデオに基づいて並べ替えのパフォーマンスがどのように機能するかを思い返してみると、ここでは特徴列を並べ替えたときのパフォーマンスの低下だけを見ています。したがって、実際にはテストの精度を再計算しているのではなく、列をシャッフルした場合にパフォーマンスがどの程度低下するかを調べるためにテスト セットを使用しているだけです。

はい、ここではまだセットアップ段階です。このスライドでは、モデルを準備しています。そして実際、これはランダム フォレスト分類器です。前回のビデオでは、順列重要度がモデルに依存しない方法であることを学びました。つまり、どのタイプのモデルでも計算できるということです。ただし、ここではランダム フォレストを使用しているため、順列の重要性をランダム フォレストの不純物ベースのパフォーマンスと比較できます。これは興味深い比較になる可能性があります。ここでは、100 本の木を含むランダムなフォレスト分類器を設定しています。そしてそれをトレーニングセットに当てはめています。ここでは精度の計算のみを示します。そして、トレーニング精度が 100% であり、テスト精度も 100% であることがわかります。これは、これが実際に非常に優れたモデルであることを示しています。また、単にデータセットの分類が非常に簡単であることを示している可能性もあります。

ここで注意したいことの 1 つは、順列重要度を計算するときに、特徴量の重要度を一般的な特徴量の重要度として解釈したい場合は、非常に優れたパフォーマンスのモデルを持つことが重要であるということです。なぜなら、うまく機能するモデルがない場合、そのモデルがどの特徴に最も依存しているかはわかるかもしれませんが、たとえば、その特徴がターゲット変数のコンテキストにおいてどれほど重要であるかは実際にはわかりません。モデルがあまり正確ではない場合。したがって、順列の重要性を検討する前に、参考までに、ここでも不純物ベースの重要性を示します。これは、以前のビデオですでに説明した、ランダム フォレストの不純物ベースの重要性です。繰り返しますが、これは単なる参照用であり、モデルをフィッティングした後にこの特徴重要度属性にアクセスします。

次に、arg_sort を適用して、重要度の値の並べ替え順序を最大から最小まで取得しています。したがって、最大のものから最小のものまで。次に、不純物ベースの重要性を視覚化するための棒グラフを作成します。棒グラフには、X 軸に特徴名が表示され、Y 軸に対応する重要度の値が表示されます。重要度の値を降順に並べ替えることにより、最も重要な特徴が最初にプロットされます。

次に、コードは順列重要度の計算に進みます。順列の重要度は、テスト セット内の各特徴の値をランダムにシャッフルし、モデルのパフォーマンスの低下を測定することによって計算されます。パフォーマンスの低下が大きいほど、その機能はより重要であると考えられます。このコードでは、for ループを使用して、データセット内の各フィーチャを反復処理します。

ループ内では、テスト セット内の特徴値が np.random.permutation() を使用してシャッフルされます。次に、シャッフルされたテスト セットがトレーニングされたランダム フォレスト分類器に渡されて、予測ラベルが取得されます。シャッフルされたテスト セット上のモデルの精度は、accuracy_score() 関数を使用して計算されます。元のテスト精度とシャッフルされたテスト精度の差は、機能の並べ替えによって生じるパフォーマンスの低下を表します。

各機能のパフォーマンスの低下は、importance_vals と呼ばれるリストに保存されます。すべての機能を反復した後、重要度_vals リストには各機能のパフォーマンス値の低下が含まれます。

最後に、順列の重要性を視覚化するために棒グラフが作成されます。機能名が X 軸にプロットされ、対応するパフォーマンス値の低下が Y 軸にプロットされます。ここでも、重要度の値は降順で並べ替えられ、最も重要な機能が強調表示されます。

このコードは、不純物ベースの重要性と置換の重要性の比較を提供します。 2 つのプロットを比較することで、2 つの方法間で特徴量の重要度のランキングに違いがあるかどうかを観察できます。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X, y)

# Compute impurity-based feature importances
importances = clf.feature_importances_

# Plot impurity-based feature importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importances, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Importance' )
plt.title( 'Impurity-based Feature Importances' )
plt.show()

# Compute permutation importances
importance_vals = []
for feature in range(X.shape[ 1 ]):
    X_permuted = X.copy()
    np.random.shuffle(X_permuted[:, feature])
    y_pred = clf.predict(X_permuted)
    accuracy = accuracy_score(y, y_pred)
    drop_in_performance = accuracy_score(y, y_pred) - accuracy
    importance_vals.append(drop_in_performance)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importance_vals, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Drop in Performance' )
plt.title( 'Permutation Importances' )
plt.show()
このコードは、2 つの棒グラフを並べて作成します。最初のプロットは不純物ベースの特徴の重要度を示し、2 番目のプロットは順列の重要度を示します。これらのプロットを調べることで、これら 2 つの方法に従って Iris データセット内のさまざまな特徴の相対的な重要性について洞察を得ることができます。

matplotlib、numpy、sklearn.ensemble.RandomForestClassifier、sklearn.datasets.load_iris、sklearn.metrics.accuracy_score などの必要なライブラリがインポートされていることを確認してください。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
このコードでは、sklearn.inspection モジュールの permutation_importance 関数を使用して、置換の重要度を計算します。データセットは、train_test_split を使用してトレーニング セットとテスト セットに分割されます。次に、トレーニング データにランダム フォレスト分類子を当てはめ、テスト データを使用して順列の重要度を計算します。

結果として得られる順列重要度は、重要度変数に格納されます。 np.argsort を使用して、重要度を昇順に並べ替えるインデックスを取得します。これは、重要度を正しい順序でプロットするのに役立ちます。

最後に、plt.barh を使用して水平棒グラフを作成し、順列の重要度を表示します。 Y 軸は特徴を表し、X 軸は重要度の値を表します。 plt.xlabel、plt.ylabel、および plt.title 関数は、プロットにラベルとタイトルを追加するために使用されます。

matplotlib、numpy、sklearn.ensemble.RandomForestClassifier、sklearn.datasets.load_iris、sklearn.inspection.permutation_importance、sklearn.model_selection.train_test_split などの必要なライブラリがインポートされていることを確認してください。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
このコードでは、sklearn.inspection モジュールの permutation_importance 関数を使用して、置換の重要度を計算します。データセットは、train_test_split を使用してトレーニング セットとテスト セットに分割されます。次に、トレーニング データにランダム フォレスト分類子を当てはめ、テスト データを使用して順列の重要度を計算します。

結果として得られる順列重要度は、重要度変数に格納されます。 np.argsort を使用して、重要度を昇順に並べ替えるインデックスを取得します。これは、重要度を正しい順序でプロットするのに役立ちます。

最後に、plt.barh を使用して水平棒グラフを作成し、順列の重要度を表示します。 Y 軸は特徴を表し、X 軸は重要度の値を表します。 plt.xlabel、plt.ylabel、および plt.title 関数は、プロットにラベルとタイトルを追加するために使用されます。

matplotlib、numpy、sklearn.ensemble.RandomForestClassifier、sklearn.datasets.load_iris、sklearn.inspection.permutation_importance、sklearn.model_selection.train_test_split などの必要なライブラリがインポートされていることを確認してください。

13.4.3 Feature Permutation Importance Code Examples (L13: Feature Selection)
13.4.3 Feature Permutation Importance Code Examples (L13: Feature Selection)
  • 2021.12.30
  • www.youtube.com
This video shows code examples for computing permutation importance in mlxtend and scikit-learn. Permutation importance is a model-agnostic, versatile way fo...
 

13.4.4 逐次特徴選択 (L13: 特徴選択)


13.4.4 逐次特徴選択 (L13: 特徴選択)

前回のビデオでは、私のお気に入りの手法として、順列重要度を使用した特徴量重要度の概念を紹介しました。このビデオでは、順次特徴選択と呼ばれる別の重要なテクニックについて説明したいと思います。これは、以前に説明したラッパー メソッドの一部でもあります。

逐次的な特徴選択に入る前に、これまで説明してきたさまざまな種類の特徴選択方法を簡単にまとめてみましょう。私たちはフィルターメソッドから始め、その後、再帰的特徴除去などの埋め込みメソッドに移り、現在はラッパーメソッドに焦点を当てています。

ラッパー メソッドは、考えられるすべての機能の組み合わせを試して、最適な機能サブセットを見つけることを目的としています。このアプローチは、徹底的な特徴選択として知られています。その仕組みを理解するために、がく片の長さ、がく片の幅、花弁の長さ、花びらの幅という 4 つの特徴を持つアヤメ データセットの例を考えてみましょう。モデルに最適な機能の組み合わせを見つけるには、単一の機能から完全な機能セットまで、考えられるすべてのサブセットを試す必要があります。

Iris データセットの場合、これにより、1 つ、2 つ、3 つ、および 4 つの特徴のサブセットを含む 15 の可能な組み合わせが得られます。ただし、徹底的な特徴選択は計算コストが高くつき、過学習が発生しやすい可能性があります。これらの問題を軽減するには、検証セットまたは K 分割相互検証を使用して、さまざまな特徴サブセットのパフォーマンスを評価できます。

その単純さにもかかわらず、徹底的な特徴選択は、多数の特徴を含むデータセットに適用する場合には制限があります。可能な特徴サブセットの数は特徴の数に応じて指数関数的に増加するため、大規模なデータセットでは非現実的になります。この制限により、逐次特徴選択の使用が促進されます。これは、可能なすべての組み合わせを評価するのではなく、特徴の組み合わせのサブセットを探索する近似手法です。

順次機能選択は、元の機能セットから開始し、パフォーマンスに基づいて機能を徐々に選択または削除する反復プロセスです。一般的なアプローチの 1 つは、順次後方選択です。この方法では、完全な機能セットから開始して、一度に 1 つの機能を繰り返し削除します。各反復で、残りの機能のパフォーマンスを評価し、最も高いパフォーマンスを持つサブセットを選択します。このプロセスは、単一の特徴を含むサブセットが残るまで続けられます。

逐次後方選択アルゴリズムは次のように要約できます。

  1. 元の機能セットから始めます。
  2. 一度に 1 つの特徴を削除して、サイズ n-1 の可能なすべての特徴サブセットを生成します。
  3. 各候補サブセットのパフォーマンスを評価します。
  4. 最高のパフォーマンスを持つサブセットを選択し、このサブセットにない機能を完全に削除します。
  5. 所望のフィーチャーサイズに達するまで(例えば、フィーチャーが 1 つだけ残る)、ステップ 2 ~ 4 を繰り返します。

ステップ 2 ~ 4 を繰り返すことで、最適なサブセットに到達するまで、特徴セットを徐々に減らします。最終的なサブセットは最も高い評価スコアに基づいて選択され、同点の場合は、計算効率の観点からより小さいサブセットが優先されます。順次後方選択の反復回数は、特徴の数から 1 を引いたものに等しくなります。

逐次前方選択は、逐次特徴選択の別のバリエーションです。フィーチャを削除する代わりに、順次前方選択は空のフィーチャ セットから開始し、一度に 1 つのフィーチャを徐々に追加します。このプロセスには、個々の特徴ごとに分類器をトレーニングし、そのパフォーマンスを評価することが含まれます。最高のパフォーマンスを持つ機能が選択され、サブセットに追加されます。このプロセスは、フィーチャの最大数に達するまで継続されます。

要約すると、逐次特徴選択は、特徴の最適なサブセットを見つけるための有用な手法です。これは、計算効率と適切な機能の組み合わせを見つけることとの間にトレードオフをもたらします。順次後方選択と順次前方選択は、順次機能選択の 2 つの一般的なバリエーションであり、それぞれに独自の利点と使用例があります。次のビデオでは、逐次特徴選択をプログラムで実装する方法と、徹底的な特徴選択の制限に対処する方法を説明します。

 

13.4.5 逐次特徴選択 -- コード例 (L13: 特徴選択)


13.4.5 逐次特徴選択 -- コード例 (L13: 特徴選択)

さて、機能の選択に関する議論を終了します。このビデオでは、Python で逐次特徴選択を使用する方法を説明します。まず、MLxtend ライブラリを使用した例を示します。これは、私が数年前に開発したオリジナルの実装です。後で、より合理化された実装を提供する scikit-learn を使用して同じ結果を達成する方法も示します。

コードに入る前に、ドキュメントをチェックすることをお勧めします。ドキュメントには、長くなりすぎて圧倒されることを避けるために、このビデオでは取り上げない追加の例が含まれています。さらに詳しい情報については、ドキュメントを参照することが常に役に立ちます。

まず、長年にわたってノートブックとソフトウェア ライブラリのバージョンを追跡するために私が開発した「ウォーターマーク」プラグインをロードすることから始めましょう。特にバージョンの不一致により一部のオプションが機能しなくなる可能性がある場合は、バージョン番号が期待どおりであることを確認することをお勧めします。 matplotlib ライブラリも後で使用するので、それをインポートして、プロットがノートブックに正しく表示されることを確認しましょう。

次に、特徴選択のためのデータセットの準備に進みましょう。以前のビデオと同様に、ワイン データセットを使用します。 Pandas を使用して、UCI 機械学習データセット リポジトリからデータセットを読み込みます。データセットをロードした後、すべてが正しくロードされたことを確認するために、いくつかの基本情報を出力します。クラス ラベルが整数として表現されていることを確認することも重要です。

次に、前のビデオで行ったように、データセットをトレーニング セットとテスト セットに分割します。さらに、特徴スケーリングの影響を受けやすい K 最近傍分類器を使用するため、データセットを標準化します。データセットを 80% のトレーニング セットと 20% のテスト セットに分割し、両方のセットを標準化します。

特徴を選択する前にベースラインを確立するために、標準化されたデータセットに K 最近傍分類器を当てはめ、トレーニングとテストの精度を計算します。この例では、分類器として 5 つの近傍を任意に選択しますが、このパラメーターは最適なパフォーマンスを得るためにグリッド検索の対象となる可能性があります。コードとビデオを簡素化するためにここではグリッド検索を実行しませんが、グリッド検索と逐次特徴選択を組み合わせるのが一般的なアプローチです。この例はドキュメントにあります。

ベースライン結果は、トレーニング セットで 98.6% の精度、テスト セットで 94% の精度を達成したことを示しています。ワイン データセットの 13 個の特徴すべてを使用すると、パフォーマンスは非常に優れています。ただし、K 最近傍分類子に関連する次元の呪いにより、ある程度の過剰適合が発生する可能性があります。これを軽減するには、機能のより小さなサブセットを選択して、パフォーマンスを向上させることができます。

次に、順次特徴選択を使用して 5 つの特徴のサブセットを選択する方法を示します。 SequentialFeatureSelector クラスを MLxtend ライブラリからインポートし、便宜上インポート名を sfs に短縮します。このクラスは、モデル、必要な特徴サブセット サイズ、および選択方向 (前方、後方、フローティング) を入力として受け取ります。順次前方選択を行うために、方向を前方に設定します。詳細パラメーターを使用すると、トレーニング中に表示される出力の量を制御できるため、進行状況を監視するのに役立ちます。スコアリング メトリックを精度として指定し、5 分割相互検証を使用して特徴サブセットを評価します。並列処理を有効にするには、n_jobs パラメーターを正の整数または -1 に設定して、使用可能なすべての CPU コアを利用します。この場合、実行を高速化するために 8 に設定します。

出力には、1 つの特徴から開始して、目的のサブセット サイズ 5 に達するまで特徴の数を徐々に増やしていく特徴選択プロセスの進行状況が表示されます。各機能サブセットのパフォーマンスも表示され、機能が追加されるにつれて向上していることがわかります。

完了後、sfs オブジェクトの k_feature_idx_ 属性と k_feature_names_ 属性をそれぞれ使用して、選択した機能インデックスと対応する機能名にアクセスできます。さらに、k_score_ 属性を使用して機能サブセットのパフォーマンス履歴にアクセスできます。選択した特徴のインデックス、名前、およびそれらに対応するスコアを出力してみましょう。

print( 'Selected feature indices:' , sfs.k_feature_idx_)
print( 'Selected feature names:' , sfs.k_feature_names_)
print( 'Selected feature scores:' , sfs.k_score_)

出力には、選択した 5 つの特徴のインデックス、名前、スコアが表示されます。

次に、選択した特徴サブセットで K 最近傍分類器を再トレーニングできます。これを行うには、選択した機能のみを含む新しいトレーニング セットとテスト セットを作成する必要があります。 sfs オブジェクトのtransformメソッドを使用して、元のデータセットを新しい特徴空間に変換できます。

X_train_selected = sfs.transform(X_train)
X_test_selected = sfs.transform(X_test)
データセットを変換した後、選択した特徴サブセットに新しい K 最近傍分類器を当てはめて、トレーニングとテストの精度を計算できます。結果を出力してみましょう。

knn_selected = KNeighborsClassifier(n_neighbors= 5 )
knn_selected.fit(X_train_selected, y_train)

train_acc_selected = knn_selected.score(X_train_selected, y_train)
test_acc_selected = knn_selected.score(X_test_selected, y_test)

print( 'Training accuracy on selected features:' , train_acc_selected)
print( 'Test accuracy on selected features:' , test_acc_selected)
出力には、選択した 5 つの特徴のみを使用して達成されたトレーニングとテストの精度が表示されます。

結果をベースライン精度と比較することで、分類器のパフォーマンスに対する特徴選択の影響を評価できます。場合によっては、特徴の選択により、過剰適合を減らし、無関係または冗長な特徴を削除することにより、汎化が改善され、モデルのパフォーマンスが向上する可能性があります。

MLxtend ライブラリを使用したデモは以上です。次に、scikit-learn を使用して順次特徴を選択することに移りましょう。

scikit-learn では、SequentialFeatureSelector クラスが feature_selection モジュールで使用できます。次のようにインポートします。

from sklearn.feature_selection import SequentialFeatureSelector
scikit-learn バージョンの使用法は MLxtend バージョンと似ていますが、パラメーター名と属性アクセスに若干の違いがあります。 scikit-learn バージョンでは、さまざまな特徴選択アルゴリズムとスコアリング メトリックの使用に関して、より高い柔軟性も提供されます。

このデモが、Python での順次機能選択の使用方法を理解するのに役立つことを願っています。追加の例と情報については、必ずドキュメントを参照してください。

13.4.5 Sequential Feature Selection -- Code Examples (L13: Feature Selection)
13.4.5 Sequential Feature Selection -- Code Examples (L13: Feature Selection)
  • 2022.01.06
  • www.youtube.com
This final video in the "Feature Selection" series shows you how to use Sequential Feature Selection in Python using both mlxtend and scikit-learn.Jupyter no...
理由: