Техники повышения

Под капотом Gradient Boosting и его реализации на Python

Повышение эффективности алгоритмов машинного обучения - Часть 3

До сих пор мы обсуждали общее значение повышения и некоторые важные технические термины в Части 1. Мы также обсудили Python-реализацию AdaBoost (Adaptive Boosting) в Части 2.

Сегодня мы обсудим еще один важный алгоритм повышения: Повышение градиента. Это отличная альтернатива AdaBoost, и иногда она может превзойти AdaBoost.

Повышение градиента использует алгоритм градиентного спуска и пытается минимизировать ошибки (остатки) с помощью градиентного спуска.

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

В отличие от AdaBoost, каждое новое дерево в усилении градиента учитывает остатки, сделанные на основе прогнозов предыдущего дерева.

Существует расширенная версия повышения градиента под названием XGBoost (Экстремальное усиление градиента), которая будет обсуждаться в Части 4.

Остатки

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

Математически остаток в модели можно определить как разницу между фактическим значением и прогнозируемым значением.

Residual = Actual value — Predicted value

Остаток может быть положительным или отрицательным.

Ручная реализация повышения градиента

Чтобы понять, как работает повышение градиента, нам нужно вручную реализовать алгоритм. Для этого мы выполняем задачу регрессии, используя Набор данных о ценах на недвижимость в Калифорнии. Обратите внимание, что повышение градиента также работает с задачами классификации.

Первые несколько строк набора данных выглядят так:

import pandas as pd
df = pd.read_csv('cali_housing.csv')
df.head()

Целевой столбец - это последний столбец (MedHouseVal). Итак, мы определяем X (матрицу признаков) и y (целевой столбец) следующим образом:

X = df.drop(columns='MedHouseVal')
y = df['MedHouseVal']

Затем мы создаем обучающие и тестовые наборы как для X, так и для y.

Теперь мы готовы к ручной реализации повышения градиента.

Шаг 1. Обучите исходное дерево решений в ансамбле. Это дерево называется базовым учеником. Регулируется с помощью max_depth = 1. Итак, дерево специально называют пнем решения.

Шаг 2. Сделайте прогнозы для первого дерева.

tree_1_pred = tree_1.predict(X_train)

Шаг 3. Вычислите остатки прогнозов первого дерева.

tree_1_residuals = y_train - tree_1_pred

Шаг 4. Обучите второе дерево на остатках первого дерева, сделайте прогнозы и вычислите остатки.

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

Это конец 3-й итерации. Мы продолжаем строить новые деревья, пока остатки не приблизятся к нулю. Весь процесс может содержать сотни или тысячи итераций, определенных n_estimators (которые будут обсуждаться позже).

После третьей итерации мы можем вычислить значение RMSE.

Приблизительное значение составляет 0,86 в единицах y. Мы можем минимизировать это значение, увеличив количество итераций. Но мы не можем сделать это вручную. Scikit-learn предоставляет следующие специальные классы для простой реализации повышения градиента.

Scikit-learn реализация повышения градиента

Теперь мы используем класс GradientBoostingRegressor () в Scikit-learn для обучения модели повышения градиента на том же наборе данных.

Значение RMSE было значительно уменьшено после использования 100 итераций! Однако это также зависит от max_depth и learning_rate. Давайте измерим эффект каждого гиперпараметра.

Измерьте эффект n_estimators

В диапазоне от 1 до 500 мы измерим эффект n_estimators и построим тестовые значения RMSE, полученные с помощью модели повышения градиента.

Значение RMSE постепенно уменьшается при увеличении количества оценщиков и остается постоянным после 400 итераций. Лучше выбрать значение от 300 до 500. Если вы выберете еще большее значение, модели потребуется много времени для завершения процесса обучения.

Измерьте эффект max_depth

В диапазоне от 1 до 5 мы измерим эффект max_depth и построим тестовые значения RMSE, полученные с помощью модели повышения градиента.

Лучшее значение для max_depth - 2.

Измерьте эффект learning_rate

В диапазоне от 0,1 до 1,0 мы измерим эффект Learning_rate и построим тестовые значения RMSE, полученные с помощью модели повышения градиента.

Лучшая скорость обучения - 0,4 или 0,7.

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

Здесь мы используем Случайный поиск, чтобы сразу найти оптимальные значения гиперпараметров. Мы также можем использовать поиск по сетке, но для завершения процесса потребуется несколько часов.

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

Резюме

На данный момент мы выполнили 2 алгоритма повышения. При повышении градиента значение RMSE в значительной степени зависит от значений n_estimators, max_depth и learning_rate.

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

Иногда повышение градиента может превзойти AdaBoost. Однако усиление градиента намного лучше, чем случайные леса.

В Части 4 мы обсудим XGBoost (Экстремальное усиление градиента), расширенную версию усиления градиента. Увидимся в следующей истории. Всем удачи!

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



Большое спасибо за вашу постоянную поддержку!

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

Рукшан Прамодитха
2021–10–24