XGBoost — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Описание алгоритма)
(Описание алгоритма)
Строка 10: Строка 10:
 
В основе '''XGBoost''' лежит алгоритм [[Бустинг, AdaBoost|градиентного бустинга]] [[Дерево решений и случайный лес|деревьев решений]].
 
В основе '''XGBoost''' лежит алгоритм [[Бустинг, AdaBoost|градиентного бустинга]] [[Дерево решений и случайный лес|деревьев решений]].
 
Градиентный бустинг — это техника машинного обучения для задач классификации и регрессии, которая строит модель предсказания в форме ансамбля слабых предсказывающих моделей, обычно деревьев решений.
 
Градиентный бустинг — это техника машинного обучения для задач классификации и регрессии, которая строит модель предсказания в форме ансамбля слабых предсказывающих моделей, обычно деревьев решений.
Обучение ансамбля проводится последовательно в отличие, например от [[Виды_ансамблей | бэггинга]]. На каждой итерации вычисляются отклонения предсказаний уже обученного ансамбля на обучающей выборке. Следующая модель, которая будет добавлена в ансамбль будет предсказывать эти отклонения. Таким образом, добавив предсказания нового дерева к предсказаниям обученного ансамбля мы можем уменьшить среднее отклонение модели, что является таргетом оптимизационной задачи. Новые деревья добавляются в ансамбль до тех пор,
+
Обучение ансамбля проводится последовательно в отличие, например от [[Виды_ансамблей | бэггинга]]. На каждой итерации вычисляются отклонения предсказаний уже обученного ансамбля на обучающей выборке. Следующая модель, которая будет добавлена в ансамбль будет предсказывать эти отклонения. Таким образом, добавив предсказания нового дерева к предсказаниям обученного ансамбля мы можем уменьшить среднее отклонение модели, котрое является таргетом оптимизационной задачи. Новые деревья добавляются в ансамбль до тех пор,
 
пока ошибка уменьшается, либо пока не выполняется одно из правил "ранней остановки".
 
пока ошибка уменьшается, либо пока не выполняется одно из правил "ранней остановки".
  

Версия 22:23, 5 апреля 2019

XGBoost[1] — одна из самых популярных и эффективных реализаций алгоритма градиентного бустинга на деревьях на 2019-й год.

История

XGBoost изначально стартовал как исследовательский проект Тяньцзи Чена (Tianqi Chen) как часть сообщества распределенного глубинного машинного обучения. Первоначально он начинался как терминальное приложение, которое можно было настроить с помощью файла конфигурации libsvm. После победы в Higgs Machine Learning Challenge, он стал хорошо известен в соревновательный кругах по машинному обеспечению. Вскоре после этого были созданы пакеты для Python и R, и теперь у него есть пакеты для многих других языков, таких как Julia, Scala, Java и т. д. Это принесло библиотеке больше разработчиков и сделало ее популярной среди сообщества Kaggle[2], где она использовалось для большого количества соревнований.

Она вскоре стала использоваться с несколькими другими пакетами, что облегчает ее использование в соответствующих сообществах. Теперь у нее есть интеграция с scikit-learn для пользователей Python, а также с пакетом caret для пользователей R. Она также может быть интегрирована в рамах потока данных, таких как Apache Spark[3], Apache Hadoop[4], и Apache Flink[5] с использованием абстрактных Rabit[6] и XGBoost4J[7]. Принцип работы XGBoost также был опубликован Тяньцзи Ченом (Tianqi Chen) и Карлосом Гастрин (Carlos Guestrin).

Описание алгоритма

В основе XGBoost лежит алгоритм градиентного бустинга деревьев решений. Градиентный бустинг — это техника машинного обучения для задач классификации и регрессии, которая строит модель предсказания в форме ансамбля слабых предсказывающих моделей, обычно деревьев решений. Обучение ансамбля проводится последовательно в отличие, например от бэггинга. На каждой итерации вычисляются отклонения предсказаний уже обученного ансамбля на обучающей выборке. Следующая модель, которая будет добавлена в ансамбль будет предсказывать эти отклонения. Таким образом, добавив предсказания нового дерева к предсказаниям обученного ансамбля мы можем уменьшить среднее отклонение модели, котрое является таргетом оптимизационной задачи. Новые деревья добавляются в ансамбль до тех пор, пока ошибка уменьшается, либо пока не выполняется одно из правил "ранней остановки".

Математика за алгоритмом

[math]\mathcal{L}^{(t)} = \sum_{i=1}^n l(y_i,\hat{y_i}^{(t-1)}+f_t(x_i))+\Omega(f_t)[/math] — функция для оптимизации градиентного бустинга, где:

