Почему в градиентном бустинге используется большое количество неглубоких деревьев?

«Почему в градиентном бустинге используется большое количество неглубоких деревьев?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование ансамбля многих (сотни-тысячи) неглубоких деревьев (часто называемых "пнями" при глубине 1, или деревьями глубиной 3-6) является ключевым принципом градиентного бустинга (GBM), на котором построены XGBoost и LightGBM. Это не просто эвристика, а следствие математической формулировки метода.

Основные причины:

  1. Каждое дерево исправляет ошибки предыдущих: GBM обучается последовательно. Каждое новое дерево обучается не на исходных метках y, а на градиенте (антиградиенте) функции потерь относительно предсказаний текущего ансамбля. По сути, оно учится предсказывать, в какую сторону и насколько нужно скорректировать текущее предсказание, чтобы уменьшить ошибку. Неглубокое дерево делает это небольшой, простой коррекцией, что предотвращает резкие, шумные изменения.
  2. Контроль переобучения и улучшение обобщения: Глубокое дерево — сильный ученик, который может идеально подогнаться под обучающие данные, включая шум. В бустинге нам нужны слабые ученики (high bias, low variance), которые лишь немного лучше случайного угадывания. Ансамбль из тысяч таких слабых моделей, корректирующих ошибки друг друга, дает сильную модель с низкой дисперсией (меньшим риском переобучения).
  3. Вычислительная эффективность и интерпретируемость: Обучение неглубокого дерева намного быстрее. Кроме того, ограничение глубины (например, max_depth=3) действует как мощный регуляризатор, упрощая настройку гиперпараметров.

Практический пример настройки в XGBoost:

from xgboost import XGBRegressor

# Типичная конфигурация: много неглубоких деревьев
model = XGBRegressor(
    n_estimators=1000,     # Большое количество деревьев
    max_depth=4,           # Небольшая глубина
    learning_rate=0.05,    # Небольшой шаг обучения (shrinkage)
    subsample=0.8          # Стрижка строк для дополнительной регуляризации
)
# learning_rate и n_estimators связаны: уменьшая шаг, нужно увеличивать количество деревьев.