Лекция
9. Градиентный бустинг
Цель
лекции. Изучить
принцип последовательного построения ансамбля моделей, понять роль функции
потерь, градиента и скорости обучения. Рассмотреть применение градиентного
бустинга для классификации и регрессии, способы борьбы с переобучением и
реализацию в Python.
Ключевые
понятия:
градиентный бустинг, слабый алгоритм, ансамбль, функция потерь, антиградиент,
остатки, скорость обучения, количество деревьев, глубина деревьев, ранняя
остановка.
1. Идея
градиентного бустинга
Градиентный
бустинг (Gradient Boosting) — ансамблевый метод машинного обучения, в котором модели добавляются последовательно.
Каждая следующая модель стремится уменьшить ошибки уже построенного ансамбля.
В отличие
от бэггинга, где базовые модели обучаются преимущественно независимо и их
ответы объединяются, бустинг последовательно корректирует общий прогноз. В
качестве базовых моделей часто используются небольшие деревья решений.
Общая форма
ансамбля после
шагов:

Здесь
— начальный прогноз,
— очередная базовая модель,
— количество шагов,
— скорость обучения.
Пример. Если модель прогнозирует цену
квартиры 30 млн тенге, а следующая модель предсказывает поправку +2 млн,
обновлённый прогноз при скорости обучения 0,1 составит 30,2 млн тенге.
2. Последовательное исправление ошибок
Для
понимания бустинга рассмотрим регрессию с квадратичной функцией потерь. Сначала
ансамбль выдаёт простое начальное предсказание, например среднее значение
целевой переменной:
![]()
Затем для
каждого обучающего объекта рассчитывается остаток:
![]()
Очередное
дерево обучается приближать эти остатки. После этого прогноз ансамбля
обновляется:
![]()
Таким
образом, каждое новое дерево не заменяет предыдущие, а добавляет корректировку.
При квадратичной потере обучение на остатках соответствует движению в
направлении отрицательного градиента функции потерь с точностью до постоянного
множителя.
Важно: для
других функций потерь используются не обязательно обычные остатки, а псевдоостатки,
полученные из производных функции потерь.
Общий
принцип градиентного бустинга заключается в минимизации выбранной функции
потерь
.
На шаге
вычисляются псевдоостатки:
![]()
Новая
модель
обучается предсказывать эти величины. В
некоторых реализациях затем отдельно определяются оптимальные значения поправок
в листьях деревьев.
Для
регрессии часто используют квадратичную ошибку:
![]()
Её
отрицательная производная по прогнозу равна:
![]()
Поэтому при
квадратичной ошибке псевдоостатки совпадают с обычными остатками.
Для
бинарной классификации применяется, например, логистическая потеря. В таком
случае ансамбль формирует оценки, преобразуемые в вероятности через сигмоиду:
![]()
Таким
образом, идея последовательной коррекции сохраняется, но вид ошибки зависит от
задачи и функции потерь.
Качество
бустинга существенно зависит от настройки сложности базовых моделей и размера
каждого шага.
|
Параметр |
Назначение |
Возможное
влияние |
|
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. Практическое значение и выводы
Градиентный
бустинг объединяет множество сравнительно простых моделей в сильный ансамбль. В
отличие от случайного леса, деревья в бустинге добавляются последовательно и
направлены на исправление ошибок текущего прогноза.
Главные
преимущества метода — способность моделировать сложные нелинейные зависимости и
высокое качество на табличных данных. Основные ограничения — чувствительность к
гиперпараметрам, риск переобучения и последовательный характер обучения.
Главный результат лекции:
понимание того, как ансамбль последовательно минимизирует функцию потерь,
почему используются градиенты и как скорость обучения, число деревьев и
ограничения сложности влияют на качество модели.