Градиентный бустинг: как ансамбль исправляет ошибки
Градиентный бустинг строит ансамбль последовательно: каждое новое небольшое дерево помогает исправить ошибки уже собранной модели. В отличие от случайного леса деревья не обучаются независимо, поэтому скорость шага, число итераций и контроль переобучения становятся центральными настройками.
Последовательное улучшение
Начальный прогноз обычно прост, например одна константа. Затем алгоритм вычисляет направление, в котором функция потерь уменьшается, и обучает дерево приближать это исправление. Новый вклад умножается на 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, фактическое число итераций и время. Найдите сочетание, после которого дополнительные деревья почти не улучшают проверку.
Что важно запомнить
- Бустинг последовательно добавляет исправления к текущему прогнозу.
- Learning rate и число итераций образуют связанный компромисс.
- Ранняя остановка должна использовать корректную validation-схему.
- Сильная модель особенно опасна при незамеченной утечке.