Дерево SHAP плюс XGBoost - список должен быть целым числом или фрагментом, а не кортежем - PullRequest
0 голосов
/ 07 апреля 2020

Я пытался выяснить, как использовать дерево SHAP для дальнейшей оценки моих классификаторов XGBoost. Я сталкиваюсь с некоторыми проблемами с данными, которые должны быть ошибкой пользователя. Я не понимаю, что из-за ввода вызывает это ...

Вход: shap.force_plot (объяснение.expect_value, shap_values ​​[0 ,:], X.iloc [0,:])

Настройка:

import shap
import numpy as np
import matplotlib.pylab as pl

# load JS visualization code to notebook
shap.initjs()

Конфигурация для объяснителя и shap_values:

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)

Создать отображение:

shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])

Ошибка :

Что-то происходит с генерацией shap_values. Я не понимаю, что было бы не так с X (фреймом данных), который я передаю, в отличие от того, который они получают, используя набор данных Бостона в их примере.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-28-dd74c29cab4f> in <module>
----> 1 shap.force_plot(explainer.expected_value, shap_values[0,:], mean_data.iloc[0,:])

TypeError: list indices must be integers or slices, not tuple

Вывод:

print(explainer.expected_value)
print(shap_values) # Is a list as Robin Niel thought

[- 0,84587, 1.0577996, 1.1045177]

[массив ([[0., 0., 0.,. .., 0., 0., 0.], [0., 0., 0., ..., 0., 0., 0.], [0., 0., 0., ... , 0., 0., 0.], ..., [0., 0., 0., ..., 0., 0., 0.], [0., 0., 0.,. .., 0., 0., 0.], [0., 0., 0., ..., 0., 0., 0.]], dtype = float32), массив ([[0., 0., 0., ..., 0., 0., 0.], [0., 0., 0., ..., 0., 0., 0.], [0., 0. , 0., ..., 0., 0., 0.], ..., [0., 0., 0., ..., 0., 0., 0.], [0., 0., 0., ..., 0., 0., 0.], [0., 0., 0., ..., 0., 0., 0.]], dtype = float32), массив ([[0., 0., 0., ..., 0., 0., 0.], [0., 0., 0., ..., 0., 0., 0.] , [0., 0., 0., ..., 0., 0., 0.], ..., [0., 0., 0., ..., 0., 0., 0 .], [0., 0., 0., ..., 0., 0., 0.], [0., 0., 0., ..., 0., 0., 0.] ], dtype = float32)]

Из README: https://github.com/slundberg/shap/blob/master/README.md

import xgboost
import shap

# load JS visualization code to notebook
shap.initjs()

# train XGBoost model
X,y = shap.datasets.boston()
model = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100)

# explain the model's predictions using SHAP
# (same syntax works for LightGBM, CatBoost, scikit-learn and spark models)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)

# visualize the first prediction's explanation (use matplotlib=True to avoid Javascript)
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])

1 Ответ

1 голос
/ 08 апреля 2020

Какие типы имеют shap_values? В do c:

указано, что для моделей с одним выходом возвращается матрица значений SHAP (# samples x # features). Каждая строка суммирует разницу между выходными данными модели для этого образца и ожидаемым значением выходных данных модели (которое сохраняется в атрибуте Ожидаемое_значение объяснителя, когда оно постоянное). Для моделей с векторными выходами это возвращает список таких матриц, по одной для каждого выхода.

Если вы находитесь во втором случае, это может быть список (поэтому python родной из того, что я понимаю ) и поэтому не может использовать индексирование numpy, как вы делаете (shap_values ​​[0 ,:]). Если это так, я думаю, вам просто нужно сделать shap_value [0]. Дайте мне знать, если это решило вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...