あなたの機能は重要ですか? それは彼らが良いという意味ではありません - KDnuggets

あなたの機能は重要ですか? それは彼らが良いという意味ではありません – KDnuggets

ソースノード: 2893531

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
[作者による画像]

 

「特徴重要度」の概念は、モデルの説明可能性の最も基本的なタイプとして機械学習で広く使用されています。 たとえば、モデルの最も重要でない特徴を繰り返し削除するために、再帰的特徴除去 (RFE) で使用されます。

しかし、これについては誤解があります。

特徴が重要であるという事実は、それがモデルにとって有益であることを意味するものではありません。

実際、ある特徴が重要であると言うとき、これは単にその特徴がモデルによる予測に高い貢献をもたらすことを意味します。 しかし、私たちはそれを考慮する必要があります そのような貢献は間違っているかもしれない.

簡単な例を考えてみましょう。データ サイエンティストが、モデルの機能間の顧客 ID をうっかり忘れてしまいました。 このモデルは、高度な予測機能として顧客 ID を使用します。 結果として、この機能は、実際にモデルを悪化させる場合でも、目に見えないデータではうまく機能しないため、機能の重要性は高くなります。

物事を明確にするために、次の XNUMX つの概念を区別する必要があります。

  • 予測への貢献: 予測のどの部分が特徴によるものであるか。 これは機能の重要度に相当します。
  • エラーの寄与: モデル内の特徴の存在による予測誤差の部分。

この記事では、これらの量を計算する方法と、それらを使用して予測モデルに関する貴重な洞察を得る (および予測モデルを改善する) 方法を説明します。

注: この記事は回帰のケースに焦点を当てています。 分類ケースにさらに興味がある場合は、以下をお読みください。 「あなたの分類モデルにとってどの特徴が有害ですか?」

仕事、年齢、国籍に基づいて人々の収入を予測するモデルを構築したとします。 次に、モデルを使用して XNUMX 人の人物を予測します。

したがって、グラウンド トゥルース、モデル予測、および結果として生じる誤差が得られます。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
グラウンド トゥルース、モデル予測、および絶対誤差 (数千ドル単位)。 [作者による画像]

 

予測モデルがあれば、いつでもモデルの予測を単一の特徴によってもたらされる寄与に分解できます。 これは、SHAP 値を使用して実行できます (SHAP 値がどのように機能するかわからない場合は、私の記事を参照してください: SHAP 価値観は、あなたが誰かに説明してほしかったとおりに説明されました).

したがって、これらが XNUMX 人の個人のモデルに対する SHAP 値であるとしましょう。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
モデルの予測の SHAP 値 (単位: 千ドル)。 [作者による画像]

 

SHAP 値の主な特性は、値が相加的であることです。 これは、各行の合計を取得することで、その個人に対するモデルの予測が得られることを意味します。 たとえば、72 行目を取ると、3k $ +22k $ -53k $ = XNUMXk $ となり、これはまさに XNUMX 番目の個人に対するモデルの予測です。

さて、SHAP 値は、予測にとって特徴がどれほど重要であるかを示す優れた指標です。 実際、(絶対)SHAP 値が高いほど、その特定の個人に関する予測に対する特徴の影響力が大きくなります。 ここでの符号は重要ではないため、SHAP の絶対値について話していることに注意してください。特徴は、予測を上または下に押し上げる場合でも同様に重要です。

したがって、 特徴の予測寄与は、その特徴の絶対 SHAP 値の平均に等しい。 SHAP 値が Pandas データフレームに保存されている場合、これは次のように簡単です。

prediction_contribution = shap_values.abs().mean()

この例では、結果は次のようになります。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
予測寄稿。 [作者による画像]

 

ご覧のとおり、最終予測の平均 71.67 ドルを占めるため、仕事が最も重要な特徴であることは明らかです。 国籍と年齢は、それぞれ XNUMX 番目と XNUMX 番目に関連性の高い特徴です。

ただし、特定の特徴が最終予測の関連部分を占めるという事実は、その特徴のパフォーマンスについては何も示しません。 この側面も考慮するには、「誤差寄与率」を計算する必要があります。

次の質問に答えたいとします。「モデルに特徴がなかった場合、モデルはどのような予測を行うでしょうか」 ジョブ?」 SHAP 値を使用すると、この質問に答えることができます。 実際、これらは加算的なものであるため、特徴に関連する SHAP 値を減算するだけで十分です。 ジョブ モデルによって行われた予測から。

もちろん、フィーチャごとにこの手順を繰り返すことができます。 パンダの場合:

y_pred_wo_feature = shap_values.apply(lambda feature: y_pred - feature)

結果は次のとおりです。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
それぞれの機能を削除した場合に得られる予測。 [作者による画像]

 

つまり、この機能がなかった場合、 ジョブの場合、モデルは最初の個人については 20 ドル、19 人目については -8 ドル、XNUMX 人目については -XNUMX ドルと予測します。 代わりに、その機能がなかったら 年齢の場合、モデルは最初の個人については 73 ドル、50 番目の個人については XNUMX ドルと予測します。

