Раннее прекращение градиентного бустинга

Beginner

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

Введение

Gradient boosting - это метод ансамблей, при котором несколько слабых классификаторов (регрессионные деревья) комбинируются в итеративном режиме, чтобы получить мощную модель. Поддержка раннего прекращения при использовании Gradient boosting позволяет найти минимальное количество итераций, достаточное для построения модели, которая хорошо обобщается на новые данные.

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

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

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

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

Загрузка необходимых библиотек и данных

Сначала нам нужно загрузить необходимые библиотеки и данные. Мы будем использовать библиотеку scikit-learn для реализации градиентного бустинга.

import time
import numpy as np
import matplotlib.pyplot as plt
from sklearn import ensemble
from sklearn import datasets
from sklearn.model_selection import train_test_split

data_list = [
    datasets.load_iris(return_X_y=True),
    datasets.make_classification(n_samples=800, random_state=0),
    datasets.make_hastie_10_2(n_samples=2000, random_state=0),
]
names = ["Iris Data", "Classification Data", "Hastie Data"]
n_estimators = 200

Подготовка данных

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

for X, y in data_list:
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=0
    )

Построение и обучение модели без раннего прекращения

Теперь мы построим и обучим модель градиентного бустинга без раннего прекращения.

gb = ensemble.GradientBoostingClassifier(n_estimators=n_estimators, random_state=0)
start = time.time()
gb.fit(X_train, y_train)
time_gb.append(time.time() - start)

Построение и обучение модели с ранним прекращением

Теперь мы построим и обучим модель градиентного бустинга с ранним прекращением. Мы задаем параметр validation_fraction, который обозначает долю целого датасета, которая будет отделена от обучения для оценки потери модели на валидации. Модель градиентного бустинга обучается на тренировочном наборе и оценивается на валидационном наборе. Когда добавляется каждый дополнительный этап построения регрессионного дерева, валидационный набор используется для оценки модели. Это продолжается до тех пор, пока показатели модели на последних n_iter_no_change этапах не улучшатся на величину не менее tol. После этого модель считается сконвергированной и дальнейшее добавление этапов "прекращается заранее". Количество этапов финальной модели доступно по атрибуту n_estimators.

gbes = ensemble.GradientBoostingClassifier(
        n_estimators=n_estimators,
        validation_fraction=0.2,
        n_iter_no_change=5,
        tol=0.01,
        random_state=0,
    )
start = time.time()
gbes.fit(X_train, y_train)
time_gbes.append(time.time() - start)

Сравнение результатов с и без раннего прекращения

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

score_gb.append(gb.score(X_test, y_test))
score_gbes.append(gbes.score(X_test, y_test))

Сравнение времени обучения с и без раннего прекращения

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

plt.figure(figsize=(9, 5))

bar1 = plt.bar(
    index, time_gb, bar_width, label="Без раннего прекращения", color="crimson"
)
bar2 = plt.bar(
    index + bar_width, time_gbes, bar_width, label="С ранним прекращением", color="coral"
)

max_y = np.amax(np.maximum(time_gb, time_gbes))

plt.xticks(index + bar_width, имена)
plt.yticks(np.linspace(0, 1.3 * max_y, 13))

autolabel(bar1, n_gb)
autolabel(bar2, n_gbes)

plt.ylim([0, 1.3 * max_y])
plt.legend(loc="best")
plt.grid(True)

plt.xlabel("Наборы данных")
plt.ylabel("Время обучения")

plt.show()

Сравнение результатов с и без раннего прекращения

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

plt.figure(figsize=(9, 5))

bar1 = plt.bar(
    index, score_gb, bar_width, label="Без раннего прекращения", color="crimson"
)
bar2 = plt.bar(
    index + bar_width, score_gbes, bar_width, label="С ранним прекращением", color="coral"
)

plt.xticks(index + bar_width, имена)
plt.yticks(np.arange(0, 1.3, 0.1))

autolabel(bar1, n_gb)
autolabel(bar2, n_gbes)

plt.ylim([0, 1.3])
plt.legend(loc="best")
plt.grid(True)

plt.xlabel("Наборы данных")
plt.ylabel("Результат тестирования")

plt.show()

Резюме

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