Python, shap包:如何绘制依赖关系图表的网格?

4

我想绘制一个依赖图的网格,使用shap软件包。这是我想要的示例代码的最小可行版本:

fig, axs = plt.subplots(2,8, figsize=(16, 4), facecolor='w', edgecolor='k') # figsize=(width, height)
fig.subplots_adjust(hspace = .5, wspace=.001)

axs = axs.ravel()

for i in range(10):

    axs[i].contourf(np.random.rand(12,12),5,cmap=plt.cm.Oranges)
    axs[i].set_title(str(250+i))

plt.show()

我想要的样式的示例布局

这是我目前拥有的代码,但有一些问题:

  1. 我的网格图的图像大小没有受到我的figsize参数的影响。
  2. 我的代码在网格图下面绘制了更大的版本。
  3. 只有一个依赖图显示在网格中。
fig, axs = plt.subplots(1,8, figsize=(4, 2))
axs = axs.ravel()

for b in X_test.columns[:3]:
    for a in X_test.columns[:3]:
        shap.dependence_plot((a, b), shap_interaction_values, X_test)

An image of what I am getting: What I am getting.

2个回答

8
import shap
import matplotlib.pyplot as plt

X = ...
shap_values = ...

columns = X.columns

# adjust nrows, ncols to fit all your columns
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(20, 14))
axes = axes.ravel()

for i, col in enumerate(columns):
    shap.dependence_plot(col, shap_values, X, ax=axes[i], show=False)

1
我和你遇到了同样的问题-代码中写到dependence_plot可以加一个可选参数ax。
因此,你可以创建子图并将随后的绘图放入其中:


fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
shap.dependence_plot((a, b), shap_interaction_values, X_test, ax=ax1)
shap.dependence_plot((a, b), shap_interaction_values, X_test, ax=ax2)


在您的情况下,您可以将轴和列一起压缩使用zip()函数。
我还没有解决在使用interaction_index时应该怎么做的问题 - 在这种情况下,您将在图的末尾得到所有可能的交互索引热力图,这看起来非常糟糕。
编辑:丑陋的hack但似乎能够解决问题 - 如果您为每个dependence_plots指定interaction_index,则它将在最后一个子图中为每个绘图绘制一个colorbar,这看起来很糟糕。
最终,我手动删除了轴(每个colorbar是一个额外的轴),然后自动调整了子图。
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, constrained_layout=True)
shap.dependence_plot((a, b), shap_interaction_values, X_test, ax=ax1)
shap.dependence_plot((a, b), shap_interaction_values, X_test, ax=ax2)
fig.axes[-1].remove()
fig.axes[-1].remove()

这将取消所有色条,而constrained_layout=True将确保最后一个子图正确重新绘制,如果没有此参数,它将保持“挤压”以腾出不存在的色条的空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接