ご覧のとおり、さまざまな特徴を削除すると、各個人の予測は大きく異なります。 結果として、予測誤差も大きく異なります。 それらは簡単に計算できます。

abs_error_wo_feature = y_pred_wo_feature.apply(lambda feature: (y_true - feature).abs())

結果は次のとおりです。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
それぞれの機能を削除した場合に得られる絶対エラー。 [作者による画像]

 

これらは、それぞれの機能を削除した場合に発生するエラーです。 直感的には、誤差が小さければ、特徴量を削除することはモデルにとって問題ではなく、むしろ有益です。 エラーが大きい場合、機能を削除することは得策ではありません。

しかし、私たちにはこれ以上のことができるのです。 実際、モデル全体の誤差と、この機能を使用しない場合に得られる誤差との差を計算できます。

error_diff = abs_error_wo_feature.apply(lambda feature: abs_error - feature)

である:

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
モデルのエラーと、フィーチャがなければ発生するエラーとの差。 [作者による画像]

 

この数値が次の場合:

  • 負の場合、特徴の存在は予測誤差の減少につながるため、その特徴はその観測に対してうまく機能します。
  • 正の場合、特徴の存在は予測誤差の増加につながるため、その特徴はその観測に対して不適切です。

各特徴について、これらの値の平均として「誤差寄与率」を計算できます。。 パンダの場合:

error_contribution = error_diff.mean()

結果は次のとおりです。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
エラーの貢献。 [作者による画像]

 

この値が正の場合は、平均して、モデル内のフィーチャの存在により誤差が大きくなることを意味します。 したがって、その特徴がなければ、予測は一般的により適切になっていたでしょう。 言い換えれば、この機能は利益よりも害をもたらしているということです。

逆に、この値が負であるほど、その特徴の存在により誤差が小さくなるため、その特徴は予測にとってより有益になります。

これらの概念を実際のデータセットで使用してみましょう。

以降、から取得したデータセットを使用します ピカレ (以下の Python ライブラリ MITライセンス)。 このデータセットは「Gold」と呼ばれ、時系列の財務データが含まれています。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
データセットのサンプル。 機能はすべてパーセンテージで表されているため、-4.07 は -4.07% の収益を意味します。 [作者による画像]

 

特徴は、観測時点 (「T-22」、「T-14」、「T-7」、「T-1」) のそれぞれ 22、14、7、および 1 日前の金融資産の収益で構成されます。 以下は、予測特徴として使用されるすべての金融資産の完全なリストです。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
利用可能なアセットのリスト。 各資産は、時間 -22、-14、-7、および -1 で観察されます。 [作者による画像]

 

合計 120 個の機能があります。

目標は、22 日先の金の価格 (リターン) を予測することです (「Gold_T+22」)。 ターゲット変数を見てみましょう。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
変数のヒストグラム。 [作者による画像]

 

データセットをロードしたら、次の手順を実行します。

  1. データセット全体をランダムに分割します。行の 33% をトレーニング データセットに、別の 33% を検証データセットに、残りの 33% をテスト データセットに分割します。
  2. トレーニング データセットで LightGBM リグレッサーをトレーニングします。
  3. 前のステップでトレーニングしたモデルを使用して、トレーニング、検証、テストのデータセットに対して予測を行います。
  4. Python ライブラリ「shap」を使用して、トレーニング、検証、およびテスト データセットの SHAP 値を計算します。
  5. 前の段落で見たコードを使用して、各データセット (トレーニング、検証、テスト) の各特徴の予測寄与度および誤差寄与度を計算します。

トレーニング データセットのエラー寄与率と予測寄与率を比較してみましょう。 散布図を使用するので、ドットはモデルの 120 個の特徴を識別します。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
予測寄与率とエラー寄与率 (トレーニング データセット上)。 [作者による画像]

 

トレーニング セットの予測寄与率とエラー寄与率の間には、非常に負の相関関係があります。

そしてこれは理にかなっています: モデルはトレーニング データセットで学習するため、予測誤差の大幅な削減につながる特徴 (つまり、非常に負の誤差寄与) に高い重要性 (つまり、高い予測寄与) が割り当てられる傾向があります。.

しかし、これでは私たちの知識はあまり増えませんよね?

実際、私たちにとって本当に重要なのは検証データセットです。 実際、検証データセットは、新しいデータに対して特徴がどのように動作するかを知ることができる最良のプロキシです。 そこで、検証セットでも同じ比較を行ってみましょう。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
予測寄与率とエラー寄与率 (検証データセット上)。 [作者による画像]

 

このプロットから、さらに興味深い情報をいくつか抽出できます。

プロットの右下の部分にある特徴は、実際に予測誤差の減少をもたらすため、モデルが正確に高い重要性を割り当てている特徴です。

