Вы находитесь на странице: 1из 31

градиентный бустинг

Сергей Николенко

uData School − Киев


19 июня 2018 г.

Random facts:
• 19 июня 240 г. до н.э. Эратосфен Киренский очень точно измерил длину земного
меридиана
• 19 июня 1846 г. в Нью-Джерси прошёл первый в истории бейсбольный матч
• 19 июня 1862 г. рабовладение было запрещено на всей территории США, а 19 июня 1865
г. — и в Техасе
• 19 июня 1917 г. Георг V по случаю Первой мировой войны переименовал правящую в
Великобритании Саксон-Кобург-Готскую династию в Виндзорскую
Деревья принятия решений
Weak learners: decision trees

• А что за weak learners применяются в реальных


приложениях?
• Обычно бустинг применяется, когда есть набор уже
посчитанных фич (посчитанных из каких-то более сложных
моделей), и нужно объединить их в единую модель.
• Часто слабые классификаторы очень, очень простые.
• Пни принятия решений (decision stumps): берём одну
координату и ищем по ней оптимальное разбиение.

3
Weak learners: decision trees

• Пример бустинга на пнях:

• Могут быть чуть посложнее: деревья принятия решений


(decision trees).

3
Weak learners: decision trees

• Дерево принятия решений — это дерево. На нём есть метки:


• в узлах, не являющиеся листьями: атрибуты (фичи), по
которым различаются случаи;
• в листьях: значения целевой функции;
• на рёбрах: значения атрибута, из которого исходит ребро.
• Чтобы классифицировать новый случай, нужно спуститься по
дереву до листа и выдать соответствующее значение.

3
Weak learners: decision trees

• Картинки от Tianqi Chen и Carlos Guestrin, авторов XGBoost:

3
Weak learners: decision trees

• Конечно, перебрать все деревья нельзя, их строят жадно.


1. Выбираем очередной атрибут 𝑄, помещаем его в корень.
2. Выбираем оптимальное разбиение по атрибуту. Для всех
интервалов разбиения:
• оставляем из тестовых примеров только те, у которых значение
атрибута 𝑄 попало в этот интервал;
• рекурсивно строим дерево в этом потомке.
• Остались три вопроса:
1. как проводить разбиение?
2. как выбирать новый атрибут?
3. когда останавливаться?

3
Weak learners: decision trees

• Если атрибут бинарный или дискретный с небольшим


числом значений, то просто по значениям.
• Если непрерывный – можно брать среднее арифметическое
(тем самым минимизируя сумму квадратов).
• Выбирают атрибут, оптимизируя целевую функцию. Для
задачи регрессии просто минимизируем
среднеквадратическую ошибку по отношению к текущему
предсказателю
1
𝑦𝜏 = ∑ 𝑡 .
|X𝜏 | x ∈X 𝑛
𝑛 𝜏

3
Weak learners: decision trees

• Как обучить дерево:

3
Weak learners: decision trees

• Предположим, что мы решаем задачу классификации на 𝐾


классов.
• Тогда «сложность» подмножества данных X𝜏 относительно
целевой функции 𝑓(x) ∶ X → {1, … , 𝐾} характеризуется
перекрёстной энтропией:

𝐾
𝑄(X𝜏 ) = ∑ 𝑝𝜏,𝑘 ln 𝑝𝜏,𝑘 .
𝑘=1

• Иногда ещё используют индекс Джини (Gini index):


𝐾
𝐺(X𝜏 ) = ∑𝑘=1 𝑝𝜏,𝑘 (1 − 𝑝𝜏,𝑘 ).

3
Weak learners: decision trees

• Когда останавливаться? Недоучиться плохо и переучиться


плохо.
• Останавливаться, когда ошибка перестанет меняться, тоже
плохо (она может опять начать меняться ниже).
• Поэтому делают так: выращивают большое дерево, чтобы
наверняка, а потом обрезают его (pruning): поддерево 𝜏
схлопывают в корень, а правило предсказания в корне
считают как 𝑦𝜏 = |X1 | ∑x ∈X 𝑡𝑛 .
𝜏 𝑛 𝜏

• Обрезают, оптимизируя функцию ошибки с регуляризатором:


|𝑇 |
∑𝜏=1 𝑄(X𝜏 ) + 𝜆|𝑇 | (для классификаторов здесь можно
использовать долю ошибок классификации).

3
Пример

• Пример на датасете iris.


