Руководство по XGBoost для новичков.  В этой статье будут деревья….  много… |  Джордж Сейф
Все про Блоггинг

Руководство по XGBoost для новичков. В этой статье будут деревья…. много… | Джордж Сейф

В этой статье будут деревья…. много деревьев

Джордж Сейф
Деревья … их много

XGBoost — это библиотека с открытым исходным кодом, обеспечивающая высокопроизводительную реализацию деревьев решений с градиентным усилением. Базовая кодовая база C ++ в сочетании с расположенным сверху интерфейсом Python делает пакет чрезвычайно мощным, но простым в реализации.

Производительность XGBoost — не шутка — она ​​стала популярной библиотекой для победы во многих соревнованиях Kaggle. Его реализация повышения градиента не имеет себе равных, и это еще не все, поскольку библиотека продолжает получать похвалы.

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

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

С другой стороны, повышение требует больше итеративный подход. Технически это все еще техника ансамбля, когда многие модели объединяются вместе, чтобы выполнить последнюю, но требует более умного подхода.

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

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

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

Приступим к использованию этого зверя библиотеки — XGBoost.

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

pip install xgboost

Настройка наших данных с помощью XGBoost

В оставшейся части нашего урока мы будем использовать набор данных цветов ириса. Мы можем использовать Scikit Learn, чтобы загрузить это в Python. В то же время мы также импортируем нашу недавно установленную библиотеку XGBoost.

from sklearn import datasets
import xgboost as xgb

iris = datasets.load_iris()
X = iris.data
y = iris.target

Давайте настроим все наши данные. Мы начнем с создания разделения на поезд и тест, чтобы увидеть, насколько хорошо работает XGBoost. На этот раз мы будем делить 80% -20%.

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2)

Чтобы XGBoost мог использовать наши данные, нам нужно преобразовать их в определенный формат, который может обрабатывать XGBoost. Этот формат называется DMatrix. Преобразовать массив данных в формат DMatrix очень просто:

D_train = xgb.DMatrix(X_train, label=Y_train)
D_test = xgb.DMatrix(X_test, label=Y_test)

Определение модели XGBoost

Теперь, когда все наши данные загружены, мы можем определить параметры нашего ансамбля повышения градиента. Ниже мы установили некоторые из самых важных, чтобы начать работу. Для более сложных задач и моделей полный список возможных параметров доступен на официальном сайте XGBoost.

param = {
'eta': 0.3,
'max_depth': 3,
'objective': 'multi:softprob',
'num_class': 3}

steps = 20 # The number of training iterations

Самыми простыми параметрами являются Максимальная глубина (максимальная глубина обучаемых деревьев решений), цель (используемая функция потерь) и num_class (количество классов в наборе данных). В и алгоритм требует особого внимания.

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

Из-за природы ансамбля, то есть наличия нескольких моделей, собранных вместе, чтобы сформировать, по сути, очень большую сложную модель, этот метод склонен к переобучению. В и параметр дает нам шанс предотвратить это переоснащение

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

Обычно используются небольшие значения в диапазоне от 0,1 до 0,3. Меньший вес этих остатков по-прежнему поможет нам обучить мощную модель, но не позволит этой модели уйти в глубокую сложность, где с большей вероятностью произойдет переобучение.

Обучение и тестирование

Наконец-то мы можем обучить нашу модель аналогично тому, как мы это делаем с помощью Scikit Learn:

model = xgb.train(param, D_train, steps)

Теперь давайте проведем оценку. Опять же, процесс очень похож на процесс обучения моделей в Scikit Learn:

import numpy as np
from sklearn.metrics import precision_score, recall_score, accuracy_score

preds = model.predict(D_test)
best_preds = np.asarray([np.argmax(line) for line in preds])

print("Precision = {}".format(precision_score(Y_test, best_preds, average='macro')))
print("Recall = {}".format(recall_score(Y_test, best_preds, average='macro')))
print("Accuracy = {}".format(accuracy_score(Y_test, best_preds)))

Потрясающие!

Если вы выполнили все шаги до этого момента, вы должны получить точность не менее 90%!

Это почти подводит итог основам XGBoost. Но есть еще несколько интересных функций, которые помогут вам максимально использовать возможности ваших моделей.

  • В гамма Параметр также может помочь с контролем переобучения. Он определяет минимальное снижение потерь, необходимое для создания следующего раздела на листовом узле дерева. Т.е. если создание нового узла не снижает убыток на определенную величину, то мы его вообще не будем создавать.
  • В усилитель Параметр позволяет вам установить тип модели, которую вы будете использовать при построении ансамбля. По умолчанию gbtree который строит ансамбль деревьев решений. Если ваши данные не слишком сложные, вы можете использовать более быстрый и простой gblinear вариант, который строит ансамбль линейных моделей.
  • Установка оптимальных гиперпараметров любой модели машинного обучения может быть сложной задачей. Так почему бы не позволить Scikit Learn сделать это за вас? Мы можем довольно легко объединить поиск по сетке Scikit Learn с классификатором XGBoost:
from sklearn.model_selection import GridSearchCV

clf = xgb.XGBClassifier()
parameters = {
"eta" : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] ,
"max_depth" : [ 3, 4, 5, 6, 8, 10, 12, 15],
"min_child_weight" : [ 1, 3, 5, 7 ],
"gamma" : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
"colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ]
}

grid = GridSearchCV(clf,
parameters, n_jobs=4,
scoring="neg_log_loss",
cv=3)

grid.fit(X_train, Y_train)

Делайте это с большим набором данных, только если у вас есть время убить — поиск по сетке, по сути, многократно тренирует ансамбль деревьев решений!

  • После обучения вашей модели XGBoost вы можете выгрузить ее удобочитаемое описание в текстовый файл:
model.dump_model('dump.raw.txt')

Вот и все!

Вам также может понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *