18 / 27 · Деревья и ансамбли
Градиентный бустинг
Последовательное построение ансамбля, в котором каждое небольшое дерево исправляет текущие ошибки: подгонка остатков, бустинг как градиентный спуск в пространстве функций с выводом, сжатие шага и подвыборки, распространённые функции потерь, бустинг второго порядка с весами листьев и приростом разбиения XGBoost, сравнение LightGBM и CatBoost, ранняя остановка и стекинг с предсказаниями вне фолда.
Бэггинг и случайный лес · Решающие деревья · Градиентный спуск · Логистическая регрессия
На этой странице 14
Бэггинг и случайный лес из предыдущей заметки усредняют деревья, выращенные независимо. Усреднение сохраняет смещение отдельного дерева и снижает только его разброс, поэтому ему нужны глубокие деревья с малым смещением, и оно ничего не может сделать с систематической ошибкой, общей для всех деревьев. Бустинг (boosting) строит ансамбль наоборот. Деревья небольшие и выращиваются одно за другим, и каждое новое дерево подгоняется под то, в чём текущий ансамбль ещё ошибается. Тогда у суммы многих слабых деревьев смещение мало, а разброс контролируется тем, что каждый шаг делается малым и обучение вовремя останавливается. Фридман (2001) показал, что это градиентный спуск, выполняемый в пространстве функций, а не в пространстве параметров, и поэтому он работает для любой дифференцируемой функции потерь. Градиентный бустинг над деревьями в реализациях XGBoost, LightGBM и CatBoost — метод по умолчанию для табличных данных.
Обозначения. — дифференцируемая функция потерь предсказания (числа: значения регрессии или логарифма шансов в классификации). Модель после шагов — , где — лучшая константа, — регрессионное дерево (базовый алгоритм, base learner), а — шаг обучения (learning rate). На шаге величины и вычисляются при . У дерева с листьями области и значения в листьях .
Подгонка остатков#
Начнём с квадратичной функции потерь и константной модели . Её ошибки на обучающей выборке — остатки (residuals) . Дерево , подогнанное к остаткам методом наименьших квадратов, предсказывает, где модель слишком занижает и где слишком завышает, поэтому ближе к данным; новые остатки подгоняются деревом , и так далее. Игрушечный пример с четырьмя точками, и , пнями (stumps) и : , остатки равны . Лучший пень разбивает между 3 и 4 и предсказывает слева и справа, поэтому , а MSE на обучении падает с до . Ещё два пня доводят её до и .
Бустинг шаг за шагом
На рисунке та же процедура применяется к 50 зашумлённым точкам синусоиды:
- Первый пень делит остатки константной модели на положительную и отрицательную половины; к модели добавляется половина пня.
- У остатков всё ещё есть явная форма, и второй пень подгоняется под неё.
- После пяти шагов у модели шесть ступенек, и остатки малы.
- После сорока модель следует синусоиде, а остатки похожи на шум. Если продолжить, бустинг подгонится и под этот шум: ошибка на обучении, , уже ниже дисперсии шума .
Каждое дерево слабое — одно разбиение, — и функция потерь суммы на обучении падает с каждым шагом; смещение обычно падает вместе с ней, а ошибка на тесте — лишь до тех пор, пока шаги не начинают подгоняться под шум. Это противоположность бэггингу, где деревья сильные, а сумма лишь усредняет их.
Градиентный спуск в пространстве функций#
Почему остатки и что заменяет их для других функций потерь? Функция потерь на обучении
зависит от функции только через её значений . Будем считать эти значения параметрами. Градиентный спуск по ним, как в заметке о градиентном спуске, сдвигает каждое значение против частной производной :
Для квадратичной функции потерь антиградиент — ровно остаток: подгонка остатков и есть градиентный спуск. Но этот шаг определён только в обучающих точках, а модель должна предсказывать везде. Решение Фридмана — заменить вектор ближайшей функцией из базового класса, подогнав дерево к псевдоостаткам (pseudo-residuals) методом наименьших квадратов (Friedman, 2001, раздел 3, формула 11):
Почему этот шаг снижает функцию потерь? По разложению Тейлора первого порядка добавление меняет функцию потерь на
и это изменение отрицательно и наиболее круто, когда вектор направлен вдоль . Среди функций базового класса подгонка к методом наименьших квадратов ближе всех к параллельности с ним — по словам Фридмана, это член класса, «сильнее всего коррелированный с ». Дерево выбирает только направление; насколько далеко идти — отдельная одномерная задача. Для деревьев она решается в каждом листе отдельно, поскольку листья не пересекаются:
и модель делает сжатый шаг . Это TreeBoost Фридмана, алгоритм 10.3 у Hastie, Tibshirani and Friedman (2009). Структура дерева выбирается по квадратичной ошибке на псевдоостатках, какой бы ни была функция потерь, а сама функция потерь входит дважды: в псевдоостатки и в значения в листьях.
Функции потерь#
Смена функции потерь меняет псевдоостатки и значения в листьях, и больше ничего. Лучшее константное предсказание при каждой функции потерь — сводная характеристика условного распределения из заметки об условном математическом ожидании, а — эта характеристика по всем значениям целевой переменной.
| Функция потерь | Псевдоостаток | Значение в листе | Предсказывает |
|---|---|---|---|
| квадратичная | среднее остатков | условное среднее | |
| абсолютная | медиана остатков | условную медиану | |
| Хьюбера (Huber) | остаток, обрезанный на уровне | оценка положения Хьюбера по остаткам | робастное среднее |
| пинбол-функция (pinball) уровня | или | -квантиль остатков | условный -квантиль |
| логистическая, , | шаг Ньютона | логарифм шансов | |
| пуассоновская, | логарифм среднего числа событий |
Для логистической функции потерь — логарифм шансов, как в логистической регрессии, и , где . Её производные по равны и , поэтому псевдоостаток — разность между меткой и предсказанной вероятностью. У значения в листе нет замкнутой формулы, и его заменяет один шаг Ньютона из , (Friedman, 2001, алгоритм 5, где он записан для и половины логарифма шансов). Каждый псевдоостаток лежит в : сильно ошибочно классифицированная точка тянет с весом не больше единицы. Экспоненциальная функция потерь , , даёт AdaBoost (Freund and Schapire, 1997; Friedman, Hastie and Tibshirani, 2000); её псевдоостатки неограниченно растут на ошибочно классифицированных точках, что делает её чувствительной к шуму в метках (Hastie, Tibshirani and Friedman, 2009, раздел 10.6).
Сжатие шага, размер деревьев и подвыборки#
Бустинг быстро снижает функцию потерь на обучении, а вместе с этим подгоняется под шум. Его замедляют три средства.
- Сжатие шага (shrinkage). Шаг обучения масштабирует каждое дерево. Меньшему нужно больше деревьев, чтобы достичь той же функции потерь на обучении, и на практике он обычно даёт меньшую ошибку на тесте — это эмпирическая закономерность, а не теорема; рекомендуемая стратегия — малое , не больше , с числом деревьев, выбранным ранней остановкой (Friedman, 2001, раздел 5; Hastie, Tibshirani and Friedman, 2009, раздел 10.12.1). На функции Фридмана в 10 измерениях с 500 обучающими точками и деревьями глубины 3 при лучшая MSE на валидации, , достигается после 8 деревьев, а после 1000 она равна ; при достигается после 189 деревьев, с MSE на тесте .
- Размер деревьев. Дерево с листьями может представить взаимодействия не более чем признаков, и сумма таких деревьев тоже. Пни дают аддитивную модель. Опыт подсказывает (Hastie, Tibshirani and Friedman, 2009, раздел 10.11): у небольших деревьев большое смещение и малый разброс, а это то, что нужно бустингу, — противоположность глубоким деревьям леса.
- Подвыборки (subsampling). Стохастический градиентный бустинг (stochastic gradient boosting) выращивает каждое дерево на случайной доле обучающих точек, выбранной без возвращения, обычно на половине (Friedman, 2002; Hastie, Tibshirani and Friedman, 2009, раздел 10.12.2). Он быстрее и часто точнее: как и в бэггинге, случайность выборок снижает разброс. В примере выше подвыборка половины строк снижает лучшую MSE на валидации с до . XGBoost добавляет подвыборку столбцов, заимствованную у случайного леса (Chen and Guestrin, 2016, раздел 2.3).
Бустинг второго порядка: XGBoost#
Градиентный бустинг подгоняет дерево по квадратичной ошибке на градиенте, и это приближение затем исправляет шаг в листьях. XGBoost (Chen and Guestrin, 2016) с самого начала строит дерево для настоящей функции потерь, используя разложение второго порядка, и добавляет штраф на дерево. Целевая функция на шаге —
с ценой за лист и штрафом с коэффициентом на значения в листьях (формула 2). Разложив функцию потерь до второго порядка по и отбросив константу, получаем
Дерево постоянно в каждом листе, для , поэтому при и целевая функция — сумма независимых парабол, . Каждая минимизируется при
(формулы 5 и 6). Это значение оценивает структуру дерева, а прирост от разбиения узла на левую часть и правую часть — уменьшение этой оценки (формула 7):
Разбиение стоит делать, только если его прирост положителен, поэтому действует как минимальный прирост, а сжимает значения в листьях к нулю, сильнее в листьях с малой кривизной. Два частных случая связывают формулу с тем, что было раньше. Для квадратичной функции потерь и , поэтому — средний остаток листа, сжатый множителем , а при прирост — это уменьшение , половина уменьшения суммы квадратов остатков, критерий дисперсии из заметки о решающих деревьях. Для логистической функции потерь при — ньютоновское значение в листе из таблицы выше.
Разобранный пример с небольшими числами: один лист, логистическая функция потерь, текущий логарифм шансов 0, так что , метки . Градиенты равны , а каждая вторая производная (гессиан) равна , поэтому и . Без штрафа значение в листе равно , а приближение второго порядка к функции потерь уменьшается на ; точная логистическая функция потерь уменьшается на — близко, но не то же самое. При значение сжимается до , а приближение со штрафом, приближение второго порядка плюс , уменьшается на . Отделение двух положительных точек от отрицательной при имеет прирост .
XGBoost, LightGBM и CatBoost#
Три библиотеки разделяют целевую функцию второго порядка и различаются тем, как делают её быстрой и как обращаются с категориями. В таблице перечислено, что вводит каждая статья.
| XGBoost (Chen and Guestrin, 2016) | LightGBM (Ke et al., 2017) | CatBoost (Prokhorenkova et al., 2018) | |
|---|---|---|---|
| Поиск разбиений | точный жадный по отсортированным значениям; приближённый по квантилям-кандидатам из взвешенного квантильного скетча (weighted quantile sketch) с весами (разделы 3.1–3.3) | гистограммы: признаки один раз разбиваются на бины, разбиения только по границам бинов (раздел 2.1) | — |
| Рост дерева | по уровням (depth-wise) в точном алгоритме, как отмечают Ke et al. в своём разделе 5.1 | по листьям (leaf-wise): всегда разбивается лист с наибольшим приростом (best-first, раздел 5.1) | симметричные деревья (oblivious trees): одно разбиение на уровень, общее для всех узлов уровня (раздел 5) |
| Строки | подвыборка строк и столбцов (раздел 2.3) | GOSS: оставить верхнюю долю точек по , выбрать долю остальных и дать им вес (раздел 3) | упорядоченный бустинг (ordered boosting): градиент каждой точки берётся от модели, которая её не видела, против сдвига предсказаний (раздел 4) |
| Признаки | разбиение с учётом разреженности и выученным направлением по умолчанию для пропусков (раздел 3.4) | EFB: объединение взаимоисключающих разреженных признаков в один (раздел 4) | упорядоченные целевые статистики (ordered target statistics) для категорий (раздел 3.2) |
Две из этих идей касаются утечки, и каждая заслуживает отдельного предложения. CatBoost заменяет категорию средним значением целевой переменной обучающих точек с этой категорией, сглаженным априорным значением, , где суммы берутся только по точкам, которые идут раньше в случайной перестановке; если считать статистику по всем точкам, она включала бы само и переносила бы целевую переменную в признак — проблема из заметки о данных. Упорядоченный бустинг применяет тот же принцип к градиентам: остаток обучающей точки, вычисленный моделью, обученной на этой точке, меньше, чем был бы на новой точке, — это сдвиг предсказаний (prediction shift), который авторы называют утечкой целевой переменной в самом бустинге (раздел 4.1). Рост по листьям в LightGBM при том же числе листьев достигает меньшей функции потерь на обучении и именно поэтому требует ограничения на число листьев или глубину, чтобы избежать глубоких переобученных ветвей; симметричные деревья CatBoost — противоположный выбор, сильно регуляризованная и быстрая для вычисления форма.
Ранняя остановка#
Число деревьев — главный параметр регуляризации бустинга: функция потерь на обучении монотонно падает, а на тесте сначала падает, а потом растёт. Ранняя остановка (early stopping) отслеживает функцию потерь на валидационной выборке после каждого дерева и оставляет модель в её минимуме или останавливается, когда функция потерь на валидации не улучшалась заданное число раундов (Hastie, Tibshirani and Friedman, 2009, раздел 10.12, где её сравнивают с ранней остановкой для нейросетей).
Ранняя остановка и шаг обучения
Два шага обучения показывают компромисс из предыдущего раздела на одной картинке: при минимум на валидации наступает рано и высок; при он наступает позже и ниже; обе модели переобучаются, если довести их до конца. На практике валидационную выборку откладывают из обучающих данных, как в заметке о валидации, или выбирают число раундов кросс-валидацией. HistGradientBoostingClassifier из scikit-learn, у которого 20% обучающей выборки о раке груди отложено для валидации и терпение (patience) составляет 20 раундов, останавливается после 73 деревьев и достигает доли правильных ответов (accuracy) на тесте .
Стекинг#
Бустинг и бэггинг комбинируют много моделей одного вида. Стекинг (stacking; Wolpert, 1992; Breiman, 1996) комбинирует несколько моделей разных видов — лес, бустинг, линейную модель, метод ближайших соседей: их предсказания становятся признаками метамодели (meta-model), часто линейной или логистической регрессии, которая выучивает, насколько доверять каждой.
Очевидный способ построить обучающую выборку метамодели — предсказания базовых моделей на их собственных обучающих данных — неверен. Модель, запомнившая свою обучающую выборку, идеально предсказывает обучающие значения целевой переменной, и метамодель учится полностью ей доверять. Это утечка целевой переменной в чистейшем виде, как описано в заметке о данных. Исправление — предсказания вне фолда (out-of-fold predictions): разбить обучающую выборку на фолдов и предсказывать каждый фолд копиями базовых моделей, обученными на остальных . Тогда метапризнак каждой точки получен от моделей, которые её не видели, — так же, как во время теста. Метамодель обучается на предсказаниях вне фолда, а базовые модели для предсказания переобучаются на всех данных.
На функции Фридмана с 500 обучающими точками и тремя базовыми моделями — 1 ближайший сосед, гребневая регрессия и случайный лес — разница разительна. Неотрицательная линейная метамодель, обученная на предсказаниях на обучающей выборке, даёт трём моделям веса : всё на 1-NN, который точно воспроизводит свои обучающие значения целевой переменной, и её MSE на тесте равна MSE 1-NN, . При обучении на предсказаниях вне фолда по 5 фолдам веса равны , а MSE на тесте — , ниже, чем у лучшей отдельной модели, леса с . Ограничение весов неотрицательными значениями — распространённая защита от неустойчивых комбинаций коррелированных предсказаний (Hastie, Tibshirani and Friedman, 2009, раздел 8.8).
Блендинг (blending) — вариант с отложенной выборкой: базовые модели обучаются на одной части данных, а метамодель — на их предсказаниях для второй, отложенной части. Он проще и ничего не допускает к утечке, но метамодель видит меньше точек, а базовые модели обучаются на меньшем объёме данных. Для упорядоченных во времени данных и фолды, и отложенная часть должны учитывать время — по тем же причинам, что и валидация.
Что изменилось#
| Бэггинг и случайный лес | Градиентный бустинг | |
|---|---|---|
| Деревья | глубокие, выращиваются независимо | небольшие, выращиваются последовательно |
| Каждое дерево подгоняется под | бутстрэп-выборку значений целевой переменной | антиградиент функции потерь в текущей модели |
| Снижает | разброс | смещение (разброс контролируется , , подвыборками) |
| Функция потерь | квадратичная ошибка или Джини внутри деревьев | любая дифференцируемая функция потерь |
| Больше деревьев | никогда не вредит | в итоге переобучение: ранняя остановка |
| Настройка | небольшая | шаг обучения, число деревьев, глубина, штрафы |
Ограничения#
- Последовательность. Деревья нельзя выращивать параллельно на разных шагах, только внутри шага; обучение медленнее, чем у леса того же размера.
- Настройка важна. Шаг обучения, число деревьев, размер деревьев, подвыборки и штрафы взаимодействуют, и значения по умолчанию редко оптимальны.
- Переобучается, если работает слишком долго, в отличие от леса; нужна валидационная выборка или кросс-валидация.
- Чувствителен к шуму в метках с функциями потерь, градиенты которых неограниченно растут, такими как экспоненциальная.
- Признаки должны существовать. Деревья разбивают по заданным признакам по одному. На сырых пикселях, отсчётах звука или идентификаторах токенов отдельный признак обычно несёт мало информации, а полезная структура — край на изображении или словосочетание — живёт в сочетаниях, которые разбиения вдоль осей находят лишь медленно. Деревья на сырых входах всё же могут быть разумной базовой моделью, но на таких данных обычно лучше работают обученные представления.
Что нужно запомнить#
- Бустинг добавляет небольшие деревья по одному, каждое подгоняется под текущие ошибки; для квадратичной функции потерь ошибки — остатки.
- В общем случае каждое дерево подгоняется методом наименьших квадратов под антиградиент в обучающих точках, а затем каждый лист делает собственный оптимальный (или ньютоновский) шаг: градиентный спуск в пространстве функций.
- Логистическая функция потерь: псевдоостаток , ньютоновское значение в листе .
- Сжатие шага с ранней остановкой, деревья с 4–8 листьями, подвыборка строк около половины.
- XGBoost: целевая функция второго порядка со штрафами ; ; прирост разбиения .
- LightGBM: гистограммы, рост по листьям, GOSS, EFB. CatBoost: симметричные деревья, упорядоченные целевые статистики, упорядоченный бустинг.
- Стекинг обучает метамодель на предсказаниях вне фолда; предсказания на обучающей выборке переносят утечку целевой переменной и поощряют запоминание.
Код#
Лист и прирост второго порядка, подгонка остатков вручную, шаги обучения и подвыборки с кривыми на валидации, встроенная ранняя остановка и стекинг на предсказаниях на обучающей выборке против предсказаний вне фолда:
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingRegressor, HistGradientBoostingClassifier, RandomForestRegressor
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.model_selection import cross_val_predict, train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
# один лист, логистическая функция потерь, текущий логарифм шансов 0 (p = 0.5), метки 1, 1, 0: градиенты p - y, гессианы p(1 - p)
y = np.array([1, 1, 0]); p = 0.5
g, h = p - y, p * (1 - p) * np.ones(3)
for lam in (0, 1):
print(lam, round(-g.sum() / (h.sum() + lam), 3), round(0.5 * g.sum() ** 2 / (h.sum() + lam), 3))
# 0 0.667 0.167 | 1 0.286 0.071 (значение в листе, уменьшение приближения второго порядка со штрафом)
# прирост от отделения двух положительных точек от отрицательной (lambda = 1, gamma = 0)
score = lambda G, H, lam=1: G ** 2 / (H + lam)
print(round(0.5 * (score(g[:2].sum(), h[:2].sum()) + score(g[2:].sum(), h[2:].sum()) - score(g.sum(), h.sum())), 3)) # 0.362
# квадратичная функция потерь: бустинг пней по остаткам вручную для четырёх точек, шаг обучения 0.5
x = np.array([[1.0], [2.0], [3.0], [4.0]]); t = np.array([1.0, 3.0, 4.0, 8.0])
F = np.full(4, t.mean())
print(0, round(float(((t - F) ** 2).mean()), 3)) # 0 6.5
for m in range(3):
stump = DecisionTreeRegressor(max_depth=1).fit(x, t - F)
F += 0.5 * stump.predict(x)
print(m + 1, F.round(3), round(float(((t - F) ** 2).mean()), 3))
# 1 [3.333 3.333 3.333 6.] 2.5 | 2 [2.167 3.722 3.722 6.389] 1.139 | 3 [1.694 3.25 4.194 6.861] 0.47
# функция Фридмана: ошибка на валидации по итерациям для шагов обучения 1 и 0.1, деревья глубины 3
rng = np.random.default_rng(0)
f = lambda X: 10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - 0.5) ** 2 + 10 * X[:, 3] + 5 * X[:, 4]
X = rng.random((1500, 10)); yv = f(X) + rng.normal(size=1500)
Xtr, Xva, Xte = X[:500], X[500:1000], X[1000:]
ytr, yva, yte = yv[:500], yv[500:1000], yv[1000:]
for lr in (1.0, 0.1):
gb = GradientBoostingRegressor(learning_rate=lr, n_estimators=1000, max_depth=3, random_state=0).fit(Xtr, ytr)
va = [((yva - p) ** 2).mean() for p in gb.staged_predict(Xva)]
best = int(np.argmin(va))
te = ((yte - list(gb.staged_predict(Xte))[best]) ** 2).mean()
print(lr, best + 1, round(va[best], 2), round(va[-1], 2), round(te, 2))
# 1.0 8 5.72 6.75 5.7 | 0.1 189 2.71 2.74 2.66 (лучший раунд, лучшая и итоговая MSE на валидации, MSE на тесте в лучшем раунде)
# подвыборка половины строк для каждого дерева (стохастический градиентный бустинг)
gb = GradientBoostingRegressor(learning_rate=0.1, n_estimators=1000, max_depth=3, subsample=0.5, random_state=0).fit(Xtr, ytr)
va = [((yva - p) ** 2).mean() for p in gb.staged_predict(Xva)]
print('subsample', int(np.argmin(va)) + 1, round(min(va), 2)) # subsample 205 2.38
# встроенная ранняя остановка на валидационной доле, логистическая функция потерь, рак груди
Xb, yb = load_breast_cancer(return_X_y=True)
Xb_tr, Xb_te, yb_tr, yb_te = train_test_split(Xb, yb, test_size=0.3, random_state=0, stratify=yb)
hgb = HistGradientBoostingClassifier(learning_rate=0.1, max_iter=1000, early_stopping=True, validation_fraction=0.2, n_iter_no_change=20, random_state=0).fit(Xb_tr, yb_tr)
print(hgb.n_iter_, round(hgb.score(Xb_te, yb_te), 3)) # 73 0.942
# стекинг: неотрицательная линейная метамодель на предсказаниях на обучающей выборке против предсказаний вне фолда
base = {'1-NN': KNeighborsRegressor(1), 'ridge': Ridge(1.0), 'forest': RandomForestRegressor(200, random_state=0)}
ins = np.column_stack([m.fit(Xtr, ytr).predict(Xtr) for m in base.values()])
oof = np.column_stack([cross_val_predict(m, Xtr, ytr, cv=5) for m in base.values()])
test = np.column_stack([m.fit(Xtr, ytr).predict(Xte) for m in base.values()])
for name, Z in (('in-sample', ins), ('out-of-fold', oof)):
meta = LinearRegression(positive=True).fit(Z, ytr)
print(name, meta.coef_.round(2), round(((yte - meta.predict(test)) ** 2).mean(), 2))
# in-sample [1. 0. 0.] 13.71 | out-of-fold [0.03 0.32 0.76] 4.29
print({k: round(float(((yte - test[:, i]) ** 2).mean()), 2) for i, k in enumerate(base)})
# {'1-NN': 13.71, 'ridge': 6.63, 'forest': 4.76}
Дальше#
Каждая модель этого раздела разбивает по признакам, которые кто-то предоставил: доходу, возрасту, числу вхождений слова. На табличных данных, где каждый столбец что-то означает, этого достаточно, и бустинг над деревьями по-прежнему трудно превзойти; бенчмарк из 45 табличных наборов данных показал, что ансамбли деревьев всё ещё опережают глубокие сети на данных среднего размера, около десяти тысяч строк (Grinsztajn, Oyallon and Varoquaux, 2022). Но пиксель, отсчёт звука или идентификатор токена сами по себе обычно говорят мало, и порог по одному из них редко бывает хорошим вопросом; важен узор из многих таких значений. Для таких входов сами признаки нужно выучивать. Следующий раздел начинается с линейных моделей этого курса, ставит их друг на друга с нелинейностями между ними и обучает всю стопку тем же градиентным спуском, так что ранние слои вычисляют признаки, которые использует последний слой.
Литература#
- J. H. Friedman. Greedy Function Approximation: A Gradient Boosting Machine. Annals of Statistics, 29(5), 2001. Раздел 3 и алгоритм 1 (градиентный бустинг), алгоритм 5 (логистическая функция потерь для двух классов с шагом Ньютона в каждом листе), раздел 5 (сжатие шага).
- J. H. Friedman. Stochastic Gradient Boosting. Computational Statistics & Data Analysis, 38(4), 2002.
- J. Friedman, T. Hastie, R. Tibshirani. Additive logistic regression: a statistical view of boosting. Annals of Statistics, 28(2), 2000.
- Y. Freund, R. E. Schapire. A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting. Journal of Computer and System Sciences, 55(1), 1997.
- T. Chen, C. Guestrin. XGBoost: A Scalable Tree Boosting System. KDD, 2016 (doi:10.1145/2939672.2939785). Формулы 2–7 (регуляризованная целевая функция, веса листьев, оценка структуры, прирост разбиения), раздел 2.3 (сжатие шага и подвыборка столбцов), разделы 3.1–3.4 (поиск разбиений, взвешенный квантильный скетч, разбиения с учётом разреженности).
- G. Ke, Q. Meng, T. Finley, T. Wang, W. Chen, W. Ma, Q. Ye, T.-Y. Liu. LightGBM: A Highly Efficient Gradient Boosting Decision Tree. NeurIPS, 2017. Раздел 2.1 (алгоритм на гистограммах), раздел 3 (GOSS), раздел 4 (EFB), раздел 5.1 (рост по листьям).
- L. Prokhorenkova, G. Gusev, A. Vorobev, A. V. Dorogush, A. Gulin. CatBoost: unbiased boosting with categorical features. NeurIPS, 2018. Раздел 3.2 (целевые статистики), раздел 4 (сдвиг предсказаний и упорядоченный бустинг), раздел 5 (симметричные деревья).
- D. H. Wolpert. Stacked generalization. Neural Networks, 5(2), 1992.
- L. Breiman. Stacked Regressions. Machine Learning, 24(1), 1996.
- T. Hastie, R. Tibshirani, J. Friedman. The Elements of Statistical Learning, 2nd ed. Springer, 2009. Раздел 8.8 (стекинг), разделы 10.6 (функции потерь и робастность), 10.10 (градиентный бустинг, алгоритм 10.3), 10.11 (размер деревьев), 10.12 (сжатие шага, подвыборки, ранняя остановка).
- L. Grinsztajn, E. Oyallon, G. Varoquaux. Why do tree-based models still outperform deep learning on typical tabular data? NeurIPS Datasets and Benchmarks, 2022.
- E. Sokolov et al. Машинное обучение (HSE). Конспект 2021, лекция 10: градиентный бустинг, лекция 11: XGBoost и стекинг; семинар 12: градиентный бустинг, часть 1, часть 2: XGBoost, LightGBM, CatBoost.