问题描述
我有一个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到验证案例的总数。
我感到困惑的是,i
和j
实际上可以不同,并且我得到了一个看起来还不错的图。但是,难道它们不总是相同的索引吗?第i个基线目标是否应该始终与第i个目标的整形值进行比较?
我是否理解索引有误?
解决方法
i
和j
应该相同,因为您正在绘制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数组类型。
请询问是否不清楚。