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()
Вот код, который у меня есть. Некоторые вещи не работают:
- Размер рисунка моей сетки не зависит от моих
figsize
аргументы - Мой код отображает более крупные версии моих графиков под сеткой.
- В сетке отображается только один из графиков зависимости.
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 гарантирует, что последняя субфигурка будет перерисована правильно, без этого параметра она останется "сжатой", чтобы освободить место для несуществующих цветовых полос.