Градиентный бустинг, XGBoost и LightGBM — гайд для аналитика

Что такое бустинг

Бустинг (boosting) — метод построения ансамбля моделей, при котором каждая следующая модель исправляет ошибки предыдущих. В отличие от Random Forest, где деревья строятся параллельно и независимо (bagging), в бустинге деревья строятся последовательно — каждое новое фокусируется на тех объектах, где предыдущие ошиблись.

Bagging (Random Forest) Boosting (XGBoost)
Построение Параллельно Последовательно
Каждая модель Независимая Исправляет ошибки предыдущей
Борьба с Дисперсия (variance) Смещение (bias)
Переобучение Устойчив Склонен, нужна регуляризация

Бустинг обычно точнее bagging, но требует более тщательной настройки. Это основной метод для табличных данных на соревнованиях Kaggle и в продакшене.

Градиентный бустинг: интуиция

Gradient Boosting — конкретный алгоритм бустинга. Работает так:

  1. Строим первое дерево — оно даёт грубое предсказание
  2. Считаем остатки (residuals) — разницу между реальными значениями и предсказаниями
  3. Строим второе дерево, но учим его предсказывать остатки, а не целевую переменную
  4. Добавляем предсказание второго дерева к первому (с коэффициентом learning_rate)
  5. Повторяем: каждое новое дерево учится на ошибках всех предыдущих

Формально: на шаге 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+ вопросов для собеседования аналитика. Бесплатно.