Вы подписаны на Машинное обучение доступно
Отлично! завершите оплату для полного доступа к Машинное обучение доступно
Снова приветствуем Вас! Вы успешно авторизовались
Успех! Аккаунт активирован, и Вы имеете полный доступ к контенту.
Градиентный бустинг (Gradient Boosting)

Градиентный бустинг (Gradient Boosting)

in

Градиентный бустинг – эффективный алгоритм преобразования относительно плохих гипотез Моделей (Model) в очень хорошие.

Происхождение

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

Идея усиления заключалась в том, чтобы фильтровать Наблюдения (Observation), оставляя те из них, с которыми может справиться слабый алгоритм, и сосредотачиваясь на развитии новых способностей, чтобы справиться с оставшимися трудными наблюдениями.

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

AdaBoost – первый бустинг-алгоритм

Первой реализацией бустинга, имевшей большой успех, была AdaBoost (Adaptive Boosting).

Слабые алгоритмы в AdaBoost – это Деревья решений (Decision Tree) с одним ответвлением, которые из-за краткости называются пнями решений. Адаптивное усиление работает путем взвешивания наблюдений, придавая больший вес трудно классифицируемым экземплярам и меньший – тем, которые уже хорошо обработаны. Последовательно добавляются новые слабые алгоритмы, которые сосредотачивают свое обучение на более сложных шаблонах.

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

Прогнозы делаются большинством голосов прогнозов слабых алгоритмов, взвешенных с учетом их индивидуальной точности. Самая успешная форма алгоритма – AdaBoost.M1 для задач Бинарной классификации (Binary Classification):

Обобщение AdaBoost как Градиентный бустинг

AdaBoost и связанные с ним алгоритмы были преобразованы в статистическую структуру сначала Брейманом, который назвал их алгоритмами ARCing (Adaptive Reweighting and Combining).

Эта структура была далее развита Фридманом и получила название "Машины градиентного бустинга" (или просто Gradient Boosting).

Статистическая структура рассматривает повышение как задачу численной оптимизации, цель которой состоит в том, чтобы минимизировать потери модели путем добавления слабых алгоритмов с использованием процедуры, подобной Градиентному спуску (Gradient Descent).

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

Обобщение позволило использовать произвольные дифференцируемые Функции потерь (Loss Function), расширив методику за пределы задач двоичной классификации для поддержки Регрессии (Regression), Мультиклассовой классификации (Multi-Class Classification) и многого другого.

Градиентный бустинг и Scikit-learn

Давайте посмотрим, как работает адаптивный бустинг на примере SkLearn. Для начала импортируем необходимые библиотеки:

import sklearn as sk
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification

Сгенерируем игрушечный датасет на 1000 наблюдений с 4 признаками и сразу же запустим классификатор AdaBoost:

X, y = make_classification(n_samples = 1000, n_features = 4,
                           n_informative = 2, n_redundant = 0,
                           random_state = 0, shuffle = False)
                           
# n_estimators – максимальное количество итераций, при котором бустинг прекращается. В случае идеальной подгонки процедура обучения прекращается досрочно.
clf = AdaBoostClassifier(n_estimators = 100, random_state = 0)
clf.fit(X, y) # загрузим обучающие данные

Настройки бустинга по умолчанию выглядят следующим образом:

AdaBoostClassifier(algorithm = 'SAMME.R', base_estimator = None, learning_rate = 1.0, n_estimators = 100, random_state = 0)

Загрузим новое неизвестное наблюдение, состоящее из нулей, в модель и попросим ее классифицировать наблюдение:

clf.predict([[0, 0, 0, 0]])

AdaBoost считает, что запись относится к классу 1:

array([1])

Узнаем, какого Скора (Score) добился наш бустинг:

clf.score(X, y)

98% – это прекрасный результат:

0.983

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Фото: @mitchkmetz

Автор оригинальной статьи: Jason Brownlee