Монотонные ограничения в градиентном бустинге

Beginner

This tutorial is from open-source community. Access the source code

Введение

Это пошаговое руководство по демонстрации эффекта монотонных ограничений на оценщике градиентного бустинга. Градиентный бустинг - это популярный метод машинного обучения, используемый для задач регрессии и классификации. В этом руководстве мы создадим искусственный датасет и используем оценщик градиентного бустинга, чтобы показать влияние монотонных ограничений на предсказания модели.

Советы по работе с ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике в Jupyter Notebook.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений в Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импорт библиотек

Начнем с импорта необходимых библиотек для этого руководства.

from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.inspection import PartialDependenceDisplay
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Генерация данных

Мы сгенерируем искусственный датасет, где целевое значение положительно коррелирует с первой характеристикой и отрицательно коррелирует с второй характеристикой. Также добавим некоторый случайный шум, чтобы сделать данные более реалистичными.

rng = np.random.RandomState(0)

n_samples = 1000
f_0 = rng.rand(n_samples)
f_1 = rng.rand(n_samples)
X = np.c_[f_0, f_1]
noise = rng.normal(loc=0.0, scale=0.01, size=n_samples)

y = 5 * f_0 + np.sin(10 * np.pi * f_0) - 5 * f_1 - np.cos(10 * np.pi * f_1) + noise

Обучить модель без ограничений

Мы обучим модель на сгенерированных данных без каких-либо ограничений, чтобы увидеть, как модель работает без ограничений.

gbdt_no_cst = HistGradientBoostingRegressor()
gbdt_no_cst.fit(X, y)

Обучить модель с монотонными ограничениями

Теперь обучим другую модель на тех же данных, но с монотонными ограничениями для характеристик. Мы применим ограничение монотонного возрастания для первой характеристики и ограничение монотонного убывания для второй характеристики.

gbdt_with_monotonic_cst = HistGradientBoostingRegressor(monotonic_cst=[1, -1])
gbdt_with_monotonic_cst.fit(X, y)

Показать частичную зависимость

Теперь мы покажем частичную зависимость предсказаний от двух характеристик для обеих моделей.

fig, ax = plt.subplots()
disp = PartialDependenceDisplay.from_estimator(
    gbdt_no_cst,
    X,
    features=[0, 1],
    feature_names=(
        "First feature",
        "Second feature",
    ),
    line_kw={"linewidth": 4, "label": "unconstrained", "color": "tab:blue"},
    ax=ax,
)
PartialDependenceDisplay.from_estimator(
    gbdt_with_monotonic_cst,
    X,
    features=[0, 1],
    line_kw={"linewidth": 4, "label": "constrained", "color": "tab:orange"},
    ax=disp.axes_,
)

for f_idx in (0, 1):
    disp.axes_[0, f_idx].plot(
        X[:, f_idx], y, "o", alpha=0.3, zorder=-1, color="tab:green"
    )
    disp.axes_[0, f_idx].set_ylim(-6, 6)

plt.legend()
fig.suptitle("Monotonic constraints effect on partial dependences")
plt.show()

Использование имен характеристик для указания монотонных ограничений

Если в обучающих данных есть имена характеристик, то можно указать монотонные ограничения, передав словарь. Теперь мы это покажем, используя те же данные и указывая ограничения с использованием имен характеристик.

X_df = pd.DataFrame(X, columns=["f_0", "f_1"])

gbdt_with_monotonic_cst_df = HistGradientBoostingRegressor(
    monotonic_cst={"f_0": 1, "f_1": -1}
).fit(X_df, y)

np.allclose(
    gbdt_with_monotonic_cst_df.predict(X_df), gbdt_with_monotonic_cst.predict(X)
)

Резюме

В этом руководстве мы продемонстрировали влияние монотонных ограничений на оценщик градиентного бустинга. Мы сгенерировали искусственный датасет, обучили две модели, одну без каких-либо ограничений, а другую с монотонными ограничениями, и показали частичную зависимость предсказаний от двух характеристик. Мы также показали, как указать монотонные ограничения с использованием имен характеристик.