Изменения

Перейти к: навигация, поиск

XGBoost

2765 байт добавлено, 13:59, 28 сентября 2021
Математика за алгоритмом
==История==
XGBoost изначально стартовал как исследовательский проект Тяньцзи Чена (Tianqi Chen) как часть сообщества распределенного глубинного машинного обучения. Первоначально он начинался как терминальное приложение, которое можно было настроить с помощью файла конфигурации libsvm. После победы в Higgs Machine Learning Challenge, он стал хорошо известен в соревновательный кругах по машинному обеспечению. Вскоре после этого были созданы пакеты для Python и R, и теперь у него есть пакеты для многих других языков, таких как Julia, Scala, Java и т. д. Это принесло библиотеке больше разработчиков и сделало ее популярной среди сообщества Kaggle<ref>[https://www.kaggle.com/ Kaggle]</ref>, где она использовалось для большого количества соревнований. Программное обеспечение разработано по методологии SCRUM.
Она вскоре стала использоваться с несколькими другими пакетами, что облегчает ее использование в соответствующих сообществах. Теперь у нее есть интеграция с scikit-learn для пользователей Python, а также с пакетом caret для пользователей R. Она также может быть интегрирована в рамах потока данных, таких как Apache Spark<ref>[https://spark.apache.org/ Apache Spark]</ref>, Apache Hadoop<ref>[https://hadoop.apache.org/ Apache Hadoop]</ref>, и Apache Flink<ref>[https://flink.apache.org/ Apache Flink]</ref> с использованием абстрактных Rabit<ref>[https://github.com/dmlc/rabit Rabit]</ref> и XGBoost4J<ref>[https://xgboost.readthedocs.io/en/latest/jvm/ XGBoost JVM]</ref>. Принцип работы XGBoost также был опубликован Тяньцзи Ченом (Tianqi Chen) и Карлосом Гастрин (Carlos Guestrin).
==Описание алгоритма==
[[File:golf-MSE.png|700px|thumb|[https://explained.ai/gradient-boosting/images/golf-MSE.png Иллюстрация бустинга]]]
В основе '''XGBoost''' лежит алгоритм [[Бустинг, AdaBoost|градиентного бустинга]] [[Дерево решений и случайный лес|деревьев решений]]. Идея алгоритма Градиентный бустинг — это техника машинного обучения для задач классификации и регрессии, которая строит модель предсказания в томформе ансамбля слабых предсказывающих моделей, что каждое следующе дерево предсказывает ошибку обычно деревьев решений.Обучение ансамбля проводится последовательно в отличие, например от [[Виды_ансамблей | бэггинга]]. На каждой итерации вычисляются отклонения предсказаний уже обученного ансамбля на каждом элементе обучающей выборкивыборке. Каждое отдельное дерево обучается одним из стандартных алгоритмов используемых для обучения деревьев решенийСледующая модель, которая будет добавлена в ансамбль будет предсказывать эти отклонения. Таким образом предсказание складывается из предсказаний каждого отдельного , добавив предсказания нового дерева к предсказаниям обученного ансамблямы можем уменьшить среднее отклонение модели, которое является таргетом оптимизационной задачи. Новые деревья добавляются в ансамбль до тех пор,пока ошибка уменьшается, либо пока не выполняется одно из правил "ранней остановки".
Рассмотрим иллюстрацию бустинга. На ней рассматривается поведение модели на одной точке абстрактной задачи линейной регрессии. Предположим, что первая модель ансамбля <tex>F</tex> всегда выдает
выборочное среднее предсказываемой величины <tex>f_0</tex>. Такое предсказание довольно грубое, поэтому среднеквадратичное отклонение на выбранной нами точке будет довольно большим. Мы попробуем это исправить обучив модель
<tex>\Delta_1</tex>, которая будет "корректировать" предсказание предыдущего ансамбля <tex>F_0</tex>. Таким образом мы получим ансамбль <tex>F_1</tex>, предсказание которого будет суммироваться из предсказаний моделей <tex>f_0</tex> и <tex>\Delta_1</tex>. Продолжая такую последовательность мы приходим к ансамблю <tex>F_4</tex> предсказание которого суммируется из предсказаний <tex>f_0</tex>, <tex>\Delta_1</tex>, <tex>\Delta_2</tex>, <tex>\Delta_3</tex>, <tex>\Delta_4</tex> и предсказывает в точности значение заданного таргета.
===Математика за алгоритмом===
<tex>\mathcal{L}^{(t)} = \sum_{i=1}^n l(y_i,\hat{y_i}^{(t-1)}+f_t(x_i))+\Omega(f_t)</tex> {{---}} функция для оптимизации градиентного бустинга, где:
<tex>w</tex> {{---}} значения в листьях, а <tex>\gamma</tex> и <tex>\lambda</tex> {{---}} параметры регуляризации.
Дальше с помощью разложения Тейлора до второго члена можем приблизить это оптимизируемую функцию <tex>\mathcal{L}^{(t)}</tex> следующим выражением:
<tex>\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)</tex>, где
<tex>g_i = \frac {\partial {l(y_i,\hat{y_i}^{t-1})}}{\partial{\hat{y_i}^{t-1}}}</tex>, <tex>h_i = \frac {\partial^2 {l(y_i,\hat{y_i}^{t-1})}}{\partial^2{\hat{y_i}^{t-1}}}</tex>
Поскольку мы хотим минимизировать ошибку модели на обучающей выборкивыборке, нам нужно найти минимум <tex>\mathcal{L}^{(t)}</tex> для каждого ''t''.
Минимум этого выражения относительно <tex>f_t(x_i)</tex> находится в точке <tex>f_t(x_i) = \frac{-g_i}{h_i}</tex>.
==Основные параметры==
* ''n_estimators'' {{---}} число деревьев.
* ''eta'' {{---}} размер шага. Пердотвращает Предотвращает переобучение.
* ''gamma'' {{---}} минимальное изменение значения ''loss'' функции для разделения листа на поддеревья.
* ''max_depth'' {{---}} максимальная глубина дерева.
==Пример использования с помощью библиотеки 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)
Задание параметров модели.
Обучение.
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')
==См. также==
[[Категория: Машинное обучение]]
[[Категория: Ансамбли]]
Анонимный участник

Навигация