2

我有一个 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 个目标的形状值进行比较吗?我对索引的理解有误吗?

4

1 回答 1

0

i并且j应该是相同的,因为您正在绘制ith目标如何受特征影响,从基础到预测:

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

在哪里:

  • 我代表ith目标类
  • k 代表kth要解释的样本。

背后的原因是exp.expected_valueshape ,它们将是要添加到的 shap 值的基值,如果转换为 numpy 数组,则num_targetsshap 值应该是 shape 。[num_classes, num_samples, num_features]

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

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

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

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

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

请询问是否有不清楚的地方。

于 2020-12-03T04:16:12.873 回答