3

我正在尝试从shap包中绘制一个依赖图网格。这是我想要的示例的 MWE 代码:

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)

我得到的图像: 我得到了什么。

4

2 回答 2

3
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)
于 2021-01-13T22:02:07.013 回答
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- 在这种情况下,您将在图的末尾获得所有可能的interaction_indexes 热图,这看起来非常糟糕。

编辑:丑陋的黑客,但它似乎做了交易 - 如果你为每个依赖图指定交互索引,那么它将为每个图绘制一个颜色条到最后一个子图,这看起来很糟糕。

我最终手动删除了轴(每个颜色条是一个附加轴),然后自动重新调整了子图:

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 将确保正确重绘最后一个子图,如果没有此参数,它将保持“挤压”状态,为不存在的颜色条腾出空间。

于 2020-03-23T08:13:58.600 回答