Машинное обучение

Gradient Boosting: XGBoost, LightGBM, CatBoost

На Kaggle - крупнейшей платформе соревнований по машинному обучению - одна библиотека выигрывала больше соревнований, чем все нейронные сети вместе взятые. Не GPT, не ResNet, а алгоритм на деревьях решений. Потом появились два конкурента, один из которых обучается в 20 раз быстрее, а другой сам обрабатывает категориальные данные. Сегодня эта тройка - XGBoost, LightGBM и CatBoost - стандарт индустрии для табличных данных. Что делает их настолько эффективными?

  • **Kaggle-соревнования:** с 2015 по 2023 год XGBoost, LightGBM и CatBoost использовались в более чем 70% winning solutions для табличных данных - от предсказания оттока клиентов до обнаружения мошенничества
  • **Яндекс Такси** использует CatBoost для предсказания ETA (estimated time of arrival) по десяткам категориальных признаков: район, тип дороги, время суток, погода - обрабатывая миллионы запросов в день
  • **Банки и страховые:** кредитный скоринг, fraud detection, pricing страховых полисов - gradient boosting доминирует в финансовой индустрии, потому что на табличных данных он обычно превосходит нейронные сети при меньших вычислительных затратах

От одной идеи к тройке индустриальных стандартов

Современный градиентный бустинг родился из статистики. В 1999-2001 годах Джером Фридман из Стэнфорда формализовал Gradient Boosting Machine, показав, что бустинг можно рассматривать как градиентный спуск в пространстве функций: каждое новое дерево делает шаг в сторону антиградиента функции потерь. Идея была мощной, но ранние реализации работали медленно. Прорыв в скорости и качестве принесла волна инженерных библиотек. В 2016 году Тяньци Чен и Карлос Гестрин представили XGBoost с регуляризацией, аппроксимацией второго порядка и histogram-based поиском сплитов. В 2017 году Microsoft выпустила LightGBM с leaf-wise ростом, GOSS и EFB, а Яндекс - CatBoost с ordered boosting и нативной обработкой категорий. За неполные два десятилетия теоретическая идея Фридмана превратилась в тройку библиотек, которые доминируют на табличных данных по сей день.

Предварительные знания

  • Bagging vs Boosting

XGBoost: eXtreme Gradient Boosting

В предыдущем уроке мы разобрали идею Gradient Boosting: каждое новое дерево обучается предсказывать **остатки (residuals)** - ошибки всех предыдущих деревьев. Классический Gradient Boosting работает, но на практике он медленный и склонен к переобучению. В 2014 году Тяньци Чен (Tianqi Chen) из Вашингтонского университета опубликовал XGBoost - библиотеку, которая превратила эту идею в инженерный шедевр.

Что XGBoost сделал иначе? Три ключевых инновации. **Первая - регуляризация.** Классический Gradient Boosting оптимизирует только loss-функцию. XGBoost добавляет штраф за сложность дерева: L1 (alpha) и L2 (lambda) регуляризация на веса листьев, плюс штраф за количество листьев. Это как в Ridge/Lasso регрессии, но для деревьев.

**Вторая инновация - column subsampling.** По аналогии с Random Forest, XGBoost при построении каждого дерева (или каждого сплита) использует случайное подмножество признаков. Это уменьшает корреляцию между деревьями и дополнительно борется с переобучением. **Третья - нативная обработка пропусков (missing values).** XGBoost при каждом сплите автоматически определяет, в какую ветку направить наблюдения с пропущенными значениями - влево или вправо - выбирая направление, которое минимизирует loss.

**Kaggle-доминирование XGBoost (2014-2020):** После публикации XGBoost стал де-факто стандартом на Kaggle: - **2015:** 17 из 29 winning solutions использовали XGBoost - **2016-2019:** XGBoost присутствовал в ~60% топ-решений для табличных данных - Крупные компании (Alibaba, Facebook, Airbnb) внедрили его в продакшен Тяньци Чен разработал XGBoost как курсовой проект аспирантуры. Библиотека набрала 25 000+ звёзд на GitHub и стала одним из самых цитируемых ML-пакетов в истории.

Какая ключевая инновация XGBoost по сравнению с классическим Gradient Boosting помогает бороться с переобучением?

