Лекция 9. Градиентный бустинг

Цель лекции. Изучить принцип последовательного построения ансамбля моделей, понять роль функции потерь, градиента и скорости обучения. Рассмотреть применение градиентного бустинга для классификации и регрессии, способы борьбы с переобучением и реализацию в Python.

Ключевые понятия: градиентный бустинг, слабый алгоритм, ансамбль, функция потерь, антиградиент, остатки, скорость обучения, количество деревьев, глубина деревьев, ранняя остановка.

1. Идея градиентного бустинга

Градиентный бустинг (Gradient Boosting) — ансамблевый метод машинного обучения, в котором модели добавляются последовательно. Каждая следующая модель стремится уменьшить ошибки уже построенного ансамбля.

В отличие от бэггинга, где базовые модели обучаются преимущественно независимо и их ответы объединяются, бустинг последовательно корректирует общий прогноз. В качестве базовых моделей часто используются небольшие деревья решений.

Общая форма ансамбля после  шагов:

Здесь  — начальный прогноз,  — очередная базовая модель,  — количество шагов,  — скорость обучения.

Пример. Если модель прогнозирует цену квартиры 30 млн тенге, а следующая модель предсказывает поправку +2 млн, обновлённый прогноз при скорости обучения 0,1 составит 30,2 млн тенге.

2. Последовательное исправление ошибок

Для понимания бустинга рассмотрим регрессию с квадратичной функцией потерь. Сначала ансамбль выдаёт простое начальное предсказание, например среднее значение целевой переменной:

Затем для каждого обучающего объекта рассчитывается остаток:

Очередное дерево обучается приближать эти остатки. После этого прогноз ансамбля обновляется:

Таким образом, каждое новое дерево не заменяет предыдущие, а добавляет корректировку. При квадратичной потере обучение на остатках соответствует движению в направлении отрицательного градиента функции потерь с точностью до постоянного множителя.

Важно: для других функций потерь используются не обязательно обычные остатки, а псевдоостатки, полученные из производных функции потерь.

3. Градиент и функция потерь

Общий принцип градиентного бустинга заключается в минимизации выбранной функции потерь .

На шаге  вычисляются псевдоостатки:

Новая модель  обучается предсказывать эти величины. В некоторых реализациях затем отдельно определяются оптимальные значения поправок в листьях деревьев.

Для регрессии часто используют квадратичную ошибку:

Её отрицательная производная по прогнозу равна:

Поэтому при квадратичной ошибке псевдоостатки совпадают с обычными остатками.

Для бинарной классификации применяется, например, логистическая потеря. В таком случае ансамбль формирует оценки, преобразуемые в вероятности через сигмоиду:

Таким образом, идея последовательной коррекции сохраняется, но вид ошибки зависит от задачи и функции потерь.

4. Основные гиперпараметры

Качество бустинга существенно зависит от настройки сложности базовых моделей и размера каждого шага.

Параметр

Назначение

Возможное влияние

n_estimators

Количество деревьев

Больше шагов — выше гибкость и время обучения

learning_rate

Размер поправки каждого дерева

Малое значение требует больше деревьев

max_depth

Максимальная глубина дерева

Глубокие деревья моделируют более сложные зависимости

subsample

Доля обучающих объектов для каждого шага

Значения меньше 1 добавляют случайность

min_samples_leaf

Минимальное число объектов в листе

Ограничивает чрезмерно узкие разбиения

Скорость обучения  регулирует вклад каждой новой модели. Малое значение обычно делает обновления более осторожными, но для хорошего качества может понадобиться больше деревьев.

Не существует универсально оптимального сочетания параметров. Их выбирают с помощью валидации, учитывая качество и вычислительные затраты.

5. Переобучение, ранняя остановка и современные реализации

Если ансамбль содержит слишком много сложных деревьев, он может начать подстраиваться под шум обучающих данных. Для контроля переобучения используют ограничение глубины деревьев, уменьшение скорости обучения, случайный отбор объектов и раннюю остановку (Early Stopping).

Ранняя остановка прекращает добавление деревьев, если качество на отдельной валидационной выборке перестаёт улучшаться в течение заданного числа шагов.

Распространённые реализации градиентного бустинга:

•             GradientBoosting в scikit-learn — классическая реализация для небольших и средних наборов данных.

•             HistGradientBoosting в scikit-learn — вариант с гистограммным разбиением признаков, рассчитанный на более крупные наборы.

•             XGBoost, LightGBM и CatBoost — специализированные библиотеки с собственными оптимизациями, средствами регуляризации и особенностями обработки признаков.

Градиентный бустинг особенно эффективен для многих задач с табличными данными. Однако итоговое качество зависит от данных, настройки и корректной схемы проверки модели.

6. Практическая реализация на Python

Рассмотрим бинарную классификацию на искусственном наборе данных с помощью GradientBoostingClassifier.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score, classification_report

X, y = make_classification(
    n_samples=1000,
    n_features=10,
    n_informative=6,
    n_redundant=2,
    random_state=42
)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

model = GradientBoostingClassifier(
    n_estimators=100,
    learning_rate=0.1,
    max_depth=3,
    random_state=42
)

model.fit(X_train, y_train)
predictions = model.predict(X_test)

print("Accuracy:", accuracy_score(y_test, predictions))
print(classification_report(y_test, predictions))

В примере создаются числовые признаки и две категории объектов. После разделения данных ансамбль обучается на обучающей выборке. Затем рассчитывается качество на независимой тестовой части.

Эксперимент со скоростью обучения

Сравним несколько комбинаций параметров с помощью перекрёстной проверки только на обучающей выборке:

for rate in [0.03, 0.1, 0.3]:
    candidate = GradientBoostingClassifier(
        n_estimators=100,
        learning_rate=rate,
        max_depth=2,
        random_state=42
    )
    scores = cross_val_score(
        candidate, X_train, y_train,
        cv=5, scoring="accuracy"
    )
    print(f"learning_rate={rate}: {scores.mean():.3f}")

Для более полноценного подбора параметров следует одновременно исследовать learning_rate, n_estimators и сложность деревьев. Тестовую выборку используют после завершения выбора модели.

7. Практическое значение и выводы

Градиентный бустинг объединяет множество сравнительно простых моделей в сильный ансамбль. В отличие от случайного леса, деревья в бустинге добавляются последовательно и направлены на исправление ошибок текущего прогноза.

Главные преимущества метода — способность моделировать сложные нелинейные зависимости и высокое качество на табличных данных. Основные ограничения — чувствительность к гиперпараметрам, риск переобучения и последовательный характер обучения.

Главный результат лекции: понимание того, как ансамбль последовательно минимизирует функцию потерь, почему используются градиенты и как скорость обучения, число деревьев и ограничения сложности влияют на качество модели.