Python, пакет 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()

Вот код, который у меня есть. Некоторые вещи не работают:

  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)

Изображение того, что я получаю:

2 ответа

      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)

У меня была та же проблема, что и у вас - в коде указано, что зависимость_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 - в этом случае вы получите все возможные тепловые карты Interactive_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 гарантирует, что последняя субфигурка будет перерисована правильно, без этого параметра она останется "сжатой", чтобы освободить место для несуществующих цветовых полос.

Другие вопросы по тегам