LightGBM: скорость и эффективность

В 2017 году команда Microsoft Research опубликовала LightGBM - библиотеку, которая решала главную проблему XGBoost: **скорость на больших данных**. Когда датасет содержит миллионы строк и сотни признаков, XGBoost может обучаться часами. LightGBM делает то же самое в 10-20 раз быстрее, часто с таким же или лучшим качеством. Секрет - в трёх архитектурных решениях.

**Leaf-wise (best-first) рост** - первая инновация LightGBM. Вместо того чтобы расщеплять все узлы на текущем уровне (level-wise, как XGBoost по умолчанию), LightGBM выбирает лист с **наибольшим потенциальным уменьшением loss** и расщепляет только его. При одинаковом количестве листьев leaf-wise даёт более глубокие, но более точные деревья. Цена - повышенный риск переобучения на маленьких данных, поэтому параметр `num_leaves` (а не `max_depth`) становится основным ограничителем сложности.

**GOSS (Gradient-based One-Side Sampling)** - вторая инновация. Наблюдения с маленьким градиентом - это те, которые модель уже предсказывает хорошо. GOSS сохраняет все наблюдения с большим градиентом (сложные примеры), но случайно отбирает лишь малую долю наблюдений с малым градиентом, компенсируя их вес. Результат: на порядок меньше данных для поиска сплита, почти без потери качества.

**Leaf-wise = переобучение на малых данных.** LightGBM может давать великолепные результаты на 100K+ строк, но на датасетах меньше 10K строк он склонен к переобучению сильнее, чем XGBoost. Если данных мало, уменьшайте `num_leaves` (до 15-20), увеличивайте `min_child_samples` и используйте `max_depth` как дополнительный ограничитель.

Почему LightGBM обучается в 10-20 раз быстрее XGBoost на больших данных?

CatBoost: категории без кодирования

В 2017 году Яндекс опубликовал CatBoost (Categorical Boosting) - третью из тройки ведущих библиотек gradient boosting. Главная идея: **обработка категориальных признаков** (город, цвет, тип устройства) без ручного кодирования. Когда вы используете XGBoost или LightGBM, вам нужно самостоятельно применить one-hot encoding, label encoding или target encoding. CatBoost делает это нативно и корректнее, чем большинство ручных подходов.

**Ordered Boosting** - вторая ключевая идея CatBoost. В классическом Gradient Boosting есть скрытая проблема: residuals, на которых обучается новое дерево, вычислены на тех же данных, по которым обучались предыдущие деревья. Это вносит смещение (bias). CatBoost решает это через ordered boosting: для каждого наблюдения residuals вычисляются моделью, обученной *без* этого наблюдения. На практике это реализуется через случайные перестановки данных.

**CatBoost - лучший "из коробки".** На практике CatBoost часто даёт хорошие результаты с дефолтными параметрами: - Ordered boosting автоматически снижает переобучение - Symmetric trees работают как встроенный регуляризатор - Нативная обработка категорий убирает этап feature engineering Это делает CatBoost идеальным выбором для быстрых прототипов: загрузил данные, указал категориальные столбцы, запустил - и получил конкурентный результат без часов тюнинга.

Яндекс использует CatBoost в продакшене для ранжирования поисковой выдачи, рекомендаций в Яндекс Музыке, и предсказания ETA в Яндекс Такси. Для компании с огромным количеством категориальных данных (города, типы запросов, категории товаров) нативная обработка категорий - критическое преимущество.

Как CatBoost решает проблему target leakage при кодировании категориальных признаков?

Гиперпараметры и практика

Вы узнали три библиотеки - XGBoost, LightGBM, CatBoost - и их уникальные подходы. Но на практике 80% качества модели определяется не выбором библиотеки, а **правильной настройкой гиперпараметров**. Все три библиотеки имеют десятки параметров, но есть ядро из 5-6, которые дают наибольший эффект.

Самый важный trade-off: **learning_rate и n_estimators**. Маленький learning_rate (0.01-0.05) означает, что каждое дерево вносит крошечный вклад. Нужно больше деревьев, обучение медленнее, но итоговое качество - выше. Большой learning_rate (0.1-0.3) - каждое дерево вносит заметный вклад, нужно меньше деревьев, обучение быстрее, но легче переобучиться. Правило: **уменьшай learning_rate и увеличивай n_estimators настолько, насколько позволяет вычислительный бюджет**.

