feature_fractionが変数重要度に与える影響
LightGBMのfeature_fractionは重要度に影響与えるよ〜という話を聞いたので実験。テストデータはkaggleのHousePricesをお借りする。
feature_fractionとは
・LightGBM will randomly select part of features on each iteration (tree) if feature_fraction smaller than 1.0. For example, if you set it to 0.8, LightGBM will select 80% of features before training each tree
・can be used to speed up training
・can be used to deal with over-fitting
https://lightgbm.readthedocs.io/en/latest/Parameters.html
ということで、木ごとに特徴量のサンプリングを行うもの。学習速度向上と過学習の抑制に効果がある。
実験
以下がその結果の変数重要度。全体をベタっと貼る。
青色がfeature_fraction1.0、橙色が0.5、緑色が0.1。
重要度の高いものを見ると特に重要度の高かったOverallQualがfeature_fractionが小さく設定されるにつれ、そのfeature_fraction内での重要度が相対的に低くなっている。
下位の特徴量ではfeature_fraction1.0の場合は急激に下がっていくのに対して、0.1ではあまり下がらずより広い範囲に重要度が散らばっている。
同じデータ、同じvalidationの切り方、同じモデルでもかなり印象が異なる。
人口データで実験
sklearnのmake_classifitacionを使用して生成したデータでも実験。サンプルサイズ10,000、特徴量20個、意味のある特徴量の数(n_informative)は3個、クラスごとのクラスターの数(n_clusters_per_class)は1。
make_classificationは前にkaggleで使用されたことがあった。
https://www.kaggle.com/cdeotte/3-clusters-per-class-0-975
https://www.kaggle.com/c/instant-gratification/discussion/96519
CVの方法などは全てHousePricesと同じ条件で実験。
結果は以下の通り。
なぜfeature_fractionが重要度に影響するのか?
HousePricesで言うと目的変数であるSalePriceを予測するのにOverallQualがめちゃくちゃ効くけど、feature_fractionの結果、ある木ではOverallQualが特徴量として使われていないため他の特徴量でなんとか学習するしかなく、全特徴量を使った時には比較的重要度の低かった特徴量にも重要度が振られるようになる、ということらしい。今回は試せていないけどborutaやらnull importanceやらにしたらまた結果が変わるかもしれない。
この辺のことちゃんと書いてあるのあったら教えてください。
終わり
重要度を解釈する時にfeature_fractionの値によって、重要度に影響が出る。解釈する時にはそのことを考慮しながら行う。もしくは重要度の解釈時のみ1.0にしておくとかだろうか。