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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Идея алгоритма)
(Источники информации)
Строка 74: Строка 74:
 
== Источники информации ==
 
== Источники информации ==
 
* [https://arxiv.org/abs/1603.02754 Tianqi Chen, Carlos Guestrin. XGBoost: A Scalable Tree Boosting System]
 
* [https://arxiv.org/abs/1603.02754 Tianqi Chen, Carlos Guestrin. XGBoost: A Scalable Tree Boosting System]
 +
* [https://towardsdatascience.com/xgboost-mathematics-explained-58262530904a XGBoost Mathematics Explained]
 +
* [https://medium.com/@gabrieltseng/gradient-boosting-and-xgboost-c306c1bcfaf5 Gradient Boosting and XGBoost]
  
 
[[Категория: Машинное обучение]]
 
[[Категория: Машинное обучение]]

Версия 13:34, 16 марта 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).

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

  • Возможность добавлять регуляризацию[на 16.03.19 не создан].
  • Возможность работать с разреженными данными.
  • Возможность распределенного обучения.
  • Эффективная реализация.

Идея алгоритма

[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]\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] обучается стандартным алгоритмом. Для более полного описания см. Дерево решений и случайный лес.

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

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

Более полное описание параметров модели тут[8].

Пример использования с помощью библиотеки 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)
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')

См. также

Примечания

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