Python 树形加XGBoost-列表必须是整数或切片,而不是元组

Python 树形加XGBoost-列表必须是整数或切片,而不是元组,python,pandas,xgboost,Python,Pandas,Xgboost,我一直在试图找出如何使用树形来进一步评估我的XGBoost分类器。我在数据方面遇到了一些问题,这些问题必须是用户错误。我不明白是什么输入导致了这个 输入:shap.force_绘图(explainer.expected_值,shap_值[0,:],X.iloc[0,:])) 设置: import shap import numpy as np import matplotlib.pylab as pl # load JS visualization code to notebook shap.

我一直在试图找出如何使用树形来进一步评估我的XGBoost分类器。我在数据方面遇到了一些问题,这些问题必须是用户错误。我不明白是什么输入导致了这个

输入:shap.force_绘图(explainer.expected_值,shap_值[0,:],X.iloc[0,:]))

设置:

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

# load JS visualization code to notebook
shap.initjs()
explainer和shap_值的配置:

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
生成显示:

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

这是与形状值的生成有关的事情。我不明白我传递的X(数据帧)与他们在示例中使用波士顿数据集得到的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
[-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,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,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,0.]],dtype=32]

自述文件:


形状值是什么类型的?文件上说:

对于具有单个输出的模型,这将返回形状值矩阵(#样本x#特征)。每一行的总和等于该样本的模型输出与模型输出的预期值之间的差值(该值为常量时存储在解释程序的预期值属性中)。对于具有向量输出的模型,它返回此类矩阵的列表,每个输出一个矩阵


如果是第二种情况,那么它可能是一个列表(据我所知,它是python本机的),因此不能在执行时使用numpy索引(shap_值[0,:])。如果是这样的话,我认为您只需要执行shap_值[0]。让我知道这是否解决了您的问题。

您是对的。shap_值是一个列表。我用我在回答中告诉你的预期值和形状值的输出更新了这个问题,因为这是一个numpy数组列表,我想你可以用形状值[0]替换形状值[0,:]。是的,我试过了。这样做我也会出错。我想知道这是否与我的用例和我试图生成的数据/类有关。我显然不知道。罗宾是对的,这是我正在做分类的输出类型
print(explainer.expected_value)
print(shap_values) # Is a list as Robin Niel thought
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,:])