Алгоритм XGBoost: как работает градиентный бустинг

Алгоритм XGBoost (eXtreme Gradient Boosting) - это реализация градиентного бустинга над деревьями решений, которая годами держится в топе на соревнованиях по табличным данным. Идея бустинга противоположна случайному лесу: деревья строятся не параллельно и независимо, а последовательно, и каждое новое дерево исправляет ошибки уже собранного ансамбля. XGBoost добавляет к классическому бустингу регуляризацию, точную работу со вторыми производными функции потерь и инженерные оптимизации, за счёт чего обучается быстро и редко переобучается. Ниже разберём математику аддитивной модели, роль learning rate и регуляризации, раннюю остановку и типичные ошибки. Чтобы сразу почувствовать, как скорость обучения и число деревьев влияют на ошибку, - покрути калькулятор ниже.
Что такое XGBoost и чем он отличается от случайного леса
XGBoost относится к семейству бустинга - ансамблевых методов, где базовые модели (обычно неглубокие деревья) обучаются по очереди. В отличие от случайного леса, где деревья независимы и усредняются, в бустинге каждое следующее дерево обучается на том, в чём ошибся текущий ансамбль. Предсказание собирается как сумма вкладов всех деревьев:
где - -е дерево решений из пространства деревьев , а - общее число деревьев (бустинг-итераций). Случайный лес снижает прежде всего дисперсию (усреднение похожих сильных деревьев), а бустинг последовательно снижает смещение, наращивая выразительность модели маленькими шагами. Поэтому деревья в XGBoost обычно мелкие (глубина 3-6): каждое из них - слабый ученик, а сила берётся из их числа.
Аддитивная модель и градиентный шаг
Ансамбль строится жадно: на итерации мы уже имеем модель и добавляем к ней одно новое дерево , минимизируя суммарную функцию потерь:
где - learning rate (скорость обучения, шаг бустинга). Чтобы понять, чему должно учиться новое дерево, XGBoost раскладывает функцию потерь в ряд Тейлора до второго порядка вокруг текущего прогноза. Для каждого объекта считаются градиент и гессиан :
Использование второй производной (гессиана) - ключевое отличие XGBoost от классического градиентного бустинга, который опирается только на градиент. Второй порядок даёт более точный шаг, как метод Ньютона по сравнению с обычным градиентным спуском.

Каждое дерево, по сути, аппроксимирует антиградиент потерь - направление, в котором нужно подвинуть прогноз. Для квадратичной ошибки антиградиент - это в точности остаток , поэтому интуиция «каждое дерево учится на остатках предыдущих» строго верна для регрессии.
Целевая функция с регуляризацией
XGBoost минимизирует не просто сумму потерь, а потери плюс штраф за сложность деревьев - в этом «eXtreme» относительно обычного бустинга. Целевая функция на итерации :
где регуляризатор для дерева с листьями и весами листьев задаётся как
Здесь штрафует за число листьев (то есть за разбиения - чем больше , тем консервативнее дерево), а - это L2-регуляризация весов листьев. Подставив тейлоровское приближение, можно вывести оптимальный вес листа и выигрыш от разбиения в замкнутой форме:
где - множество объектов, попавших в лист , а и - суммы градиентов и гессианов в левой и правой ветках кандидата на разбиение. XGBoost перебирает признаки и пороги, выбирая разбиение с максимальным ; если лучший оказывается отрицательным (штраф перевесил выигрыш), разбиение не делается - это встроенная регуляризация структуры дерева.
Learning rate и число деревьев
Множитель (в библиотеке - eta или learning_rate) задаёт, какую долю вклада каждого дерева мы добавляем в ансамбль. Маленький (0,01-0,1) делает шаги осторожными: ошибка падает медленнее, зато модель устойчивее и реже переобучается, но требует больше деревьев. Большой (0,3 и выше) быстро снижает ошибку обучения, но рискует «проскочить» оптимум и переобучиться. Снижение ошибки приближённо описывается законом убывающей геометрической прогрессии:
где - стартовая ошибка, - неустранимый «пол» (шум данных и ограничения модели), а - эффективность одного дерева. Из формулы видно главное правило настройки: и работают в связке - уменьшив learning rate вдвое, нужно примерно вдвое увеличить число деревьев, чтобы дойти до того же уровня ошибки. На практике берут небольшой и подбирают по валидации.
Переобучение и ранняя остановка
Поскольку ошибка обучения у бустинга монотонно падает почти до нуля, ориентироваться на неё нельзя - в какой-то момент модель начинает запоминать шум. Ошибка на отложенной (валидационной) выборке сначала падает вместе с обучающей, но затем выходит на минимум и начинает расти: это и есть зона переобучения.