• Вход:

4
Пример

• Слишком глубокое дерево и его ошибки:

4
Пример

• Обрезанное дерево:

4
Градиентный бустинг
Градиентный бустинг

• Теперь – к градиентному бустингу (xgboost – это как раз


градиентный бустинг).
• Предположим, что мы хотим обучить ансамбль из 𝐾
деревьев:
𝐾
𝑦𝑖̂ = ∑ 𝑓𝑘 (𝑥𝑖 ), где 𝑓𝑘 ∈ ℱ.
𝑘=1

• Целевая функция – это потери + регуляризаторы:

𝑁 𝐾
Obj = ∑ 𝑙(𝑦𝑖 , 𝑦𝑖̂ ) + ∑ Ω(𝑓𝑘 ).
𝑖=1 𝑘=1

• Например, для регрессии 𝑙(𝑦𝑖 , 𝑦𝑖̂ ) = (𝑦𝑖 − 𝑦𝑖̂ )2 .


• А для классификации в AdaBoost было

𝑙(𝑦𝑖 , 𝑦𝑖̂ ) = 𝑦𝑖 ln(1 + 𝑒−𝑦𝑖̂ ) + (1 − 𝑦𝑖 ) ln(1 + 𝑒𝑦𝑖̂ ).

6
Градиентный бустинг

• Мы не можем просто взять и минимизировать общую ошибку


– трудно минимизировать по всевозможным деревьям.
• Так что опять продолжаем жадным образом:

(0)
𝑦𝑖̂ = 0,
(1) (0)
𝑦𝑖̂ = 𝑓1 (𝑥𝑖 ) = 𝑦𝑖̂ + 𝑓1 (𝑥𝑖 ),
(2) (1)
𝑦𝑖̂ = 𝑓1 (𝑥𝑖 ) + 𝑓2 (𝑥𝑖 ) = 𝑦𝑖̂ + 𝑓1 (𝑥2 ),
…,

а предыдущие деревья всегда остаются теми же самыми, они


фиксированы.

6
Градиентный бустинг

• Чтобы добавить следующее дерево, нужно оптимизировать

(𝑡) (𝑡−1)
𝑦𝑖̂ = 𝑦𝑖̂ + 𝑓𝑡 (𝑥𝑖 ), так что

𝑁
(𝑡) (𝑡−1)
Obj = ∑ 𝑙 (𝑦𝑖 , 𝑦𝑖̂ + 𝑓𝑡 (𝑥𝑖 )) + Ω(𝑓𝑡 ) + Const.
𝑖=1

• Например, для квадратов отклонений

𝑁
(𝑡) (𝑡−1)
Obj = ∑ (2(𝑦𝑖̂ − 𝑦𝑖 )𝑓𝑡 (𝑥𝑖 ) + 𝑓𝑡 (𝑥𝑖 )2 ) + Ω(𝑓𝑡 ) + Const.
𝑖=1

6
Градиентный бустинг

• Чтобы оптимизировать

𝑁
(𝑡) (𝑡−1)
Obj = ∑ 𝑙(𝑦𝑖 , 𝑦𝑖̂ + 𝑓𝑡 (𝑥𝑖 )) + Ω(𝑓𝑡 ) + Const,
𝑖=1

давайте заменим это на аппроксимацию второго порядка.


• Обозначим

𝜕𝑙(𝑦𝑖 , 𝑦(𝑡−1)
̂ ) 𝜕 2 𝑙(𝑦𝑖 , 𝑦(𝑡−1)
̂ )
𝑔𝑖 = , ℎ𝑖 = 2
,
𝜕 𝑦(𝑡−1)
̂ 𝜕(𝑦(𝑡−1)
̂ )

тогда
𝑁
(𝑡) (𝑡−1) 1
Obj ≈ ∑ (𝑙(𝑦𝑖 , 𝑦𝑖̂ ) + 𝑔𝑖 𝑓𝑡 (𝑥𝑖 ) + ℎ𝑖 𝑓𝑡2 (𝑥𝑖 ))+Ω(𝑓𝑡 )+Const.
𝑖=1
2

• Например, для квадрата отклонения 𝑔𝑖 = 2(𝑦(𝑡−1)


̂ − 𝑦𝑖 ), ℎ𝑖 = 2.
6
Градиентный бустинг

