Я создал модель GAM, используя библиотеку pygam, давайте назовем мою модель “gam”. Я создаю графики частичной зависимости из моей модели, чтобы показать частичные эффекты от каждой переменной, используя код ниже на Python.
Из опыта работы с программой R, графики частичной зависимости показывают “rug plot” на оси x, демонстрируя распределение точек данных для каждой переменной. Это кажется довольно автоматическим в R, когда я строю графики частичной зависимости.
Однако в Python, используя библиотеку pygam, мои графики частичной зависимости не показывают ‘rug’ или распределение точек данных на оси x. Есть ли способ добавить это при построении графиков с помощью pygam в Python?
Вот код, который я использую в Python для построения графиков частичной зависимости из моей модели ‘gam’:
Построить графики частичной зависимости.
скриншот кода в моей среде разработки
# код модели gam выше
# ПЛОТ ДЛЯ ТЕСТА
# Установите размер фигуры
titles = ['1','2','3','4','5','6','7', '8', '9', '10', '11', '12']
# plt.rcParams['figure.figsize'] = (25, 25)
fig, axs = plt.subplots(nrows=4, ncols=3, figsize=(20, 20), layout="constrained")
axs = axs.flatten()
# Построим графики частичной зависимости.
for i in range(0,12,1):
XX = gam.generate_X_grid(term=i)
axs[i].plot(XX[:, i], gam.partial_dependence(term=i, X=XX), c="dimgrey", ls="solid", lw=2)
axs[i].plot(XX[:, i], gam.partial_dependence(term=i, X=XX, width=.95)[1], c="cornflowerblue", ls="dotted",lw=1.5)
axs[i].set_ylim(-2,2)
#axs[i].set_xlim(8,11)
axs[i].set_xlabel(titles[i], fontsize=12)
axs[i].set_ylabel("Частичный Эффект", fontsize=12)
axs[i].set_title("")
axs[i].axhline(y=0.0, c="crimson",linewidth=0.6,zorder=0,ls=":")
fig.savefig('partial_plot_from_python.eps', format="eps", dpi=600)
Я ожидаю, что код создаст что-то похожее на изображение, показанное (сделанное в R, см. “rug”, показывающий плотность распределения точек данных на оси x).
график частичной зависимости, показывающий плотность данных на оси x
Ответ
Для добавления руга (rug plot), который показывает распределение данных по оси x в графиках частичной зависимости (partial dependence plots) с использованием библиотеки pygam
, вы можете воспользоваться функцией sns.rugplot()
из библиотеки seaborn
. Это позволит вам визуализировать распределение точек данных для каждого переменной.
Вот как можно модифицировать ваш код для добавления рога:
import matplotlib.pyplot as plt
import seaborn as sns
from pygam import LinearGAM
# Ваш код для создания модели GAM
# Например:
# gam = LinearGAM(...).fit(X, y)
# Установите фигуру
titles = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
fig, axs = plt.subplots(nrows=4, ncols=3, figsize=(20, 20), layout="constrained")
axs = axs.flatten()
# Создайте графики частичной зависимости
for i in range(0, 12, 1):
XX = gam.generate_X_grid(term=i)
axs[i].plot(XX[:, i], gam.partial_dependence(term=i, X=XX), c="dimgrey", ls="solid", lw=2)
axs[i].plot(XX[:, i], gam.partial_dependence(term=i, X=XX, width=.95)[1], c="cornflowerblue", ls="dotted", lw=1.5)
# Добавьте rug plot
sns.rugplot(x=X[:, i], ax=axs[i], color='black', height=0.1)
axs[i].set_ylim(-2, 2)
axs[i].set_xlabel(titles[i], fontsize=12)
axs[i].set_ylabel("Частичный эффект", fontsize=12)
axs[i].set_title("")
axs[i].axhline(y=0.0, c="crimson", linewidth=0.6, zorder=0, ls=":")
# Сохраните график
plt.savefig('partial_plot_with_rug.eps', format="eps", dpi=600)
Объяснение кода:
-
Импорт библиотек: Убедитесь, что у вас установлены библиотеки
matplotlib
,seaborn
иpygam
. Если они не установлены, вы можете установить их с помощью командыpip install matplotlib seaborn pygam
. -
Создание модели GAM: В коде предполагается, что ваша модель уже создана и обучена.
-
Создание графиков: Мы используем цикл, чтобы создать графики для всех переменных. Внутри цикла мы добавляем рог с помощью функции
sns.rugplot()
, которая принимает данные для соответствующей переменной. Параметрheight
контролирует высоту рога. - Настройка графиков: Мы настраиваем оси и сохраняем график в формате EPS.
С помощью этого кода вы сможете получить графики частичной зависимости с рогом, показывающим распределение данных на оси x, аналогично тому, как это делается в R.