xgboost模型的内部节点预测

时间:2019-03-27 21:52:52

标签: xgboost gbm

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

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

xgboost输出:

请注意,“质量”列对第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 个答案:

答案 0 :(得分:0)

此问题的解决方案是使用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调用预测方法时返回的结果完全匹配。