Python,shap包:如何绘制依赖图网格?

时间:2019-10-22 18:04:45

标签: python matplotlib shap

我正在尝试从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()

An example layout of what I want

这是我到目前为止的代码。有些事情不起作用:

  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)

我所得到的图像: What I am getting.

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我和您有同样的问题-code说Dependency_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的情况下,我还没有解决该怎么办-在这种情况下,您会在图形的末尾看到所有可能的interact_indexes热图,这看起来非常糟糕。

编辑:丑陋的骇客,但它似乎能解决问题-如果您为每个dependency_plots指定interaction_index,则它将为每个图绘制一个颜色条,进入最后一个子图,看上去很糟糕。

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

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