[math]l[/math] — функция потерь, см. Общие понятия.

[math]y_i, \hat{y_i}^{t}[/math] — значение i-го элемента обучающей выборки и сумма предсказаний первых t деревьев соответственно.

[math]x_i[/math] — набор признаков i-го элемента обучающей выборки.

[math]f_t[/math] — функция (в нашем случае дерево), которую мы хотим обучить на шаге t. [math]f_t(x_i)[/math] — предсказание на i-ом элементе обучающей выборки.

[math]\Omega(f)[/math] — регуляризация функции [math]f[/math]. [math]\Omega(f) = \gamma T + \frac{1}{2} \lambda \lVert w \rVert ^2[/math], где T — количество вершин в дереве, [math]w[/math] — значения в листьях, а [math]\gamma[/math] и [math]\lambda[/math] — параметры регуляризации.

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

[math]\mathcal{L}^{(t)} = \sum_{i=1}^n l(y_i,\hat{y_i}^{(t-1)}) + g_i f_t(x_i) + 0.5 h_i f_t^2(x_i)) + \Omega(f_t)[/math], где

[math]g_i = \frac {\partial {l(y_i,\hat{y_i}^{t-1})}}{\partial{\hat{y_i}^{t-1}}}[/math], [math]h_i = \frac {\partial^2 {l(y_i,\hat{y_i}^{t-1})}}{\partial^2{\hat{y_i}^{t-1}}}[/math]

Поскольку мы хотим минимизировать ошибку модели на обучающей выборки, нам нужно найти минимум [math]\mathcal{L}^{(t)}[/math] для каждого t.

Минимум этого выражения относительно [math]f_t(x_i)[/math] находится в точке [math]f_t(x_i) = \frac{-g_i}{h_i}[/math].

Каждое отдельное дерево ансамбля [math]f_t(x_i)[/math] обучается стандартным алгоритмом. Для более полного описания см. Дерево решений и случайный лес.

Возможности XGBoost

Особенности модели

XGBoost поддерживает все возможности таких библиотек как scikit-learn с возможностью добавлять регуляризацию. Поддержаны три главные формы градиетного бустинга:

  • Стандартный градиентный бустинг с возможностью изменения скорости обучения(learning rate).
  • Стохастический градиентный бустинг[8] с возможностью семплирования по строкам и колонкам датасета.
  • Регуляризованный градиентный бустинг[9] с L1 и L2 регуляризацией.

Системные функции

Библиотека предоставляет систему для использования в различных вычислительных средах:

  • Параллелизация построения дерева с использованием всех ваших ядер процессора во время обучения.
  • Распределенные вычисления для обучения очень крупных моделей с использованием кластера машин.
  • Вычисления для очень больших наборов данных, которые не вписываются в память.
  • Кэш Оптимизация структуры данных и алгоритма для наилучшего использования аппаратного обеспечения.

Особенности алгоритма

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

  • Различные стратегии обработки пропущенных данных.
  • Блочная структура для поддержки распараллеливания обучения деревьев.
  • Продолжение обучения для дообучения на новых данных.

Основные параметры

  • n_estimators — число деревьев.
  • eta — размер шага. Пердотвращает переобучение.
  • gamma — минимальное изменение значения loss функции для разделения листа на поддеревья.
  • max_depth — максимальная глубина дерева.
  • lambda/alphaL2/L1 регуляризация.

Для более полного описания параметров модели см. документацию[10].

Поддерживаемые интерфейсы

  • Интерфейс командной строки (CLI).
  • C++ (язык, на котором написана библиотека).
  • Интерфейс Python, а также модель в Scikit-Learn.
  • R интерфейс, а также модель в пакете карета.
  • Julia.
  • JVM языки, такие как Java, Scala, и платформы, такие как Hadoop.

Пример использования с помощью библиотеки xgboost

Загрузка датасета.

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target

Разделение датасета на обучающую/тестовую выборку.

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Импорт XGBoost и создание необходимых объектов.

import xgboost as xgb
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

Задание параметров модели.

param = {
   'max_depth': 3,
   'eta': 0.3, 
   'silent': 1, 
   'objective': 'multi:softprob',
   'num_class': 3}
num_round = 20

Обучение.

bst = xgb.train(param, dtrain, num_round)
preds = bst.predict(dtest)

Определение качества модели на тестовой выборке.

import numpy as np
from sklearn.metrics import precision_score
best_preds = np.asarray([np.argmax(line) for line in preds])
print precision_score(y_test, best_preds, average='macro')

См. также

Примечания

Источники информации