**Gradient Boosting - не серебряная пуля.** Эта тройка доминирует на табличных данных, но для изображений, текста и последовательностей нейронные сети (CNN, Transformer) работают значительно лучше. Gradient Boosting также плохо экстраполирует за пределы обучающих данных: если в обучении максимальная цена квартиры была 50M, модель не предскажет 100M. Помните No Free Lunch: выбор метода зависит от задачи и данных.

Всегда нужно выбрать одну лучшую библиотеку (XGBoost, LightGBM или CatBoost) и использовать только её

На практике стоит попробовать все три на вашем датасете и сравнить результаты через cross-validation. Более того, ансамбль из моделей разных библиотек (stacking/blending) часто даёт лучший результат, чем любая одна модель

Разные библиотеки строят деревья по-разному (level-wise, leaf-wise, symmetric), используют разные подходы к категориям и регуляризации. На разных данных лидирует разная библиотека. Ансамбль компенсирует слабости каждой, и именно так выигрывают Kaggle-соревнования: не одна модель, а комбинация нескольких

Вы обучаете LightGBM с learning_rate=0.01 и n_estimators=10000. Validation loss перестал улучшаться на итерации 1200. Что сделает early_stopping_rounds=100?

Ключевые идеи

  • **XGBoost** добавил к классическому Gradient Boosting регуляризацию (L1/L2 на веса листьев), column subsampling и нативную обработку пропусков - и стал доминировать на Kaggle с 2014 года
  • **LightGBM** от Microsoft ускорил обучение в 10-20 раз через три инновации: leaf-wise рост деревьев, GOSS (семплирование сложных примеров) и EFB (сжатие sparse-признаков)
  • **CatBoost** от Яндекса решил проблему категориальных признаков через ordered target encoding (без target leakage) и symmetric trees - работает хорошо "из коробки" с минимальным тюнингом
  • **Гиперпараметры:** learning_rate + n_estimators - главный trade-off; early_stopping автоматически останавливает обучение; Optuna подбирает параметры эффективнее grid search - и именно грамотная настройка этих параметров делает тройку библиотек тем самым оружием, которое побеждает на Kaggle чаще всех нейронных сетей

Связанные темы

Gradient Boosting тройка строится на фундаменте ансамблей и деревьев решений. Дальше - как подготовить данные и автоматизировать настройку:

  • Bagging и Boosting — Фундамент, на котором построены XGBoost, LightGBM и CatBoost - идея последовательного обучения деревьев на ошибках предыдущих
  • Деревья решений — Базовый "кирпичик" Gradient Boosting - каждое дерево в ансамбле строится по тем же принципам разбиения пространства признаков
  • Feature Engineering — Как подготовить признаки для Gradient Boosting - кодирование категорий, обработка пропусков, создание новых фичей
  • Подбор гиперпараметров — Систематические методы поиска оптимальных параметров - grid search, random search, байесовская оптимизация (Optuna, Hyperopt)

Вопросы для размышления

  • LightGBM в 10-20 раз быстрее XGBoost - значит ли это, что XGBoost устарел? В каких ситуациях XGBoost может быть лучшим выбором?
  • CatBoost обрабатывает категории нативно. Может ли ручной feature engineering (target encoding, embedding) всё равно дать лучший результат? Когда?
  • Gradient Boosting доминирует на табличных данных, но нейронные сети - на изображениях и тексте. Почему? Что принципиально отличает табличные данные от картинок?

Связанные уроки

  • ml-21-bagging-boosting — Основы бустинга предшествуют градиентному бустингу
  • ml-11-decision-trees — Слабые ученики здесь - неглубокие деревья решений
  • ml-43-hyperparameters — Скорость обучения и глубину надо тщательно настраивать
  • calc-19-gradient — Каждый раунд подгоняет антиградиент функции потерь
  • opt-01 — Бустинг - градиентный спуск в пространстве функций
  • alg-21-dp
Gradient Boosting: XGBoost, LightGBM, CatBoost

0

1

Войти