Градиентный бустинг
Коротко
Definition
Градиентный бустинг — это ансамблевый метод, который строит сильную модель как последовательность слабых моделей, где каждая новая модель исправляет ошибки уже построенного ансамбля.
Чаще всего под градиентным бустингом имеют в виду бустинг над деревьями решений: Gradient Boosted Decision Trees, или GBDT.
Главная идея:
- сначала построить простую начальную модель;
- найти, где она ошибается;
- обучить следующую модель исправлять эти ошибки;
- повторять процесс много раз;
- сложить предсказания всех слабых моделей.
В отличие от случайного леса, где деревья обучаются в основном независимо, в градиентном бустинге деревья строятся последовательно.
Интуиция
Представим ученика, который решает задачи. После первой попытки он смотрит на ошибки и отдельно тренируется именно на них. Потом снова смотрит, где ошибся, и снова улучшает решение.
Градиентный бустинг работает похоже.
Первая модель даёт грубый прогноз. Следующая модель пытается исправить ошибки первой. Третья исправляет ошибки уже суммы первых двух, и так далее.
Каждое отдельное дерево обычно слабое: неглубокое и простое. Но последовательное сложение многих слабых деревьев даёт сильную модель.
Поэтому градиентный бустинг часто хорошо работает на табличных данных и является одним из самых сильных классических подходов.
Формальное описание
Градиентный бустинг строит аддитивную модель:
где:
- — начальная модель;
- — слабая модель на шаге ;
- — количество слабых моделей;
- — learning rate;
- — итоговое предсказание ансамбля.
В регрессии с MSE новая модель может обучаться на остатки:
Но в общем случае градиентный бустинг обучает новую модель не просто на обычные остатки, а на отрицательный градиент функции потерь:
Поэтому метод называется градиентным: он улучшает модель в направлении, уменьшающем функцию потерь.
Входы и выходы
| Компонент | Классификация | Регрессия | Ранжирование |
|---|---|---|---|
| Вход | Вектор признаков объекта | Вектор признаков объекта | Объекты, запросы, группы |
| Выход | Класс или вероятность класса | Числовое значение | Оценка релевантности / порядок |
| Тип обучения | С учителем | С учителем | С учителем |
| Базовая модель | Обычно дерево решений | Обычно дерево решений | Обычно дерево решений |
Примеры задач:
- классификация клиентов;
- предсказание цены;
- оценка риска;
- ранжирование поисковой выдачи;
- предсказание свойств материалов;
- скоринг заявок;
- табличные соревнования и промышленные ML-задачи.
Как обучается
Общий алгоритм:
- Выбрать функцию потерь.
- Инициализировать простую начальную модель .
- Для шага :
- вычислить ошибки или псевдоостатки текущей модели;
- обучить слабую модель на эти псевдоостатки;
- добавить слабую модель к ансамблю с коэффициентом learning rate;
- при необходимости проверить качество на validation-наборе.
- Остановиться после заданного числа деревьев или по early stopping.
Обновление модели:
Если learning rate маленький, каждое новое дерево делает небольшой шаг. Обычно это требует больше деревьев, но может улучшить обобщающую способность.
Функция потерь
Градиентный бустинг может использовать разные функции потерь в зависимости от задачи.
Для регрессии часто используют:
| Loss | Когда используется |
|---|---|
| Squared error | Обычная регрессия, чувствительна к выбросам |
| Absolute error | Более устойчива к выбросам |
| Huber loss | Компромисс между MSE и MAE |
| Quantile loss | Предсказание квантилей |
Для классификации часто используют:
| Loss | Когда используется |
|---|---|
| Binary cross-entropy | Бинарная классификация |
| Multiclass cross-entropy | Многоклассовая классификация |
| Exponential loss | Классический AdaBoost-подход |
Для бинарной классификации часто используется логистическая функция потерь:
Для регрессии с MSE:
Смысл градиентного бустинга в том, что он может оптимизировать разные differentiable loss-функции через последовательное движение по антиградиенту.
Гиперпараметры
Главные гиперпараметры:
| Гиперпараметр | Что контролирует |
|---|---|
n_estimators | Количество деревьев |
learning_rate | Размер шага каждого дерева |
max_depth | Максимальная глубина деревьев |
min_samples_leaf | Минимум объектов в листе |
subsample | Доля объектов для обучения каждого дерева |
max_features | Доля признаков для разбиений |
loss | Функция потерь |
early_stopping | Остановка при ухудшении validation-качества |
Ключевой компромисс:
- маленький
learning_rate+ много деревьев — медленнее, но часто качественнее; - большой
learning_rate+ мало деревьев — быстрее, но выше риск переобучения.
Для современных реализаций вроде XGBoost, LightGBM и CatBoost также важны:
- L1/L2-регуляризация;
- параметры subsampling;
- ограничения на листья;
- обработка категориальных признаков;
- стратегия построения деревьев.
Когда использовать
Градиентный бустинг стоит использовать, когда:
- данные табличные;
- нужна высокая точность;
- есть нелинейные зависимости;
- признаки взаимодействуют друг с другом;
- случайный лес уже попробован как baseline;
- размер данных средний или большой;
- есть время на подбор гиперпараметров;
- задача промышленная и качество важнее простоты.
На табличных данных градиентный бустинг часто является одним из лучших вариантов среди классических ML-моделей.
Когда не использовать
Градиентный бустинг может быть не лучшим выбором, если:
- данных очень мало;
- нужна максимально простая и интерпретируемая модель;
- нет времени на настройку гиперпараметров;
- данные сильно шумные;
- признаки плохо подготовлены;
- задача требует end-to-end обучения на изображениях, тексте или графах;
- нужна простая модель для объяснения без дополнительных инструментов.
Градиентный бустинг мощный, но его легче переобучить, чем случайный лес, если неправильно подобрать глубину деревьев, learning rate и число итераций.
Метрики оценки
Для классификации используют:
- accuracy;
- precision;
- recall;
- F1-score;
- ROC-AUC;
- PR-AUC;
- log loss;
- confusion matrix.
Подробнее: Метрики качества классификаторов и ROC-кривая.
Для регрессии используют:
- MAE;
- MSE;
- RMSE;
- ;
- MAPE.
Подробнее: Метрики качества регрессоров.
Для ранжирования могут использовать:
- NDCG;
- MAP;
- MRR;
- precision@k;
- recall@k.
Метрика должна соответствовать задаче: например, для дисбалансной классификации accuracy может быть плохим ориентиром.
Типичные ошибки понимания
Ошибка 1. Думать, что бустинг и случайный лес отличаются только количеством деревьев
Главное отличие не в количестве деревьев, а в способе построения ансамбля.
Случайный лес строит деревья почти независимо и усредняет их. Градиентный бустинг строит деревья последовательно: каждое следующее дерево исправляет ошибки предыдущего ансамбля.
Ошибка 2. Делать деревья слишком глубокими
В бустинге базовые деревья часто должны быть относительно слабыми. Слишком глубокие деревья могут быстро привести к переобучению.
Ошибка 3. Использовать слишком большой learning rate
Большой learning rate делает обучение быстрым, но грубым. Модель может переобучиться или пропустить хорошее решение.
Ошибка 4. Оценивать качество только на train
Градиентный бустинг может очень хорошо подогнаться под обучающую выборку. Нужны validation-набор и early stopping.
Ошибка 5. Считать feature importance причинной интерпретацией
Важность признаков показывает, как модель использует признаки для предсказаний. Это не доказывает причинную связь.
Минимальный пример
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
X = np.array([
[0.1, 1.0],
[0.2, 1.1],
[1.0, 0.1],
[1.1, 0.2],
[0.9, 0.3],
[0.3, 0.9],
])
y = np.array([0, 0, 1, 1, 1, 0])
model = GradientBoostingClassifier(
n_estimators=100,
learning_rate=0.05,
max_depth=2,
random_state=42,
)
model.fit(X, y)
sample = np.array([ [0.8, 0.2] ])
prediction = model.predict(sample)
print(prediction)В этом примере модель строит последовательность небольших деревьев. Каждое новое дерево добавляется к ансамблю так, чтобы уменьшить ошибку предыдущих деревьев.