Прогнозы внутреннего узла модели xgboost

Можно ли рассчитать прогнозы внутреннего узла модели 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 ГБм:

В выходных данных пакета 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.


person Zelazny7    schedule 27.03.2019    source источник


Ответы (1)


Решение этой проблемы - сбросить json-объект xgboost с all_stats=True. Это добавляет статистику 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=True и approx_contribs=True.

person Zelazny7    schedule 17.08.2020