Стандартный приём - ранняя остановка (early_stopping_rounds): обучение прекращается, если валидационная метрика не улучшается заданное число итераций подряд, и берётся модель на лучшей итерации. Дополнительно переобучение сдерживают: уменьшением max_depth (мельче деревья), увеличением lambda, gamma и min_child_weight, а также подвыборкой строк (subsample) и столбцов (colsample_bytree) - заимствованной у случайного леса рандомизацией, которая снижает корреляцию деревьев.
Где XGBoost силён, а где нет
XGBoost - почти стандартный выбор для табличных данных среднего размера: смешанные числовые и категориальные признаки, нелинейные зависимости, пропуски (алгоритм умеет выбирать направление по умолчанию для отсутствующих значений прямо при разбиении). На таких задачах он часто обыгрывает нейросети. Зато на изображениях, звуке и тексте, где важна пространственная или последовательная структура, деревья проигрывают свёрточным и трансформерным сетям. На очень больших разреженных данных конкурируют LightGBM (рост листьями, гистограммы) и CatBoost (нативная обработка категорий) - все три из одного семейства градиентного бустинга, выбор между ними решается замером на конкретной задаче.
Частые ошибки
- Путают бустинг с бэггингом. В случайном лесу деревья независимы и усредняются (снижают дисперсию), в XGBoost - последовательны и исправляют друг друга (снижают смещение). Это разные ансамблевые стратегии, а не «лес против одного дерева».
- Ставят большой learning rate ради скорости. Высокий быстро роняет ошибку обучения, но валидационная начинает расти раньше - выгоднее маленький и больше деревьев с ранней остановкой.
- Контролируют число деревьев на глаз, без валидации. Ошибка обучения падает почти до нуля всегда; о переобучении говорит только рост ошибки на отложенной выборке. Нужен
early_stopping_rounds. - Забывают про регуляризацию. Параметры , ,
min_child_weight- это не «опциональные крутилки», а главный рычаг против переобучения; на дефолтах глубокие деревья легко запоминают шум. - Считают, что XGBoost универсален. На картинках и тексте он почти всегда проигрывает нейросетям - его ниша именно табличные данные.
FAQ
Чем XGBoost отличается от обычного градиентного бустинга? Тремя вещами: разложением потерь до второго порядка (использует гессиан, а не только градиент), встроенной регуляризацией в целевой функции и инженерными оптимизациями (гистограммы, параллельный перебор разбиений, обработка пропусков). За счёт этого он точнее и быстрее классического GBM.
Что важнее настраивать - learning rate или число деревьев? Их настраивают в связке. Обычно фиксируют небольшой (0,05-0,1), а число деревьев подбирают автоматически ранней остановкой по валидации. Уменьшение требует пропорционального роста числа деревьев для того же качества, поэтому отдельно «оптимального» числа деревьев без указания не существует.
Нужно ли масштабировать признаки для XGBoost? Нет. Деревья делят пространство по порогам и инвариантны к монотонным преобразованиям признаков, поэтому стандартизация и нормировка не нужны - в отличие от линейных моделей и нейросетей. Категориальные признаки, впрочем, требуют кодирования (или используйте CatBoost).
Коротко
XGBoost - это градиентный бустинг над неглубокими деревьями: ансамбль строится последовательно, каждое дерево делает шаг по антиградиенту функции потерь, а целевая функция включает штраф за сложность . Скорость обучения и число деревьев настраиваются вместе, переобучение сдерживают регуляризацией и ранней остановкой. Сильная сторона - табличные данные; на изображениях и тексте выигрывают нейросети.
Читайте также

Алгоритм CatBoost: бустинг с обработкой категорий
Алгоритм CatBoost простыми словами: упорядоченный бустинг против сдвига прогноза, кодирование категориальных признаков через ordered target statistics, симметричные деревья и разбор типовых задач.

Алгоритм LightGBM: быстрый градиентный бустинг
Алгоритм LightGBM простыми словами: рост дерева по листьям против роста по уровням, гистограммы признаков, GOSS и EFB, настройка num_leaves и learning rate, борьба с переобучением и разбор задач.

Случайный лес: алгоритм Random Forest простыми словами
Случайный лес (Random Forest) - ансамблевый метод ML: как работает бэггинг, чем отличается от одного дерева, Out-of-Bag оценка, важность признаков и разбор задач.