Алгоритм AdaBoost в задачах регрессии

На предыдущем занятии мы с вами увидели, как работает алгоритм AdaBoost (Adaptive Boosting) применительно к задачам бинарной классификации с метками классов . Но остается вопрос, как можно использовать этот подход в задачах регрессии? Как раз об этом сейчас и пойдет речь.

Я напомню, что при бустинге мы обучаем T алгоритмов, а затем, вычисляем взвешенную сумму:

Причем, поиск весов и алгоритмов выполняется по «жадному» принципу: мы фиксируем все ранее найденные элементы:

 и

для нахождения текущих  и .

Так как мы решаем задачу регрессии, критерий качества обычно формируют при использовании квадратичной функции потерь:

То есть, мы проходим по всем объектам обучающей выборки  и вычисляем сумму квадратов ошибок.

Если расписать величину , то получим:

Здесь можно заметить, что, во-первых, в задачах линейной регрессии множители  можно отбросить, т.к. они лишь определяют масштабы выходных ответов алгоритмов. Этот масштаб может формировать и сам алгоритм:

И, во-вторых, при фиксированных предыдущих весах и алгоритмах, мы, фактически, на шаге T минимизируем остаточные значения:

Далее, нам нужно определиться с выбором семейства алгоритмов  задачи регрессии. Частым случаем являются решающие деревья, как и в задачах классификации. Вообще, бустинг над решающими деревьями – это классика – наиболее частый вариант его применения. Хотя, можно брать и любые другие семейства, например, набор линейных алгоритмов или какие-либо еще. Главное, чтобы мы могли относительно быстро (с вычислительной точки зрения) формировать, а затем использовать эти алгоритмы.

Итак, если выбрать решающие деревья, то в задачах регрессии, при квадратичной функции потерь, в листах сохраняются средние значения целевых меток  объектов, которые в них попадают. Это, как раз то, что нам нужно. Если представить, что в некоторую листовую вершину попали M объектов  обучающей выборки, то оптимальное значение для их описания, можно найти из уравнения:

откуда

Обратите внимание, что при другой функции потерь, величина c может вычисляться по другому.

В итоге, псевдокод алгоритма AdaBoost применительно к задачам регрессии, будет иметь вид:

Вход: обучающая выборка  и параметр T (число алгоритмов в композиции)

Выход: набор базовых алгоритмов

1: начальная инициализация остатков:

2: для всех

3:     найти наилучший текущий алгоритм по правилу:

4:     обновить остатки:

Реализация алгоритма AdaBoost для задач регрессии на Python

Как видите, все достаточно просто. Давайте теперь реализуем этот алгоритм на Python. Предположим, что нам нужно аппроксимировать (восстановить) значение функции:

где  - гауссовские СВ с нулевым средним и дисперсией 0,1.

В качестве базовых алгоритмов будут выступать решающие деревья заданной максимальной глубины. Сам алгоритм можно скачать по ссылке:

machine_learning_43_adaboost_regression.py

Получаем следующие результаты восстановления исходного сигнала:

Как видите, с увеличением числа базовых алгоритмов растет точность описания исходных целевых значений . И при восьми решающих деревьях мы почти в точности описали целевые переменные.

Основные рекомендации

Мы с вами рассмотрели классический алгоритм бустинга AdaBoost для задач классификации и регрессии. При этом, в задачах классификации используется экспоненциальная функция потерь:

а в задачах регрессии – квадратичная:

В итоге, эти функции приводят к несколько разным алгоритмам бустинга.

Далее, в бустинге чаще всего используются решающие деревья в качестве базовых алгоритмов, или даже решающие пни, то есть, дерево с одной корневой вершиной и двумя листами:

При этом рекомендуется выбирать семейство простых алгоритмов, не обладающих хорошими обобщающими свойствами. Например, если взять тот же SVM и попробовать над ним реализовать бустинг, то особого эффекта не будет. Алгоритмы, которые сами по себе хорошо решают задачи классификации, регрессии или ранжирования объединять в композицию не имеет смысла. Как показала практика, улучшений особых достичь не получается. А вот деревья при объединении дают новое качество результирующего алгоритма и в ряде случаев обходят тот же SVM, нейронные сети и другие эффективные методы.

Следующий момент, на который следует обратить внимание, - это наличие шумовых выбросов в обучающей выборке. При таких данных классический бустинг начинает работать значительно хуже. Однако, с этим можно бороться, если в алгоритме классификации AdaBoost отсеивать объекты с большими значениями весов. Я напомню, что вес объекта постепенно увеличивается, если он плохо обрабатывается композицией. И, скорее всего, является шумовым. Поэтому, при дальнейшем обучении последующих алгоритмов, такие объекты рекомендуется просто отбрасывать.

Недостатки алгоритма AdaBoost

  • Чрезмерная чувствительность к выбросам.
  • AdaBoost строит «черные ящики» - трудно интерпретируемые алгоритмы, т.к. понять выходное значение композиции, например, деревьев, становится очень сложно.
  • Не удается строить короткие композиции (для малых T) из «сильных» алгоритмов (например, SVM и нейронные сети).
  • Необходима большая обучающая выборка (бэггинг может обходиться более короткими).

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

Видео по теме