Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Ранняя остановка при градиентном бустинге
Градиентный бустинг — это ансамблевый метод, который объединяет несколько слабых моделей, обычно деревьев решений, чтобы создать надежную и мощную прогностическую модель. Он работает итеративно: на каждом новом этапе (дереве) исправляются ошибки предыдущих этапов.
Ранняя остановка — это метод градиентного бустинга, который позволяет найти оптимальное число итераций для построения модели, хорошо обобщающей данные, которые она ранее не видела, и избежать переобучения. Принцип прост: мы выделяем часть набора данных в качестве валидационного набора (задается с помощью validation_fraction), чтобы оценивать качество модели во время обучения. По мере того как модель итеративно строится с добавлением новых этапов (деревьев), отслеживается ее качество на валидационном наборе в зависимости от числа шагов.
Ранняя остановка срабатывает, когда качество модели на валидационном наборе перестает улучшаться или ухудшается (с учетом отклонений, заданных с помощью tol) на протяжении определенного числа последовательных этапов (задается с помощью n_iter_no_change). Это означает, что модель достигла точки, в которой дальнейшие итерации могут привести к переобучению, и обучение пора остановить.
Число оценщиков (деревьев) в итоговой модели при использовании ранней остановки можно получить с помощью атрибута n_estimators_. В целом ранняя остановка — ценный инструмент, позволяющий найти баланс между качеством модели и эффективностью градиентного бустинга.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Подготовка данных
Сначала мы загружаем и подготавливаем набор данных о ценах на жилье в Калифорнии для обучения и оценки. Мы выбираем подмножество данных и разделяем его на обучающую и валидационную выборки.
import time import matplotlib.pyplot as plt from sklearn.datasets import fetch_california_housing from sklearn.ensemble import GradientBoostingRegressor from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split data = fetch_california_housing() X, y = data.data[:600], data.target[:600] X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
Обучение и сравнение моделей
Обучаются две модели GradientBoostingRegressor: одна с ранней остановкой, другая — без нее. Цель — сравнить их качество. Также вычисляются время обучения и n_estimators_, использованный обеими моделями.
params = dict(n_estimators=1000, max_depth=5, learning_rate=0.1, random_state=42)
gbm_full = GradientBoostingRegressor(**params)
gbm_early_stopping = GradientBoostingRegressor(
**params,
validation_fraction=0.1,
n_iter_no_change=10,
)
start_time = time.time()
gbm_full.fit(X_train, y_train)
training_time_full = time.time() - start_time
n_estimators_full = gbm_full.n_estimators_
start_time = time.time()
gbm_early_stopping.fit(X_train, y_train)
training_time_early_stopping = time.time() - start_time
estimators_early_stopping = gbm_early_stopping.n_estimators_
Вычисление ошибки
Для моделей, обученных в предыдущем разделе, код вычисляет mean_squared_error на обучающем и валидационном наборах данных. Ошибки вычисляются для каждой итерации бустинга. Цель — оценить качество моделей и их сходимость.
train_errors_without = []
val_errors_without = []
train_errors_with = []
val_errors_with = []
for i, (train_pred, val_pred) in enumerate(
zip(
gbm_full.staged_predict(X_train),
gbm_full.staged_predict(X_val),
)
):
train_errors_without.append(mean_squared_error(y_train, train_pred))
val_errors_without.append(mean_squared_error(y_val, val_pred))
for i, (train_pred, val_pred) in enumerate(
zip(
gbm_early_stopping.staged_predict(X_train),
gbm_early_stopping.staged_predict(X_val),
)
):
train_errors_with.append(mean_squared_error(y_train, train_pred))
val_errors_with.append(mean_squared_error(y_val, val_pred))
Визуальное сравнение
Строятся три графика:
- График ошибок на обучающей выборке для обеих моделей в зависимости от числа итераций бустинга.
- График ошибок на валидационной выборке для обеих моделей в зависимости от числа итераций бустинга.
- Столбчатая диаграмма для сравнения времени обучения и числа оценщиков, использованных моделями с ранней остановкой и без нее.
fig, axes = plt.subplots(ncols=3, figsize=(12, 4))
axes[0].plot(train_errors_without, label="gbm_full")
axes[0].plot(train_errors_with, label="gbm_early_stopping")
axes[0].set_xlabel("Boosting Iterations")
axes[0].set_ylabel("MSE (Training)")
axes[0].set_yscale("log")
axes[0].legend()
axes[0].set_title("Training Error")
axes[1].plot(val_errors_without, label="gbm_full")
axes[1].plot(val_errors_with, label="gbm_early_stopping")
axes[1].set_xlabel("Boosting Iterations")
axes[1].set_ylabel("MSE (Validation)")
axes[1].set_yscale("log")
axes[1].legend()
axes[1].set_title("Validation Error")
training_times = [training_time_full, training_time_early_stopping]
labels = ["gbm_full", "gbm_early_stopping"]
bars = axes[2].bar(labels, training_times)
axes[2].set_ylabel("Training Time (s)")
for bar, n_estimators in zip(bars, [n_estimators_full, estimators_early_stopping]):
height = bar.get_height()
axes[2].text(
bar.get_x() + bar.get_width() / 2,
height + 0.001,
f"Estimators: {n_estimators}",
ha="center",
va="bottom",
)
plt.tight_layout()
plt.show()

Разница в ошибке на обучающей выборке между gbm_full и gbm_early_stopping обусловлена тем, что gbm_early_stopping выделяет validation_fraction обучающих данных для внутренней валидационной выборки. Решение о ранней остановке принимается на основании оценки на этой внутренней валидационной выборке.
Итоги
На примере модели GradientBoostingRegressor, обученной на наборе данных о ценах на жилье в Калифорнии, мы продемонстрировали практические преимущества ранней остановки:
- Предотвращение переобучения: Мы показали, как ошибка на валидационной выборке стабилизируется или начинает расти после определенного момента, что указывает на улучшение способности модели обобщать данные, которые она ранее не видела. Это достигается остановкой обучения до возникновения переобучения.
- Повышение эффективности обучения: Мы сравнили время обучения моделей с ранней остановкой и без нее. Модель с ранней остановкой показала сопоставимую точность, используя значительно меньше оценщиков, что позволило ускорить обучение.
Общее время выполнения скрипта: (0 минут 2.663 секунды)
Похожие примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/ensemble/plot_gradient_boosting_early_stopping.html