Градиентный бустинг, XGBoost и LightGBM — гайд для аналитика
Что такое бустинг
Бустинг (boosting) — метод построения ансамбля моделей, при котором каждая следующая модель исправляет ошибки предыдущих. В отличие от Random Forest, где деревья строятся параллельно и независимо (bagging), в бустинге деревья строятся последовательно — каждое новое фокусируется на тех объектах, где предыдущие ошиблись.
| Bagging (Random Forest) | Boosting (XGBoost) | |
|---|---|---|
| Построение | Параллельно | Последовательно |
| Каждая модель | Независимая | Исправляет ошибки предыдущей |
| Борьба с | Дисперсия (variance) | Смещение (bias) |
| Переобучение | Устойчив | Склонен, нужна регуляризация |
Бустинг обычно точнее bagging, но требует более тщательной настройки. Это основной метод для табличных данных на соревнованиях Kaggle и в продакшене.
Градиентный бустинг: интуиция
Gradient Boosting — конкретный алгоритм бустинга. Работает так:
- Строим первое дерево — оно даёт грубое предсказание
- Считаем остатки (residuals) — разницу между реальными значениями и предсказаниями
- Строим второе дерево, но учим его предсказывать остатки, а не целевую переменную
- Добавляем предсказание второго дерева к первому (с коэффициентом learning_rate)
- Повторяем: каждое новое дерево учится на ошибках всех предыдущих
Формально: на шаге t строим дерево, которое приближает антиградиент функции потерь. Отсюда название — «градиентный» бустинг.
Предсказание = Дерево₁ + lr·Дерево₂ + lr·Дерево₃ + ... + lr·ДеревоₙМаленький learning_rate (0.01–0.1) замедляет обучение, но делает модель более стабильной. Большой learning_rate (0.3+) ускоряет обучение, но модель может проскочить оптимум.
XGBoost vs LightGBM vs CatBoost
Три главные реализации градиентного бустинга. Все три быстрые, точные и широко используются.
| Критерий | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| Скорость | Быстрый | Самый быстрый | Средний |
| Категориальные признаки | Нужен encoding | Нужен encoding | Нативная поддержка |
| Стратегия роста | Level-wise | Leaf-wise | Level-wise |
| Обработка пропусков | Автоматическая | Автоматическая | Автоматическая |
| GPU-обучение | Да | Да | Да |
| Популярность | Самый распространённый | Быстро растёт | Популярен в России |
XGBoost — «классика», самый документированный, работает везде. Level-wise growth — дерево растёт равномерно по уровням.
LightGBM — быстрее за счёт leaf-wise growth (расщепляет лист с наибольшим уменьшением ошибки) и гистограммного метода. Лучший выбор для больших данных.
CatBoost — разработан Яндексом. Главное преимущество — нативная работа с категориальными признаками без предварительного кодирования. Использует ordered boosting для борьбы с утечкой целевой переменной.
Для аналитика на практике: начните с LightGBM (быстрый, точный), переключитесь на CatBoost, если много категориальных фичей.
Ключевые гиперпараметры
Три параметра, которые влияют больше всего:
learning_rate (0.01–0.3): скорость обучения. Маленький learning_rate + много деревьев = лучшее качество, но дольше обучение. Стандартная стратегия: ставьте 0.05–0.1 и подбирайте число деревьев через early stopping.
max_depth (3–8): глубина каждого дерева. Глубокие деревья — сложнее модель, выше риск переобучения. Для бустинга обычно достаточно 4–6 (мелкие деревья, много итераций).
n_estimators (100–5000): число деревьев. Не подбирайте вручную — используйте early stopping: обучайте, пока качество на валидации растёт, остановитесь, когда перестанет.
Другие важные параметры: min_child_weight (минимальное число объектов в листе), subsample (доля данных для каждого дерева), colsample_bytree (доля признаков), reg_alpha и reg_lambda (L1/L2-регуляризация).
Python: пример с LightGBM
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
import pandas as pd
df = pd.read_csv('users.csv')
features = ['days_active', 'sessions_last_week', 'purchases_total',
'support_tickets', 'days_since_last_visit']
X = df[features]
y = df['churned']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
model = lgb.LGBMClassifier(
n_estimators=1000,
learning_rate=0.05,
max_depth=6,
min_child_samples=20,
subsample=0.8,
colsample_bytree=0.8,
random_state=42
)
model.fit(
X_train, y_train,
eval_set=[(X_test, y_test)],
callbacks=[lgb.early_stopping(50), lgb.log_evaluation(100)]
)
y_pred = model.predict_proba(X_test)[:, 1]
print(f"ROC AUC: {roc_auc_score(y_test, y_pred):.4f}")
# Feature importance
importance = pd.Series(
model.feature_importances_, index=features
).sort_values(ascending=False)
print(importance)Early stopping остановит обучение, если за 50 итераций качество на валидации не улучшилось. Это лучший способ подобрать число деревьев.
Когда аналитику нужен бустинг
Основные задачи, где аналитики используют градиентный бустинг:
- Предсказание оттока — бинарная классификация, кто уйдёт в ближайший месяц
- Кредитный скоринг — оценка вероятности дефолта
- Предсказание LTV — регрессия, сколько денег принесёт пользователь
- Ранжирование — какие товары показать первыми (LambdaMART на основе бустинга)
- Feature importance — какие признаки больше всего влияют на метрику
На собеседованиях аналитика не требуют глубокого знания математики бустинга, но ожидают понимание принципов: последовательное исправление ошибок, роль learning_rate, борьба с переобучением через early stopping. Подробнее про ML для аналитиков — в обзоре.
Вопросы с собеседований
— Чем бустинг отличается от бэггинга? — Бэггинг (Random Forest) строит деревья параллельно и независимо, затем усредняет. Бустинг строит деревья последовательно: каждое новое учится на ошибках предыдущих. Бэггинг снижает дисперсию, бустинг — смещение. Бустинг обычно точнее, но более склонен к переобучению.
— Что такое learning_rate и зачем он нужен? — Learning_rate (скорость обучения) — коэффициент, на который умножается предсказание каждого нового дерева. Маленький lr (0.01–0.05) замедляет обучение, но делает модель стабильнее и точнее. Большой lr ускоряет, но модель может проскочить оптимум. Уменьшение lr обычно требует увеличения числа деревьев.
— Как бороться с переобучением в градиентном бустинге? — Уменьшить learning_rate, ограничить глубину деревьев (max_depth), использовать early stopping, добавить subsample и colsample_bytree (рандомизация по объектам и признакам), использовать L1/L2-регуляризацию.
— Когда выбрать Random Forest, а когда XGBoost? — RF — когда мало времени на настройку, нужен быстрый baseline, данные зашумлены. XGBoost/LightGBM — когда нужна максимальная точность, есть ресурсы на подбор гиперпараметров, данные табличные. На практике бустинг выигрывает почти всегда на табличных данных.
— В чём разница между XGBoost, LightGBM и CatBoost? — XGBoost — классика, level-wise рост деревьев. LightGBM — быстрее за счёт leaf-wise и гистограмм, лучше на больших данных. CatBoost — нативно работает с категориальными признаками, ordered boosting. Все три близки по качеству, различия в скорости и удобстве.
FAQ
Обязательно ли аналитику уметь обучать XGBoost?
Зависит от позиции. Продуктовому аналитику достаточно понимать принципы и уметь интерпретировать результаты. Аналитику данных, который строит модели, — да, нужно уметь обучать, настраивать и валидировать. На собеседованиях чаще проверяют понимание, а не умение писать код.
Можно ли использовать градиентный бустинг для регрессии?
Да. XGBoost, LightGBM и CatBoost поддерживают регрессию, классификацию и ранжирование. Для регрессии используется функция потерь MSE или MAE вместо log-loss. Типичные задачи — предсказание LTV, среднего чека, времени до конверсии.
Что такое early stopping и зачем он нужен?
Early stopping — техника, при которой обучение останавливается, когда качество на валидационной выборке перестаёт расти. Это лучший способ подобрать число деревьев и избежать переобучения. Вместо фиксирования n_estimators ставьте большое число и patience (число итераций без улучшения).
Потренируйте вопросы по машинному обучению — откройте тренажёр. 1500+ вопросов для собеседования аналитика. Бесплатно.