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

数据挖掘 机器学习 xgboost
2021-09-21 16:47:43

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

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

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

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

从 R 文档中,我了解到增益类似于信息增益,频率是在所有树中使用某个功能的次数。我不知道封面是什么。

我运行了链接中给出的示例代码(并且还尝试对我正在处理的问题执行相同的操作),但是那里给出的拆分定义与我计算的数字不匹配。

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
2个回答

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

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

  1. 增益意味着相应特征对模型的相对贡献,通过获取模型中每棵树的每个特征的贡献来计算与另一个特征相比,该指标的值越高意味着它对于生成预测更重要。
  2. Cover度量是指与该特征相关的观察的相对数量例如,如果您有 100 个观测值,4 个特征和 3 棵树,假设在 tree1、tree2 和 tree3 中分别使用 feature1 来决定 10、5 和 2 个观测值的叶子节点;那么该指标将将此特征的覆盖率计为 10+5+2 = 17 个观察值。这将针对所有 4 个功能进行计算,并且覆盖率将 17 表示为所有功能的覆盖率指标的百分比。
  3. 频率(/'Frequence') 是表示特定特征在模型树中出现的相对次数的百分比在上面的例子中,如果feature1出现2次分裂,则tree1、tree2和tree3各有1次分裂和3次分裂;那么特征 1 的权重将为 2+1+3 = 6。特征 1 的频率计算为其占所有特征权重的百​​分比权重。

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

这些度量都是相对的,因此总和为一个,R 中拟合的 xgboost 模型的一个示例是:

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

感谢 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)

输出 -

树堆

重要性矩阵

让我们尝试从树转储中计算 odor=none 在重要性矩阵 (0.495768965) 中的覆盖率。

使用 odor=none 的每个拆分的覆盖是节点 ID 0-0 处的 1628.2500 和节点 ID 1-1 处的 765.9390。

所有拆分的总覆盖率(树转储中覆盖列的总和)= 1628.2500*2 + 786.3720*2

重要性矩阵中气味的覆盖率=none = (1628.2500+765.9390)/(1628.2500*2+786.3720*2)

因此,我们确信覆盖是在所有拆分中计算的!