• Итак,
𝑁
(𝑡) (𝑡−1) 1
Obj ≈ ∑ (𝑙(𝑦𝑖 , 𝑦𝑖̂ ) + 𝑔𝑖 𝑓𝑡 (𝑥𝑖 ) + ℎ𝑖 𝑓𝑡2 (𝑥𝑖 ))+Ω(𝑓𝑡 )+Const.
𝑖=1
2

• Уберём константы:

𝑁
(𝑡) 1
Obj ≈ ∑ (𝑔𝑖 𝑓𝑡 (𝑥𝑖 ) + ℎ𝑖 𝑓𝑡2 (𝑥𝑖 )) + Ω(𝑓𝑡 ).
𝑖=1
2

• И это и есть основная идея градиентного бустинга.


• Теперь давайте вернёмся к обучению деревьев и сложим всё
воедино.

6
Градиентный бустинг

• Дерево – это вектор оценок в листьях и функция, которая


вход отображает в лист:

𝑓𝑡 (𝑥) = 𝑤𝑞(𝑥) , где 𝑤 ∈ ℝ𝑇 , 𝑞 ∶ ℝ𝑑 → {1, … , 𝑇 }.

• Сложность дерева можно определить как


𝑇
Ω(𝑓𝑡 ) = 𝛾𝑇 + 12 𝜆 ∑𝑗=1 𝑤𝑗2 .
6
Градиентный бустинг

• Теперь перегруппируем слагаемые относительно листьев:


𝑁
(𝑡) 1
Obj ≈ ∑ (𝑔𝑖 𝑓𝑡 (𝑥𝑖 ) + ℎ 𝑓 2 (𝑥 )) + Ω(𝑓𝑡 )
𝑖=1
2 𝑖 𝑡 𝑖
𝑁
1
= ∑ (𝑔𝑖 𝑤𝑞(𝑥𝑖 ) + ℎ 𝑤2 ) + Ω(𝑓𝑡 )
𝑖=1
2 𝑖 𝑞(𝑥𝑖 )
𝑇
1
= ∑⎛ ⎜𝑤𝑗 ∑ 𝑔𝑖 + 𝑤2𝑗 ⎛
⎜ ∑ ℎ𝑖 + 𝜆⎞
⎟⎞⎟ + 𝛾𝑇
𝑗=1 ⎝
2
𝑖∈𝐼𝑗 ⎝ 𝑗
𝑖∈𝐼 ⎠⎠
𝑇
1 2
= ∑ (𝐺𝑗 𝑤𝑗 + 𝑤 (𝐻𝑗 + 𝜆)) + 𝛾𝑇 ,
𝑗=1
2 𝑗

где 𝐼𝑗 = {𝑖 ∣ 𝑞(𝑥𝑗 ) = 𝑖}, 𝐺𝑖 = ∑𝑖∈𝐼 𝑔𝑖 , 𝐻𝑖 = ∑𝑖∈𝐼 ℎ𝑖 .


𝑗 𝑗
• Это сумма 𝑇 независимых квадратичных функций, так что

𝐺𝑗 (𝑡) 1 𝑇 𝐺2𝑗
𝑤𝑗∗ = − , Obj ≈− ∑ + 𝛾𝑇 .
𝐻𝑗 + 𝜆 2 𝑗=1 𝐻𝑗 + 𝜆
6
Градиентный бустинг

• Пример из (Chen, Guestrin):

6
Градиентный бустинг

• Так что мы находим наилучшую структуру дерева


𝑇 𝐺2𝑗
относительно − 12 ∑𝑗=1 𝐻 +𝜆 + 𝛾𝑇 и используем оптимальные
𝑗
𝐺𝑗
веса листьев 𝑤𝑗∗ = − 𝐻 .
𝑗 +𝜆

• Как найти структуру? Жадно: для каждого листа попробуем


добавить разбиение, и целевая функция меняется на

1 𝐺2𝐿 𝐺2𝑅 (𝐺𝐿 + 𝐺𝑅 )2


Gain = ( + − ) − 𝛾.
2 𝐻𝐿 + 𝜆 𝐻𝑅 + 𝜆 𝐻𝐿 + 𝐻 𝑅 + 𝜆

6
Градиентный бустинг

• Самое лучшее разбиение – то, которое максимизирует gain:

• Обрезание: сначала вырастим дерево до максимальной


глубины, потом рекурсивно обрежем листья с
отрицательным gain.

6
MatrixNet

• В методы градиентного бустинга большой вклад внесли