また、「Gold_T-22」(観測期間の 22 日前の金のリターン)は、モデルがそれに帰する重要性に比べて非常にうまく機能していることに注意してください。 この意味は この機能は十分に適合していない可能性があります。 そして、金が私たちが予測しようとしている資産であるため、この情報は特に興味深いものです (「Gold_T+22」)。

一方、 誤差寄与率が 0 を超える特徴は、予測を悪化させます。。 たとえば、「米国債券 ETF_T-1」は、モデル予測を平均 0.092% (予測寄与) 変更しますが、モデルの予測は、その機能がなかった場合よりも平均 0.013% (誤差寄与) 悪くなります。 。

私たちはこう推測するかもしれません (予測寄与と比較して) 誤差寄与が高いすべての特徴は、おそらく過剰適合していると考えられます。 または、一般に、トレーニング セットと検証セットでは動作が異なります。

どの機能の誤差寄与が最も大きいかを見てみましょう。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
エラー寄与率の降順に並べ替えられた機能。 [作者による画像]

 

そして、エラー寄与率が最も低い機能は次のとおりです。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
エラー寄与率の増加順に並べ替えられた機能。 [作者による画像]

 

興味深いことに、より高い誤差寄与率を持つすべての特徴は T-1 (観測時点の 1 日前) に関連しているのに対し、より小さい誤差寄与率を持つほとんどすべての特徴は T-22 (観測時点の 22 日前) に相対していることがわかります。 )。

これは次のことを示しているようです 最新の特徴は過剰適合する傾向がありますが、時間的に離れた特徴は一般化が良くなる傾向があります。.

Error Contribution がなければ、この洞察を知ることはできなかったことに注意してください。

従来の再帰的特徴除去 (RFE) 手法は、重要でない特徴の削除に基づいています。 これは、予測寄与度が小さい特徴を最初に削除することと同じです。

ただし、前の段落で述べたことに基づくと、エラー寄与率が最も高い機能を最初に削除する方が合理的です。

私たちの直感が検証されたかどうかを確認するために、XNUMX つのアプローチを比較してみましょう。

  • 従来の RFE: 無駄な機能を最初に削除する (最低の予測寄与)。
  • 当社の RFE: 有害な機能の削除 最初の (エラー寄与率が最も高い)。

検証セットの結果を見てみましょう。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
検証セット上の XNUMX つの戦略の平均絶対誤差。 [作者による画像]

 

各メソッドの最適なイテレーションは丸で囲まれています。これは、従来の RFE の 19 個の機能を備えたモデル (青い線) と、RFE の 17 個の機能を備えたモデル (オレンジ色の線) です。

一般に、私たちの方法はうまく機能しているようです。誤差寄与度が最も高い特徴を削除すると、予測寄与度が最も高い特徴を削除する場合と比較して、一貫して MAE が小さくなります。

ただし、検証セットを過剰適合しているため、これはうまく機能すると考えるかもしれません。 結局のところ、テスト セットで得られる結果に興味があるのです。

それでは、テスト セットで同じ比較を見てみましょう。

 

あなたの機能は重要ですか? それは彼らが良いという意味ではありません
テストセット上の XNUMX つの戦略の平均絶対誤差。 [作者による画像]

 

結果は前の結果と同様です。 XNUMX つのライン間の距離が短くても、最も高いエラー寄与因子を除去して得られた MAE は、最も低い予測寄与因子を除去して得られた MAE よりも明らかに優れています。

検証セットで MAE が最小になるモデルを選択したので、テスト セットでの結果を見てみましょう。

  • RFE 予測への貢献 (19 の機能)。 テストセットの MAE: 2.04。
  • RFE エラーの貢献 (17 個の機能)。 テストセットの MAE: 1.94。

したがって、私たちの方法を使用した最良の MAE は、従来の RFE と比較して 5% 優れています。

特徴量の重要性の概念は、機械学習において基本的な役割を果たします。 しかし、「重要性」という概念は、しばしば「善さ」と誤解されます。

これら XNUMX つの側面を区別するために、予測寄与と誤差寄与という XNUMX つの概念を導入しました。 どちらの概念も検証データセットの SHAP 値に基づいており、記事ではそれらを計算する Python コードについて説明しました。

また、実際の金融データセット (タスクが金の価格を予測する) でそれらを試したところ、誤差寄与度に基づく再帰的特徴除去により、予測寄与度に基づく従来の RFE と比較して平均絶対誤差が 5% 改善されることが証明されました。

この記事で使用されているすべてのコードは次の場所にあります。 このノートブック.

読んでくれてありがとう!

 
 
サミュエル・マザンティ Jakala の主任データ サイエンティストで、現在はローマに住んでいます。 彼は統計学を卒業しており、主な研究対象は業界向けの機械学習アプリケーションに関するものです。 フリーランスのコンテンツクリエイターでもあります。

 
元の。 許可を得て転載。
 

タイムスタンプ:

より多くの KDナゲット