Машинное обучение
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 и нативной обработкой категорий. За неполные два десятилетия теоретическая идея Фридмана превратилась в тройку библиотек, которые доминируют на табличных данных по сей день.
Предварительные знания
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