Рассмотрим подробнее алгоритм XGBoost (Extreme Gradient Boosting [1]), представляющий собой эффективную реализацию градиентного бустинга со многими возможностями и настройками.
XGBoost строится только над решающими деревьями. Основное отличие XGBoost от классического градиентного бустинга заключается в использовании разложения Тейлора второго порядка для аппроксимации функции потерь и явном включении штрафа за сложнос ть дерева в оптимизационную задачу. Это позволяет модели быстрее настраиваться и лучше обобщать данные.
Вспомним итерационный процесс: на шаге m мы ищем такое дерево fm(x), чтобы при добавлении его к ранее построенному ансамблю Fm−1(x) минимизировать общие потери (эмпирический риск). Запишем целевую функцию L на m-й итерации:
L(m)=n=1∑NL(yn,Fm−1(xn)+fm(xn))+Ω(fm)
Здесь L — функция потерь, а Ω(fm) — регуляризатор, ограничивающий сложность дерева по следующей формуле:
Ω(fm)=γJ+21λj=1∑Jwj2,
где
J - число листов дерева;
{wi}i - значения прогнозов в его листьях;
γ≥0,λ≥0 - гиперпараметры:
γ — это коэффициент сложности, накладывающий штраф за само наличие новых листьев в дереве.
λ — это коэффициент L2-регуляризации весов в листьях. Он занижает абсолютные значения весов wj, стремясь прижать их к нулю и заставляя модель меньше доверяет прогнозам в отдельных листьях.
Применим разложение Тейлора до второго порядка для функции L в окрестности точки Gm−1(xn):
Поскольку значение L(yn,Fm−1(xn)) уже определено на предыдущих шагах, оно является константой. Поэтому при минимизации L(m) её можно отбросить и минимизировать следующую функцию:
Пусть дерево fm(x) имеет J листьев, а функция q(x) возвращает индекс листа для объекта x. Прогноз дерева в j-м листе обозначим wj. Тогда fm(x)=wq(x).
Пусть Ij={n:q(xn)=j} — множество индексов объектов в j-м листе. Перепишем L~(m), группируя объекты по листьям, в которые они попали:
Как описывалось ранее, решающее дерево fm(x) строится сверху вниз, когда листы дерева итеративно разбиваются на левый и правый узел. Для поиска наилучшего разбиения узла на левое (L) и правое (R) подмножества используется критерий прироста (Gain). В XGBoost он рассчитывается как разность между структурной оценкой (2) до разбиения и после него.
Пусть I — множество индексов объектов в текущем узле, которое разбивается на индексы объектов в левом узле IL и правом узле IR, I=IL∪IR.
Основываясь на структурной оценке (2), прирост при разбиении вычисляется как разность между качеством дерева до и после добавления нового разветвления. В терминах сумм по индексам объектов формула выглядит следующим образом: