XGBoostの重要性の出力を解釈する方法は?


37

xgboostモデルを実行しました。の出力を解釈する方法が正確にはわかりませんxgb.importance

ゲイン、カバー、および周波数の意味は何ですか?それらをどのように解釈しますか?

また、Split、RealCover、およびRealCover%はどういう意味ですか?ここにいくつかの追加パラメーターがあります

機能の重要性についてさらに詳しく説明できる他のパラメーターはありますか?

Rのドキュメントから、GainはInformation gainに似ており、Frequencyはすべてのツリーで機能が使用される回数であることがある程度理解できます。Coverが何なのかわかりません。

リンクで指定されたサンプルコードを実行しました(そして、私が取り組んでいる問題でも同じことを試みました)が、そこに指定された分割定義は、計算した数値と一致しませんでした。

importance_matrix

出力:

           Feature         Gain        Cover    Frequence
  1:            xxx 2.276101e-01 0.0618490331 1.913283e-02
  2:           xxxx 2.047495e-01 0.1337406946 1.373710e-01
  3:           xxxx 1.239551e-01 0.1032614896 1.319798e-01
  4:           xxxx 6.269780e-02 0.0431682707 1.098646e-01
  5:          xxxxx 6.004842e-02 0.0305611830 1.709108e-02

214:     xxxxxxxxxx 4.599139e-06 0.0001551098 1.147052e-05
215:     xxxxxxxxxx 4.500927e-06 0.0001665320 1.147052e-05
216:   xxxxxxxxxxxx 3.899363e-06 0.0001536857 1.147052e-05
217: xxxxxxxxxxxxxx 3.619348e-06 0.0001808504 1.147052e-05
218:  xxxxxxxxxxxxx 3.429679e-06 0.0001792233 1.147052e-05

回答:


40

あなたの質問から、あなたはxgboostを使用してブーストされたツリーをバイナリ分類に適合させると仮定しています。重要度マトリックスは、実際には、ブーストされたツリーで実際に使用されるすべての機能の名前をリストする最初の列を持つdata.tableオブジェクトです。

重要度データテーブルの意味は次のとおりです。

  1. ゲインは、モデル内の各ツリーの各機能の貢献を取ることによって計算モデルに対応する特徴の相対的な寄与を意味します。別の機能と比較した場合、このメトリックの値が高いことは、予測の生成にとって重要であることを意味します。
  2. カバーメトリックは、この機能に関連する観測の相対数を意味します。たとえば、100個の観測値、4つの特徴、3つのツリーがあり、それぞれfeature1を使用してtree1、tree2、tree3の10、5、2個の観測のリーフノードを決定するとします。メトリックは、この機能のカバーを10 + 5 + 2 = 17観測としてカウントします。これは、4つの機能すべてについて計算され、カバーは、すべての機能のカバーメトリックのパーセンテージとして表されます。
  3. 周波数(/「度数」)は、特定の特徴がモデルの木に発生回数の相対数を表すパーセンテージです。上記の例で、feature1が2つの分割で発生した場合、tree1、tree2、tree3のそれぞれで1つの分割と3つの分割が発生します。フィーチャ1の重みは2 + 1 + 3 = 6になります。フィーチャ1の頻度は、すべてのフィーチャの重みに対する重みの割合として計算されます。

ゲインは、各機能の相対的な重要性を解釈するのに最も関連する属性です。

メジャーはすべて相対的であるため、合計は1になります。Rの近似xgboostモデルの例は次のとおりです。

> sum(importance$Frequence)
[1] 1
> sum(importance$Cover)
[1] 1
> sum(importance$Gain)
[1] 1

1
カバーは、リーフノードまたはすべての分割に基づいてのみ計算されますか?
fanfabbb 16

3

詳細な回答をありがとう。カバーがリーフノードだけでなく、すべてのスプリットで計算されることを修正したいと思います。

xgboostライブラリによって提供されるデータを使用した簡単な例を見てみましょう。

library('xgboost')

data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')

train <- agaricus.train
test <- agaricus.test

X = train$data

y = train$label

bst <- xgboost(data = X, label = y, max.depth = 2,
           eta = 1, nthread = 2, nround = 2,objective = "binary:logistic",
           reg_lambda = 0, reg_alpha = 0)

xgb.model.dt.tree(agaricus.train$data@Dimnames[[2]], model = bst)

xgb.importance(agaricus.train$data@Dimnames[[2]], bst)

出力-

ツリーダンプ

重要度マトリックス

ツリーダンプから重要度マトリックス(0.495768965)のodor = noneのカバーを計算してみましょう。

odor = noneが使用される各分割のカバーは、ノードID 0-0で1628.2500、ノードID 1-1で765.9390です。

すべての分割の合計カバー(ツリーダンプのカバー列全体の合計)= 1628.2500 * 2 + 786.3720 * 2

重要度マトリックスの匂いのカバー=なし=(1628.2500 + 765.9390)/(1628.2500 * 2 + 786.3720 * 2)

したがって、カバーはすべての分割にわたって計算されると確信しています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.