如何正确地使用带有多个回归目标的形状决策图和力图?

问题描述

我有一个Keras神经网络,它具有26个功能和100个目标,我想用SHAP python库进行解释。 例如,为了绘制力图,我这样做:

shap.force_plot(exp.expected_value[i],shap_values[j][k],x_val.columns)

位置:

  • exp.expected_values是大小为100的列表,其中包含我的每个目标的基本值(至少我了解)。我认为索引i指向第i个目标。
  • shap_values是指每个验证案例中每个目标的所有特征的Shapley值。因此,j的范围是0到99(即我目标的大小),而k的范围是0到验证案例的总数。

我感到困惑的是,ij实际上可以不同,并且我得到了一个看起来还不错的图。但是,难道它们不总是相同的索引吗?第i个基线目标是否应该始终与第i个目标的整形值进行比较? 我是否理解索引有误?

解决方法

ij应该相同,因为您正在绘制ith目标如何受要素(从基础到预测)的影响:

shap.force_plot(exp.expected_value[i],shap_values[i][k],x_val.columns)

其中:

  • i代表ith目标类别
  • k代表要解释的kth示例。

后面的原因是exp.expected_value的形状为num_targets,并且它们是要添加到其上的shap值的基本值,并且如果转换,shap值的形状应该为[num_classes,num_samples,num_features]到numpy数组。

例如,要获取原始空间中第k个数据点的整形值,可以这样做:

shap_values[:,k,:].sum(1) + base_values

,对于使用softmax进入概率空间的模型,可以这样做:

softmax(shap_values[:,:].sum(1) + base_values)

注意,这是假设shap_values是numpy数组类型。

请询问是否不清楚。