Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Feature Importanceによる特徴量選択とリーク

Jack
October 19, 2023

Feature Importanceによる特徴量選択とリーク

Jack

October 19, 2023
Tweet

More Decks by Jack

Other Decks in Technology

Transcript

  1. ALLPPT.com _ Free PowerPoint Templates, Diagrams and Charts Jack (Japan)

    https://www.kaggle.com/rsakata Feature Importanceによる 特徴量選択とリーク 2023/10/20 関西Kaggler会 #3
  2. 今回生成した人工データ • データ数 – Train: 50,000, Test: 50,000 • ターゲット

    – 各レコードに対して20個ずつ正規乱数(σ=1.0)を生成し、その平均が0より大 きいか小さいか(均衡な二値分類タスク) • 特徴量 ① 上記20個の正規乱数に正規乱数ノイズ(σ=2.0)を上乗せしたもの ② + 上記特徴量にさらに正規乱数ノイズ(σ=1.0)を上乗せしたもの×10(劣化特 徴量) – つまり、特徴量数は 20 + 200 = 220
  3. 実験条件 • モデル – LightGBM • 評価指標 – Log-Loss, ROC-AUC

    • バリデーション – 5-fold CV × 5 seeds(ランダム性を低減するため、ただしCV分割は変えない) • 特徴量選択 – 後述 hyperparameter learning_rate 0.1 (default) feature_fraction 0.5 early_stopping_rounds 100 その他 default
  4. 事前検証:特徴量選択を行わない場合 ① 20特徴量だけ使った場合 ② 劣化特徴量を加えた場合(全220特徴量) Log-Loss AUC CV Score 0.6320

    ± 0.0001 0.6945 ± 0.0002 Test (単モデル予測) 0.6315 ± 0.0005 0.6951 ± 0.0007 Test (CV平均)※参考値 0.6292 ± 0.0001 0.6990 ± 0.0002 Log-Loss AUC CV Score 0.6332 ± 0.0001 0.6925 ± 0.0001 Test (単モデル予測) 0.6333 ± 0.0003 0.6922 ± 0.0005 Test (CV平均)※参考値 0.6304 ± 0.0001 0.6970 ± 0.0001 多数の劣化特徴量を 含めることで、やや スコア悪化している ただし、CV/Testに 大きな乖離は無い
  5. 事前検証:特徴量選択を行わない場合 ① 20特徴量だけ使った場合 ② 劣化特徴量を加えた場合(全220特徴量) Log-Loss AUC CV Score 0.6320

    ± 0.0001 0.6945 ± 0.0002 Test (単モデル予測) 0.6315 ± 0.0005 0.6951 ± 0.0007 Test (CV平均)※参考値 0.6292 ± 0.0001 0.6990 ± 0.0002 Log-Loss AUC CV Score 0.6332 ± 0.0001 0.6925 ± 0.0001 Test (単モデル予測) 0.6333 ± 0.0003 0.6922 ± 0.0005 Test (CV平均)※参考値 0.6304 ± 0.0001 0.6970 ± 0.0001 多数の劣化特徴量を 含めることで、やや スコア悪化している ただし、CV/Testに 大きな乖離は無い 期待:特徴量選択により劣化特徴量を 除外できればスコア回復しそう?
  6. 検証1:CV全体で特徴量選択 • LightGBMのGain ImportanceのCV平均値 (5-fold CV × 5 seeds) を計算し、

    上位100個の特徴量を選択 Log-Loss AUC CV Score 0.6317 ± 0.0002 0.6951 ± 0.0003 Test (単モデル予測) Test (CV平均)※参考値 Log-Loss AUC CV Score 0.6332 ± 0.0001 0.6925 ± 0.0001 Test (単モデル予測) 0.6333 ± 0.0003 0.6922 ± 0.0005 Test (CV平均)※参考値 0.6304 ± 0.0001 0.6970 ± 0.0001 特徴量選択 (再掲) CV改善!
  7. 検証1:CV全体で特徴量選択 • LightGBMのGain ImportanceのCV平均値 (5-fold CV × 5 seeds) を計算し、

    上位100個の特徴量を選択 Log-Loss AUC CV Score 0.6317 ± 0.0002 0.6951 ± 0.0003 Test (単モデル予測) 0.6341 ± 0.0004 0.6909 ± 0.0006 Test (CV平均)※参考値 0.6314 ± 0.0001 0.6954 ± 0.0003 Log-Loss AUC CV Score 0.6332 ± 0.0001 0.6925 ± 0.0001 Test (単モデル予測) 0.6333 ± 0.0003 0.6922 ± 0.0005 Test (CV平均)※参考値 0.6304 ± 0.0001 0.6970 ± 0.0001 特徴量選択 (再掲) Testはむしろ悪化… (=リークの発生)
  8. 検証2:CVのfold毎に特徴量選択 • LightGBMのGain Importanceの平均値をfold毎 (5 seeds) に計算し、 上位100個の特徴量をfold毎に選択 Log-Loss AUC

    CV Score 0.6338 ± 0.0003 0.6916 ± 0.0004 Test (単モデル予測) 0.6341 ± 0.0003 0.6909 ± 0.0006 Test (CV平均)※参考値 0.6309 ± 0.0001 0.6963 ± 0.0002 特徴量選択 (再掲) CVとTestの乖離は 小さくて済む 判断を誤らない! Log-Loss AUC CV Score 0.6332 ± 0.0001 0.6925 ± 0.0001 Test (単モデル予測) 0.6333 ± 0.0003 0.6922 ± 0.0005 Test (CV平均)※参考値 0.6304 ± 0.0001 0.6970 ± 0.0001
  9. ここまでの結果の整理 • 期待に反して、特徴量重要度を用いた特徴量選択で、予測精度はむしろ悪 化した(有効な特徴量20に対して100を選択したが、それでもダメ) – 必ず効果が無いとは言い切れないが、経験的によく知られている話 – ただ、これは今回のメインメッセージではない • 一方、精度改善ではなく、学習・推論時間の短縮、モデルの軽量化などを

    目的に、特徴量選択をやりたい場面がある(某PSPコンペ) – できる限り精度低下しないギリギリを攻めたい(CVでの判断が必要) • そういったときに、特徴量選択はCVの分割毎にやらないと、CVとTestでス コアの傾向が乖離する恐れがある – 某PSPコンペでは数千の特徴を数百に絞る必要があったため、先述の方法を 採った(CV平均で試してみると、案の定同じ現象に遭遇した)
  10. なぜリークするのか?(続) • 特徴量選択にバリデーションデータのノイズ情報が含まれていたとしても、 splitting point や leaf weight の情報も無いと、その情報は活かせないのでは? 個人的な理解

    • 特徴量重要度はそのときの学習データ全体で計算されるものなので、特徴量ノイズとターゲット の関係性が、学習データ全体で(たまたま)一致しているほど、その特徴量重要度は大きくなる • つまり、fold間で非本質的なノイズの相関がある特徴量ほど、より上位に来る可能性が高い • 結果的に、学習データでご一緒した他のfoldの特徴量ノイズから、間接的にバリデーションデー タのノイズ情報を拾うことができてしまう → 学習データに回ったときの情報を使わなければOK この特徴量のノイズは ターゲットと相関してますよ リークさん どこで切ったらいいか わからないじゃない! とはならないのか?
  11. Permutation Importanceの場合は? • Permutation Importanceのように、バリデーションデータを使って重要度 を算出するようなタイプの場合、当該foldの情報を使うのはむしろアウト – ノイズを拾ってバリデーションスコアが上がるような特徴量を直接的に選択す ることになるので •

    じゃあ逆に、学習データに回ったときのみの情報を使えばいい? – つまり、5-fold CVであれば、自身がバリデーションデータに回ったとき以外の 4fold分の情報を使って特徴量選択を行えばいいのでは?
  12. 検証3:CV全体で特徴量選択 • バリデーションデータに対するPermutation ImportanceのCV平均値 (5-fold CV × 5 seeds) を計算し、上位100個の特徴量を選択

    Log-Loss AUC CV Score 0.6317 ± 0.0002 0.6949 ± 0.0003 Test (単モデル予測) 0.6342 ± 0.0005 0.6907 ± 0.0007 Test (CV平均)※参考値 0.6314 ± 0.0002 0.6952 ± 0.0002 Log-Loss AUC CV Score 0.6332 ± 0.0001 0.6925 ± 0.0001 Test (単モデル予測) 0.6333 ± 0.0003 0.6922 ± 0.0005 Test (CV平均)※参考値 0.6304 ± 0.0001 0.6970 ± 0.0001 特徴量選択 (再掲) 当然、CV平均を使うと Perm. Importanceでも 同様の問題が生じる
  13. 検証4:CVのfold毎に特徴量選択 • 当該fold以外のPermutation Importanceの平均値 (4 folds × 5 seeds) を

    計算し、上位100個の特徴量をfold毎に選択 Log-Loss AUC CV Score 0.6318 ± 0.0001 0.6949 ± 0.0003 Test (単モデル予測) 0.6341 ± 0.0004 0.6909 ± 0.0006 Test (CV平均)※参考値 0.6310 ± 0.0002 0.6960 ± 0.0002 Log-Loss AUC CV Score 0.6332 ± 0.0001 0.6925 ± 0.0001 Test (単モデル予測) 0.6333 ± 0.0003 0.6922 ± 0.0005 Test (CV平均)※参考値 0.6304 ± 0.0001 0.6970 ± 0.0001 特徴量選択 (再掲) CVとTestは乖離したまま… これでもやっぱりダメ!?
  14. まとめ • 特徴量重要度で特徴量選択を行うことによる精度向上は、期待しない方がよい – 背景知識による特徴量選択は有効なことがあるので、特徴量選択そのものを否定するわけで はない • 他の理由で特徴量選択を行いたい場合、以下を守る方が、精度評価の意味では安全 – CVのfold毎に特徴量選択を行う

    – バリデーションデータを元に算出するタイプの重要度を使わない • もちろん、Gain ImportanceよりもPermutation Importanceを使いたい場面もある ので、これまでの議論はあくまで一つの観点に過ぎない • 一連の実験結果はこちら(Speaker Deck上ではリンクが効かない…) – https://www.kaggle.com/code/rsakata/feature-importance