Градиентный бустинг: как ансамбль исправляет ошибки

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

Последовательное улучшение

Начальный прогноз обычно прост, например одна константа. Затем алгоритм вычисляет направление, в котором функция потерь уменьшается, и обучает дерево приближать это исправление. Новый вклад умножается на learning rate и добавляется к текущему ответу.

Название «градиентный» относится к оптимизации произвольной дифференцируемой функции потерь. Для квадратной ошибки исправление похоже на обучение по остаткам, но общая идея применяется и к классификации.

Learning rate и число деревьев

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

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

HistGradientBoosting в scikit-learn

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

boosting = HistGradientBoostingClassifier(
    learning_rate=0.06,
    max_iter=300,
    max_leaf_nodes=15,
    l2_regularization=1.0,
    early_stopping=True,
    random_state=42,
)
boosting.fit(X_train, y_train)

probabilities = boosting.predict_proba(X_test)[:, 1]
print('ROC-AUC:', roc_auc_score(y_test, probabilities))

Histogram-based реализация группирует значения признаков в интервалы и эффективнее работает на больших наборах, чем классический GradientBoosting. Точные возможности обработки категорий и пропусков зависят от версии библиотеки, поэтому их нужно сверять с закреплённой документацией.

Ранняя остановка

При early_stopping=True часть обучающих данных используется для контроля улучшения. Если критерий на validation перестаёт улучшаться, добавление деревьев прекращается. Это экономит вычисления и ограничивает переобучение, но внутреннее случайное разделение не подходит для любого временного или группового набора.

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

Почему бустинг требует аккуратного baseline

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

Сравнивайте не только общую метрику. Более сложная модель может ухудшить калибровку, латентность или стабильность важных сегментов. Победа в одной таблице результатов ещё не означает готовность к запуску.

Практика: исследуйте скорость обучения

Обучите три модели с learning rate 0,2, 0,05 и 0,01, увеличивая max_iter для меньших шагов. Сравните train и validation score, фактическое число итераций и время. Найдите сочетание, после которого дополнительные деревья почти не улучшают проверку.

Что важно запомнить

Источники