Регуляризация градиентного бустинга

Beginner

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

Введение

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

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

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

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

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

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

Начнем с импорта необходимых библиотек.

import numpy as np
import matplotlib.pyplot as plt

from sklearn import ensemble
from sklearn import datasets
from sklearn.metrics import log_loss
from sklearn.model_selection import train_test_split

Загружаем и разделяем данные

Мы будем использовать набор данных make_hastie_10_2 и разделить его на обучающий и тестовый наборы.

X, y = datasets.make_hastie_10_2(n_samples=4000, random_state=1)

## map labels from {-1, 1} to {0, 1}
labels, y = np.unique(y, return_inverse=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=0)

Определяем параметры

Мы определим параметры для нашего классификатора градиентного бустинга. Будем использовать следующие параметры:

  • n_estimators: количество этапов бустинга для выполнения
  • max_leaf_nodes: максимальное количество листьев в каждом дереве
  • max_depth: максимальная глубина дерева
  • random_state: случайный种子 для обеспечения согласованности
  • min_samples_split: минимальное количество образцов, необходимое для разделения внутренней вершины
original_params = {
    "n_estimators": 400,
    "max_leaf_nodes": 4,
    "max_depth": None,
    "random_state": 2,
    "min_samples_split": 5,
}

Реализуем стратегии регуляризации

Теперь мы реализуем различные стратегии регуляризации и сравним их производительность.

Без уменьшения (shrinkage)

Начнем с отсутствия уменьшения, что означает, что коэффициент обучения будет установлен равным 1.

params = dict(original_params)
params.update({"learning_rate": 1.0, "subsample": 1.0})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Коэффициент обучения = 0.2

Далее установим коэффициент обучения равным 0.2 и долю выборки равной 1.

params = dict(original_params)
params.update({"learning_rate": 0.2, "subsample": 1.0})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Доля выборки = 0.5

Теперь установим долю выборки равной 0.5 и коэффициент обучения равным 1.

params = dict(original_params)
params.update({"learning_rate": 1.0, "subsample": 0.5})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Коэффициент обучения = 0.2 и доля выборки = 0.5

Далее установим коэффициент обучения равным 0.2 и долю выборки равной 0.5.

params = dict(original_params)
params.update({"learning_rate": 0.2, "subsample": 0.5})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)
Коэффициент обучения = 0.2 и максимальное количество признаков = 2

Наконец, установим коэффициент обучения равным 0.2 и для каждого дерева будем использовать только 2 признака.

params = dict(original_params)
params.update({"learning_rate": 0.2, "max_features": 2})

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)

Построим откланение на тестовом наборе

Теперь построим откланение на тестовом наборе для каждой стратегии регуляризации.

plt.figure()

for label, color, setting in [
    ("Без уменьшения (shrinkage)", "оранжевый", {"learning_rate": 1.0, "subsample": 1.0}),
    ("learning_rate=0.2", "бирюзовый", {"learning_rate": 0.2, "subsample": 1.0}),
    ("subsample=0.5", "синий", {"learning_rate": 1.0, "subsample": 0.5}),
    (
        "learning_rate=0.2, subsample=0.5",
        "серый",
        {"learning_rate": 0.2, "subsample": 0.5},
    ),
    (
        "learning_rate=0.2, max_features=2",
        "магента",
        {"learning_rate": 0.2, "max_features": 2},
    ),
]:
    params = dict(original_params)
    params.update(setting)

    clf = ensemble.GradientBoostingClassifier(**params)
    clf.fit(X_train, y_train)

    ## вычислим откланение на тестовом наборе
    test_deviance = np.zeros((params["n_estimators"],), dtype=np.float64)

    for i, y_proba in enumerate(clf.staged_predict_proba(X_test)):
        test_deviance[i] = 2 * log_loss(y_test, y_proba[:, 1])

    plt.plot(
        (np.arange(test_deviance.shape[0]) + 1)[::5],
        test_deviance[::5],
        "-",
        color=color,
        label=label,
    )

plt.legend(loc="upper right")
plt.xlabel("Итерации бустинга")
plt.ylabel("Откланение на тестовом наборе")

plt.show()

Резюме

В этом практическом занятии мы узнали, как реализовать различные стратегии регуляризации для градиентного бустинга с использованием scikit - learn. Мы использовали функцию потерь бинарного откланения и набор данных make_hastie_10_2. Мы реализовали различные стратегии регуляризации, такие как отсутствие уменьшения (shrinkage), коэффициент обучения = 0.2, доля выборки = 0.5 и максимальное количество признаков = 2. Наконец, мы построили откланение на тестовом наборе для каждой стратегии регуляризации, чтобы сравнить их производительность.