使用 SHAP 来解释 DNN 模型,但我的 summary_plot 只显示了每个特征的平均影响,并没有包括所有特征

Using SHAP to explain DNN model but my summary_plot is only showing the average impact of each feature and doesn't include all features

所以我正在生成一个 shap 摘要图,如下所示:

explainer = shap.KernelExplainer(model, X_test[:100,:])
shap_values = explainer.shap_values(X_test[:100,:])
fig = shap.summary_plot(shap_values, features=X_test[:100,:], feature_names=feature_names, show=False)
plt.savefig('test.png')

这可以正常工作并创建如下图:

这看起来不错,但有几个问题。通过阅读 shap summary_plots,我经常看到类似这样的内容:

如您所见 - 这看起来与我的有点不同。根据两个 summary_plots 底部的文本,我的似乎显示了每个特征的平均形状值,而我在网上看到的那些只是显示每个特征的每个单独的数据点 - 换句话说,我的那些网上看的比较细。

我如何创建一个 summary_plot 不显示每个特征的平均影响而只显示每个数据点?我认为 summary_plot() 必须有一个布尔参数,例如 use_average 或其他东西,但找不到任何东西。

此外,正如您在我的 summary_plot 中看到的那样 - y 轴上仅包含 20 个特征。我的模型实际上有大约 100 个特征,如果可能的话,我想将它们全部包含在 summary_plot 中。我认为 shap 默认显示 20,但我希望有办法增加这个数字。

我的理解是 shap.summary_plot 只绘制条形图,当模型有多个输出时,或者即使 SHAP 认为它有多个输出(在我的情况下是这样)。当我尝试使用 summary_plot 的 plot_type 选项将绘图强制为“点”时,它给了我一个解释这个问题的断言错误。

您可以尝试复制该错误消息:

shap.summary_plot(shap_values, x_train, plot_type='dot', show = False)

如果您遇到相同的错误,请对模型中的第一个输出变量尝试此操作:

shap.summary_plot(shap_values[0], x_train, show = False)

这似乎解决了我的问题。

至于尝试增加参数的数量,我相信 max_display 选项应该有所帮助,尽管我在 20 之后还没有尝试过(我的模型没有那么大):

shap.summary_plot(shap_values[0], x_train, max_display = 5, show = False)

希望对您有所帮助。祝你好运:)