XGBoost
XGBoost — библиотека градиентного бустинга, которая последовательно добавляет регуляризованные деревья решений; это один из лучших вариантов для табличных данных. Как она работает и примеры кода.
XGBoost (экстремальный градиентный бустинг) — библиотека с открытым исходным кодом для градиентного бустинга над деревьями решений и один из самых популярных инструментов для табличных данных. Тяньци Чэнь начал разрабатывать её как исследовательский проект в Вашингтонском университете и выпустил в 2014 году. В статье 2016 года для KDD «XGBoost: масштабируемая система бустинга деревьев», написанной совместно с Карлосом Гестрином, описаны регуляризованная целевая функция и архитектура системы. Библиотека, которую поддерживает сообщество DMLC, выполняет классификацию, регрессию и ранжирование на Python, R, JVM и C, работает на CPU и GPU, а также масштабируется с помощью Dask и Spark. В статье сообщается, что XGBoost использовался в 17 из 29 решений-победителей соревнований, опубликованных в блоге Kaggle в 2015 году.
Как работает XGBoost#
XGBoost последовательно строит ансамбль: начинает с постоянного предсказания и на каждом раунде бустинга добавляет одно дерево, обученное уменьшать функцию потерь, оставшуюся после предыдущих деревьев. Итоговое предсказание — сумма выходов деревьев, каждый из которых умножается на скорость обучения (eta, по умолчанию 0.3), чтобы ни одно дерево не доминировало. Две идеи из статьи определяют, как строится каждое дерево:
- Целевая функция второго порядка: Для каждой строки XGBoost вычисляет первую и вторую производные функции потерь относительно текущего предсказания — градиент
gи гессианh. Листу, в котором сумма градиентов строк равнаG, а сумма гессианов —H, присваивается вес-G / (H + λ): это тот же шаг Ньютона, который выполняют оптимизаторы второго порядка. - Регуляризованные деревья: В целевую функцию входит штраф
γза каждый лист и штраф L2λза веса листьев, а также необязательный штраф L1α. Разбиение сохраняется только при положительном приросте качества½ [G_L²/(H_L + λ) + G_R²/(H_R + λ) − (G_L + G_R)²/(H_L + H_R + λ)] − γ. Так регуляризация встраивается в построение деревьев и ограничивает переобучение.
Глубина деревьев ограничена (max_depth, по умолчанию 6); они растут уровень за уровнем, если только grow_policy="lossguide" не включает рост от листьев. Обычно обучение останавливают досрочно, используя валидационный набор:
Пропущенные значения, скорость и масштабирование#
Алгоритм XGBoost для поиска разбиений с учётом разреженности позволяет обучаться на таблицах с пропусками без импутации. На каждом разбиении он пробует направить строки с пропущенным значением сначала налево, затем направо, и выбирает направление с большим приростом качества как ветвь по умолчанию для этого узла. Этот же механизм позволяет просматривать только сохранённые элементы разреженных матриц, например матриц с унитарным кодированием. В этом примере 30% всех значений признаков в наборе данных рака молочной железы из scikit-learn скрываются, а модель обучается непосредственно на данных с пропусками:
import numpy as np
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
# Hide 30% of all values; each split learns a default branch for missing ones
rng = np.random.default_rng(0)
X_train_nan = np.where(rng.random(X_train.shape) < 0.3, np.nan, X_train)
X_test_nan = np.where(rng.random(X_test.shape) < 0.3, np.nan, X_test)
for name, train, test in [("complete", X_train, X_test), ("30% missing", X_train_nan, X_test_nan)]:
model = xgb.XGBClassifier(n_estimators=200, max_depth=4, learning_rate=0.1)
model.fit(train, y_train)
print(f"{name}: accuracy {model.score(test, y_test):.3f}")Он выводит тестовую точность: 0.972 для полного набора данных и 0.951, если в каждом из двух наборов — обучающем и тестовом наборе — отсутствуют 30% значений.
Для ускорения метод построения деревьев hist, используемый по умолчанию, разбивает каждый признак максимум на 256 интервалов (max_bin) и ищет разбиения по границам интервалов — так же, как LightGBM. Метод exact перебирает каждое отсортированное значение. Параметр device="cuda" переносит обучение на GPU NVIDIA, enable_categorical=True позволяет обрабатывать категориальные столбцы напрямую, а режим внешней памяти позволяет обучаться на наборах данных, превышающих объём оперативной памяти. Начиная с версии 2.1, модели по умолчанию сохраняются в двоичном формате UBJSON.
XGBoost и родственные методы#
- LightGBM: Библиотека бустинга от Microsoft, выпущенная в 2016 году. По умолчанию строит деревья от листьев, а также применяет градиентную выборку строк и объединение разреженных признаков. Сейчас обе библиотеки по умолчанию используют гистограммы и опираются на многие одинаковые методы.
- CatBoost: Библиотека бустинга от Яндекса, которая строит симметричные деревья и кодирует категориальные признаки с помощью упорядоченной статистики целевой переменной.
- Случайный лес: Метод бэггинга, который независимо обучает глубокие деревья на бутстрэп-выборках и усредняет их результаты. Это снижает дисперсию и требует минимальной настройки.
- Глубокое обучение: Стандартный подход для неструктурированных данных — изображений, аудио и текста, где нейросети извлекают признаки из исходных данных. Для таблиц с подготовленными признаками обычно в качестве базового решения используют градиентный бустинг над деревьями, который и нужно превзойти. Теперь с ним конкурируют фундаментальные модели для табличных данных, например TabPFN, на небольших наборах данных.
Примеры применения в реальных условиях#
- Обнаружение мошенничества и оценка кредитного риска: Платёжные компании оценивают каждую транзакцию по сумме, продавцу, местоположению, устройству и истории счёта. Это одна из основных задач прогностического моделирования, где высокая скорость вывода XGBoost подходит для принятия решений в реальном времени.
- Визуальный контроль: системы контроля качества на производстве объединяют данные камер и сенсоров. Предсказания Ultralytics YOLO26 дают данные со стороны камеры:
result.summary()возвращает класс, уверенность и координаты рамки для каждого обнаруженного дефекта. Завод может агрегировать их по деталям и объединить с показаниями температуры и давления в качестве признаков для модели XGBoost, предсказывающей отказы. - Ранжирование и прогнозирование кликов:
XGBRankerпо умолчанию обучается с целевой функциейrank:ndcg, чтобы упорядочивать результаты поиска, а бинарные классификаторы предсказывают вероятность перехода по рекламе. - Задачи — победители соревнований: В статье KDD перечислены задачи, решённые командами-победителями в 2015 году: прогнозирование продаж магазинов, классификация событий физики высоких энергий, классификация вредоносных программ и прогнозирование отсева на массовых онлайн-курсах.










