Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Feature Importanceによる特徴量選択とリーク
Search
Jack
October 19, 2023
Technology
9.3k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Feature Importanceによる特徴量選択とリーク
Jack
October 19, 2023
More Decks by Jack
See All by Jack
shake-upを科学する
rsakata
13
3.3k
How to encode categorical features for GBDT
rsakata
8
16k
Kaggle Meetup #4 Lightning Talks
rsakata
9
5.7k
Santander Product RecommendationのアプローチとXGBoostの小ネタ
rsakata
29
52k
Other Decks in Technology
See All in Technology
オンラインゲームのシステム全体像 - コロプラ 2026年度 新卒研修
colopl
0
1.1k
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
550
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
590
DGX Spark でどこまでハッキングができるのか?
kash1064
0
440
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.2k
今さら理解するウェブフォントver.2026
takanorip
3
670
パッチ更新でterraform initが落ちた日
grimoh
1
120
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
3
700
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
830
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.7k
並行性の問題を防げ!実践トランザクション入門
occhi
0
280
遠藤な_めぐろLT #38 「社内のAI活用推進」@麻布台_20261009
endonanana
0
110
Featured
See All Featured
Side Projects
sachag
456
43k
The Limits of Empathy - UXLibs8
cassininazir
2
710
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
620
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
730
Test your architecture with Archunit
thirion
2
2.4k
Done Done
chrislema
187
17k
How to make the Groovebox
asonas
2
2.5k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
440
Transcript
ALLPPT.com _ Free PowerPoint Templates, Diagrams and Charts Jack (Japan)
https://www.kaggle.com/rsakata Feature Importanceによる 特徴量選択とリーク 2023/10/20 関西Kaggler会 #3
主旨 • 特徴量選択をCV全体でやるとリークするというお話 • X(旧Twitter)上では時折指摘される内容ではあるが、具体的な事 例抜きに言葉だけで説明されても、いまいちピンと来ない人も多い のでは? • 本資料では、簡単な人工データで検証を行った結果を共有する •
実は、ちゃんと考えると意外に難しい問題
今回生成した人工データ • データ数 – Train: 50,000, Test: 50,000 • ターゲット
– 各レコードに対して20個ずつ正規乱数(σ=1.0)を生成し、その平均が0より大 きいか小さいか(均衡な二値分類タスク) • 特徴量 ① 上記20個の正規乱数に正規乱数ノイズ(σ=2.0)を上乗せしたもの ② + 上記特徴量にさらに正規乱数ノイズ(σ=1.0)を上乗せしたもの×10(劣化特 徴量) – つまり、特徴量数は 20 + 200 = 220
y ターゲット因子 特徴量 劣化特徴量 データ生成の概念図 正規乱数 (σ=1.0) 平均が0以上か否か +正規乱数 (σ=2.0)
+正規乱数 (σ=1.0) ×10
実験条件 • モデル – 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
事前検証:特徴量選択を行わない場合 ① 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に 大きな乖離は無い
事前検証:特徴量選択を行わない場合 ① 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に 大きな乖離は無い 期待:特徴量選択により劣化特徴量を 除外できればスコア回復しそう?
検証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改善!
検証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はむしろ悪化… (=リークの発生)
なぜリークするのか? • Gain Importanceは、学習データのノイズ※も含めてフィッティングした結果、算出 されたもの • CVにおけるバリデーションデータは、当然他のfoldでは学習データに含まれている • 特徴量重要度をCV全体で平均してしまうと、バリデーションデータのノイズ情報も 入り込んでしまい、それが反映された特徴量選択になってしまう
この特徴量のノイズは ターゲットと相関してますよ リークさん ※ノイズの例:ターゲットと真に相関は無くても、データが 少数だとたまたま相関係数が出てしまうなど
検証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
ここまでの結果の整理 • 期待に反して、特徴量重要度を用いた特徴量選択で、予測精度はむしろ悪 化した(有効な特徴量20に対して100を選択したが、それでもダメ) – 必ず効果が無いとは言い切れないが、経験的によく知られている話 – ただ、これは今回のメインメッセージではない • 一方、精度改善ではなく、学習・推論時間の短縮、モデルの軽量化などを
目的に、特徴量選択をやりたい場面がある(某PSPコンペ) – できる限り精度低下しないギリギリを攻めたい(CVでの判断が必要) • そういったときに、特徴量選択はCVの分割毎にやらないと、CVとTestでス コアの傾向が乖離する恐れがある – 某PSPコンペでは数千の特徴を数百に絞る必要があったため、先述の方法を 採った(CV平均で試してみると、案の定同じ現象に遭遇した)
なぜリークするのか?(続) • 特徴量選択にバリデーションデータのノイズ情報が含まれていたとしても、 splitting point や leaf weight の情報も無いと、その情報は活かせないのでは? 個人的な理解
• 特徴量重要度はそのときの学習データ全体で計算されるものなので、特徴量ノイズとターゲット の関係性が、学習データ全体で(たまたま)一致しているほど、その特徴量重要度は大きくなる • つまり、fold間で非本質的なノイズの相関がある特徴量ほど、より上位に来る可能性が高い • 結果的に、学習データでご一緒した他のfoldの特徴量ノイズから、間接的にバリデーションデー タのノイズ情報を拾うことができてしまう → 学習データに回ったときの情報を使わなければOK この特徴量のノイズは ターゲットと相関してますよ リークさん どこで切ったらいいか わからないじゃない! とはならないのか?
Permutation Importanceの場合は? • Permutation Importanceのように、バリデーションデータを使って重要度 を算出するようなタイプの場合、当該foldの情報を使うのはむしろアウト – ノイズを拾ってバリデーションスコアが上がるような特徴量を直接的に選択す ることになるので •
じゃあ逆に、学習データに回ったときのみの情報を使えばいい? – つまり、5-fold CVであれば、自身がバリデーションデータに回ったとき以外の 4fold分の情報を使って特徴量選択を行えばいいのでは?
検証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でも 同様の問題が生じる
検証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は乖離したまま… これでもやっぱりダメ!?
なぜダメだったのか? • 「学習データで分割した結果」を「バリデーションデータで評価」してい る時点で、どうしても両者のノイズの共通傾向を拾ってしまう • 原理的に、バリデーションデータで算出するタイプの重要度で特徴量選択 を行うと、どうあがいてもCVが不当に上がってしまう と理解しています(ちょっと自信無いけど… )
まとめ • 特徴量重要度で特徴量選択を行うことによる精度向上は、期待しない方がよい – 背景知識による特徴量選択は有効なことがあるので、特徴量選択そのものを否定するわけで はない • 他の理由で特徴量選択を行いたい場合、以下を守る方が、精度評価の意味では安全 – CVのfold毎に特徴量選択を行う
– バリデーションデータを元に算出するタイプの重要度を使わない • もちろん、Gain ImportanceよりもPermutation Importanceを使いたい場面もある ので、これまでの議論はあくまで一つの観点に過ぎない • 一連の実験結果はこちら(Speaker Deck上ではリンクが効かない…) – https://www.kaggle.com/code/rsakata/feature-importance