和風ましらに

機械学習とか勉強したことを書き認めるブログ

機械学習を活用した変数重要度評価

モデルを作った後、説明する際に

「ここら辺の特徴量が効いてます。」 的なことを言わないといけない。

そこで、変数重要度をよく使う。

ランダムフォレストやXGboostでの変数の重要度評価をメモがてらまとめてみた。

RandomForestを活用した変数重要度評価

RandomForestについての整理

  1. ブートストラップサンプルを作成する
  2. ランダムに変数選択を行い、1.の各サンプルに対し木を構築する
  3. ジニ係数を最小化させる方向に、学習を進めていく
  4. 最後は、多数決で評価・識別(予測)を行う

RandomForestを使った変数評価

変数の重要度は、分岐に使用する変数を入れ替えた際、ジニ係数にどれくらい影響があるかを見ている。(多分)

特徴量が出てくる回数とかではないので、多重共線性があっても重要度は変化しない。
要は、「多重共線性が存在しても、変数間の重要度の順位関係は保存される。」ということ。
そこらへんの話は、この論文に詳しく載ってる。 Variable selection using random forests

XGboostを活用した変数重要度評価

XGboostについての整理

ジニ係数を小さくさせて学習するRandomForestとは違い、Xgboostは損失関数を小さくする向きに学習を進める。

XGboostを使った重要度

XGboostの重要度の定義には、weight, gain, cover の3つがある

  • weight:全学習木で、特徴量が分岐に使用された回数
  • gain:Nodeでの以下の式で定義付けられる値の減少度の平均 gain gradientとhessianの意味が、ちょっと何言ってるか分かんない場合は、 とりま損失関数を最小化させる方向に寄与する特徴量を、いい感じに評価してる程度に理解しておけば良いかと。

    たぶん、RandomForestのジニ係数での評価に近い概念
    参考にした文章: Introduction to Boosted Trees

  • cover:各Nodeにおいて、変数を使って分けたデータの数 この指標の定義が、どこを探しても見つからなかったので感覚での記述。
    多分、学習をさせる中でどれくらいのデータを識別するのに特徴量が使われたかの指標のこと。

おそらく、以下のイメージ。(間違ってたらごめんなさい。)

ここだと、特徴量1がcover 100, 特徴量2がcover 50っていう理解。 あとは、全体の集計・平均すれば出る。

一応、このQAを参考。 https://datascience.stackexchange.com/questions/12318/how-do-i-interpret-the-output-of-xgboost-importance