如何解释XGBoost重要性的输出?


36

我运行了一个xgboost模型。我不完全知道如何解释的输出xgb.importance

增益,覆盖率和频率的含义是什么,我们如何解释它们?

另外,Split,RealCover和RealCover%是什么意思?我在这里有一些额外的参数

还有其他参数可以告诉我有关功能重要性的更多信息吗?

从R文档中,我了解到“增益”类似于“信息增益”,“频率”是在所有树中使用某个功能的次数。我不知道什么是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

Answers:


38

根据您的问题,我假设您正在使用xgboost来拟合增强树以进行二进制分类。重要性矩阵实际上是一个data.table对象,第一列列出了在提升树中实际使用的所有功能的名称。

重要性数据表的含义如下:

  1. 增益意味着相应的功能来采取各要素的贡献为模型中的每个树计算模型的相对贡献。与其他功能相比,此指标的值越高,表示生成预测就越重要。
  2. 指标的手段与此功能的观测相对数。例如,如果您有100个观测值,4个要素和3棵树,并且假定feature1用于确定tree1,tree2和tree3中10、5和2个观测值的叶节点;则该指标会将该功能的覆盖率计算为10 + 5 + 2 = 17个观察值。这将针对所有4个功能进行计算,其覆盖率将以所有功能的覆盖率指标的百分比表示为17。
  3. 频率(/“频”)是代表的倍的相对数量的特定特征在模型的树木发生的百分比。在上面的示例中,如果feature1出现在2个拆分中,则tree1,tree2和tree3分别出现1个拆分和3个拆分。那么Feature1的权重将为2 + 1 + 3 =6。Feature1的频率以其权重占所有特征权重的百​​分比计算。

增益是解释每个功能的相对重要性的最相关属性。

这些度量都是相对的,因此全部加起来为一个,R中拟合的xgboost模型的示例为:

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

1
覆盖率仅基于叶节点或所有拆分计算?
fanfabbb '16

3

感谢Sandeep的详细回答。我想纠正的是,覆盖范围是跨所有拆分计算的,而不仅仅是叶节点。

让我们来看一个简单的示例,其中包含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)

因此,我们确定保障是在所有拆分中计算的!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.