Алгоритм XGBoost
Рассмотрим подробнее алгоритм XGBoost (Extreme Gradient Boosting [1]), представляющий собой эффективную реализацию градиентного бустинга со многими возможностями и настройками.
Мотивация
XGBoost строится только над решающими деревьями. Основное отличие XGBoost от классического градиентного бустинга заключается в использовании разложения Тейлора второго порядка для аппроксимации функции потерь и явном включении штрафа за сложность дерева в оптимизационную задачу. Это позволяет модели быстрее настраиваться и лучше обобщать данные.
Вывод целевой функции
Вспомним итерационный процесс: на шаге мы ищем такое дерево , чтобы при добавлении его к ранее построенному ансамблю минимизировать общие потери (эмпирический риск). Запишем целевую функцию на -й итерации:
Здесь — функция потерь, а — регуляризатор, ограни чивающий сложность дерева по следующей формуле:
где
-
- число листов дерева;
-
- значения прогнозов в его листьях;
-
- гиперпараметры:
-
— это коэффициент сложности, накладывающий штраф за само наличие новых листьев в дереве.
-
— это коэффициент -регуляризации весов в листьях. Он занижает абсолютные значения весов , стремясь прижать их к нулю и заставляя модель меньше доверяет прогнозам в отдельных листьях.
-
Применим разложение Тейлора до второго порядка для функции в окрестности точки :
где и — градиент и гессиан (вторая производная) функции потерь:
Поскольку значение уже определено на предыдущих шагах, оно является константой. Поэтому при минимизации её можно отбросить и минимизировать следующую функцию:
Оптимизация весов в листьях
Пусть дерево имеет листьев, а функция возвращает индекс листа для объекта . Прогноз дерева в -м листе обозначим . Тогда .
Пусть — множество индексов объектов в -м листе. Перепишем , группируя объекты по листьям, в которые они попали:
Для краткости введём обозначения: (суммарный градиент в листе) и (суммарный гессиан).
Рассмотрим вклад одного -го листа в общую ошибку. Это выражение имеет вид квадратичной функции , где:
Вспомним, что минимум параболы при достигается в точке .
Применим это для нахождения оптимального прогноза :
Чтобы найти минимальное значение целевой функции для данной структуры дерева, подставим обратно в выражение для -го листа:
Подставив эти оптимальные значения в (1), получим структурную оценку качества дерева:
Критерий информативности
Как описывалось ранее, решающее дерево строится сверху вниз, когда листы дерева итеративно разбиваются на левый и правый узел. Для поиска наилучшего разбиения узла на левое () и правое () подмножества используется критерий прироста (Gain). В XGBoost он рассчитывается как разность между структурной оценкой (2) до разбиения и после него.
Пусть — множество индексов объектов в текущем узле, которое разбивается на индексы объектов в левом узле и правом узле , .
Основываясь на структурной оценке (2), прирост при разбиении вычисляется как разность между качеством дерева до и после добавления нового разветвления. В терминах сумм по индексам объектов формула выглядит следующим образом:
Разбор компонентов формулы:
- Первое слагаемое — вклад левого дочернего узла.
- Второе слагаемое — вклад правого дочернего узла.
- Третье слагаемое — вклад исходного узла до разбиения (используются суммы градиентов и гессианов всех объектов в узле).
- — штраф за создание нового листа (регуляризация).
Алгоритм жадно максимизирует этот критерий: если для всех возможных разбиений , то разбиение не производится. Это естественным образом ограничивает глубину дерева в зависимости от гиперпараметра .
Данный критерий заменяет собой стандартные критерии Джини или энтропию. Он напрямую минимизирует аппроксимированную функцию потерь пользователя, поскольку зависит от что позволяет повысить точность на уровне каждого дерева.
Особенности библиотеки
XGBoost — это не просто алгоритм, а высокооптимизированная программная система. Чтобы ознакомиться с полным спектром её возможностей, рекомендуется обратиться к официальной документации [2].
Выделим ключевые особенности:
- Поиск порогов по сетке: для данных с огромным числом уникальных значений признаков XGBoost строит гистограммы распределения и перебирает в качестве порогов только квантили признака. Это значительно ускоряет обучение без существенной потери точности.
- Использование GPU: XGBoost поддерживает перенос вычислений на видеокарту, которая эффективно распараллеливает построение гистограмм и поиск разбиений, что дает кратное ускорение на больших датасетах.
- Работа с пропусками: алгоритм автоматически определяет «направление по умолчанию» для пропущенных или нулевых значений в каждом узле, выбирая ветку, которая минимизирует общие потери.
- Системные оптимизации:
- данные хранятся во внутренних буферах процессора таким образом, чтобы минимизировать задержки при чтении градиентов.
- возможность эффективно обрабатывать данные, не помещающиеся в оперативную память, за счет использования дискового пространства.
- Регуляризация и сэмплирование:
- Поддержка не только , но и -регуляризации весов.
- Column Subsampling: случайный выбор подмножества признаков для каждого дерева или уровня (аналогично случайному лесу).
- Режим DART [3]: на каждой итерации случайно исключается часть построенных деревьев, что предотвращает их доминирование и снижает риск переобучения итоговой модели.
Благодаря перечисленным возможностям, метод долгое время был лучшим решением самостоятельно или в ансамбле с другими методами на платформе Kaggle в задачах с табличными структурами данных.
Литература
- Chen T., Guestrin C. Xgboost: A scalable tree boosting system //Proceedings of the 22nd acm sigkdd international conference on knowledge discovery and data mining. – 2016. – С. 785-794.
- Документация XGBoost.
- Vinayak R. K., Gilad-Bachrach R. Dart: Dropouts meet multiple additive regression trees //Artificial Intelligence and Statistics. – PMLR, 2015. – С. 489-497.