xgboost模型的内部节点预测

Posted

技术标签:

【中文标题】xgboost模型的内部节点预测【英文标题】:Internal node predictions of xgboost model 【发布时间】:2019-08-18 14:26:13 【问题描述】:

是否可以计算 xgboost 模型的内部节点预测? R 包gbm 提供对每棵树的内部节点的预测。

但是,xgboost 输出仅显示模型最终叶的预测。

xgboost 输出:

请注意,Quality 列包含第 6 行中叶节点的最终预测值。我希望每个内部节点也有该值。

   Tree Node  ID    Feature    Split  Yes   No Missing     Quality  Cover
1:    0    0 0-0 Sex=female  0.50000  0-1  0-2     0-1 246.6042790 222.75
2:    0    1 0-1        Age 13.00000  0-3  0-4     0-4  22.3424225 144.25
3:    0    2 0-2   Pclass=3  0.50000  0-5  0-6     0-5  60.1275253  78.50
4:    0    3 0-3      SibSp  2.50000  0-7  0-8     0-7  23.6302433   9.25
5:    0    4 0-4       Fare 26.26875  0-9 0-10     0-9  21.4425507 135.00
6:    0    5 0-5       Leaf       NA <NA> <NA>    <NA>   0.1747126  42.50

R gbm 输出:

在 R gbm 包输出中,预测列包含叶节点 (SplitVar == -1) 和内部节点的值。我想从 xgboost 模型中访问这些值

   SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight   Prediction
0         1   0.000000000        1         8          15      32.564591    445  0.001132514
1         2   9.500000000        2         3           7       3.844470    282 -0.085827382
2        -1   0.119585850       -1        -1          -1       0.000000     15  0.119585850
3         0   1.000000000        4         5           6       3.047926    207 -0.092846157
4        -1  -0.118731665       -1        -1          -1       0.000000    165 -0.118731665
5        -1   0.008846912       -1        -1          -1       0.000000     42  0.008846912
6        -1  -0.092846157       -1        -1          -1       0.000000    207 -0.092846157

问题:

如何访问或计算 xgboost 模型内部节点的预测?我想将它们用于贪婪的穷人版 SHAP 分数。

【问题讨论】:

【参考方案1】:

解决这个问题的方法是用all_stats=True 转储xgboost json 对象。这会将cover 统计信息添加到输出中,该统计信息可用于通过内部节点分配叶点:

def _calculate_contribution(node: AnyNode) -> float32:
        if isinstance(node, Leaf):
            return node.contrib
        else:
            return (
                node.left.cover * Node._calculate_contribution(node.left)
                + node.right.cover * Node._calculate_contribution(node.right)
            ) / node.cover

内部贡献是子贡献的加权平均值。使用此方法,生成的结果与使用 pred_contribs=Trueapprox_contribs=True 调用 predict 方法时返回的结果完全匹配。

【讨论】:

您使用哪个函数来转储 xgboost 模型?我正在使用save_model,它没有参数all_stats

以上是关于xgboost模型的内部节点预测的主要内容,如果未能解决你的问题,请参考以下文章

简述树模型之决策树、随机森林、xgboost

R语言构建xgboost模型预测推理:输出预测概率预测标签

R语言构建文本分类模型:文本数据预处理构建词袋模型(bag of words)构建xgboost文本分类模型xgboost模型预测推理并使用混淆矩阵评估模型可视化模型预测的概率分布

R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理比较误分类率指标

GBDT与XGBoost

eli5 解释预测 XGBoost 模型