российские учёные.
• Точнее, «Яндекс».
• MatrixNet – статью так и не написали, но основные
особенности известны:
• oblivious decision trees – все узлы одного уровня обязательно
используют один и тот же атрибут; это дополнительная
регуляризация, помогающая выделять меньше и более
полезных признаков;
• вместо ограничений на число сэмплов в листе –
регуляризация самих значений в листьях;
• сложность модели в бустинге зависит от итерации (сначала
простые, потом более сложные).

7
CatBoost

• CatBoost – продолжение MatrixNet, использующее другое


кодирование категориальных признаков.
• Как кодировать дискретные значения? Мы пока только
one-hot знаем.
• Но можно делать target-based statistics (TBS): заменять
признаки на некие усреднённые значения целевых
переменных.
• Например, жадно (greedy TBS) — усреднить по всему датасету,
заменяя категориальную 𝑥𝑖𝑘 на

𝑁
∑𝑗=1 [𝑥𝑖𝑗 = 𝑥𝑖𝑘 ] ⋅ 𝑦𝑗
𝑥𝑘𝑖̂ = 𝑁
.
∑𝑗=1 [𝑥𝑖𝑗 = 𝑥𝑖𝑘 ]

• В чём тут проблема?

8
CatBoost

• Тут протекают целевые переменные, оверфиттинг может


получиться.
• В терминах распределений получается сдвиг: есть разница
между 𝑝(𝑥𝑖̂ ∣ 𝑦) на тренировочном и тестовом множествах.
Например:
• пусть 𝑝(𝑦 = 1 ∣ 𝑥𝑖 = 𝑎) = 12 для всех 𝑎;
• но при этом все значения 𝑥𝑖 уникальные, т.е. 𝑥̂𝑖𝑘 = 𝑦𝑘 ;
• тогда классификатор будет тривиальный, по 𝑥̂𝑖𝑘 , но он ничего
не будет делать разумного.
• Получается такое требование: хочется, чтобы

𝔼 [𝑥𝑖̂ ∣ 𝑦 = 𝑣] = 𝔼 [𝑥𝑖𝑘̂ ∣ 𝑦𝑘 = 𝑣] .

8
CatBoost

• Классический способ – добавить байесовское сглаживание


𝑁
∑𝑗=1 [𝑥𝑖𝑗 = 𝑥𝑖𝑘 ] ⋅ 𝑦𝑗 + 𝑎𝑃
𝑥𝑖𝑘̂ = 𝑁
,
∑𝑗=1 [𝑥𝑖𝑗 = 𝑥𝑖𝑘 ] + 𝑎

где 𝑎 – коэффициент регуляризации, 𝑃 – некое априорное


значение, например среднее по всему датасету.
• Но это, конечно, не спасает; в том же примере будет такая же
тривиальная идеальная классификация.
• Все реально применяющиеся подходы выглядят так:

∑𝑥 [𝑥𝑖𝑗 = 𝑥𝑖𝑘 ] ⋅ 𝑦𝑗 + 𝑎𝑃
𝑗 ∈𝐷𝑘
𝑥𝑖𝑘̂ = ,
∑𝑥 [𝑥𝑖𝑗 = 𝑥𝑖𝑘 ] + 𝑎
𝑗 ∈𝐷𝑘

т.е. мы берём сумму по некоторому подмножеству 𝐷𝑘 для


фичи 𝑘.
8
CatBoost

• Какие варианты для 𝐷𝑘 :


• holdout TBS: делим случайно 𝐷 = 𝐷0 ∪ 𝐷1 , используем 𝐷0 для
TBS и 𝐷1 для обучения потом; но жалко данных;
• leave-one-out TBS: 𝐷𝑘 = 𝐷 {𝑥𝑘 } для тренировочных примеров
и 𝐷𝑘 = 𝐷 для тестовых; это лучше, но не спасает полностью от
той же проблемы;
• ordered TBS (CatBoost): примеры идут потоком, и мы считаем 𝑥̂𝑖𝑘
на основе предыдущих примеров:
• можно 𝐾 последних, sliding window;
• а в CatBoost делают случайную перестановку данных и берут
𝐷𝑘 = {𝑥𝑗 ∣ 𝜎(𝑗) < 𝜎(𝑘)}.

• Ту же идею CatBoost применяет к самому обучению – ordered


boosting.

8
Спасибо!

Спасибо за внимание!

Оценить