XGBoost — один из наиболее часто используемых алгоритмов машинного обучения в настоящее время. Это эволюция Gradient Boost Machines, и она более устойчива к чрезмерной подгонке. Он широко использовался в соревнованиях Kaggle для структурированных и табличных данных.

У нас есть реализация этого алгоритма в R. Давайте посмотрим, как он работает для классификации. В первую очередь нам надо загрузить набор данных и библиотеки. Давайте воспользуемся хорошо известным набором данных Iris:

library("xgboost")
library(data.table)
library("caret")
library("ROSE")
data = iris

После этого нам нужно разделить данные в обучении и тестировании. Первый параметр функции выборки — это количество «n» элементов для рандомизации. Второй параметр — это доля «n», которая будет возвращена, а replace = false означает, что он не будет возвращать повторяющиеся значения.

set.seed(45678)
rowsTrain <- sample(nrow(data), round(nrow(data) * 0.7), replace = FALSE)
training =  data[rowsTrain,];
test = data[-rowsTrain,];

Теперь мы должны создать матрицу модели. Этот процесс преобразует данные для отправки в алгоритм XGBoost, а также выполняет другие задачи, такие как бинаризация функций. Мы должны удалить зависимую переменную (т. е. «Виды») из матрицы модели и преобразовать в числовые данные:

#encoding 
labels <- training[["Species"]] 
ts_label <- test[["Species"]]
new_tr <- model.matrix(~.+0,data = training[,-length(training)])
new_ts <- model.matrix(~.+0,data = test[,-length(training)])
#converting class to numeric
labels <- as.numeric(labels)-1
ts_label <- as.numeric(ts_label)-1

Наконец, мы настраиваем нашу модель. Посмотри в параметрах. Мы используем GBTree и целевую функцию «multi: softmax», которая подходит для задач с несколькими классами. Для бинарных задач мы должны использовать «binary:logistic». Другие параметры (например, гамма, max_depth) должны быть настроены для оптимизации результатов. Вы должны указать количество классов для многоклассовых задач.

dtrain <- xgb.DMatrix(data = new_tr,label = labels)
dtest <- xgb.DMatrix(data = new_ts,label= ts_label)
params <- list(booster = "gbtree", objective = "multi:softmax", eta=0.1, gamma=0, max_depth=7, min_child_weight=1, subsample=1, colsample_bytree=1)
xgb1 <- xgb.train (params = params, data = dtrain, nrounds = 450, watchlist = list(val=dtest,train=dtrain), print_every_n = 10, maximize = F, num_class = 3)
xgbpred <- predict (xgb1,dtest)
#use this in case of binary:
xgbpred <- ifelse (xgbpred > 0.5,1,0)

Чтобы оценить результаты, мы можем использовать библиотеку каретки для печати матрицы путаницы:

print(confusionMatrix(as.factor(ts_label), mode="prec_recall", as.factor(xgbpred)))

Вы можете получить весь код здесь!