Dado que la interfaz de xgboost
in caret
ha cambiado recientemente, aquí hay un script que proporciona un tutorial completamente comentado sobre el uso caret
para ajustar xgboost
hiperparámetros.
Para esto, utilizaré los datos de entrenamiento de la competencia de Kaggle "Give Me Some Credit" .
1. Ajustar un xgboost
modelo
En esta sección, nosotros:
- ajustar un
xgboost
modelo con hiperparámetros arbitrarios
- evaluar la pérdida (AUC-ROC) utilizando validación cruzada (
xgb.cv
)
- trazar la métrica de evaluación de entrenamiento versus evaluación
Aquí hay un código para hacer esto.
library(caret)
library(xgboost)
library(readr)
library(dplyr)
library(tidyr)
# load in the training data
df_train = read_csv("04-GiveMeSomeCredit/Data/cs-training.csv") %>%
na.omit() %>% # listwise deletion
select(-`[EMPTY]`) %>%
mutate(SeriousDlqin2yrs = factor(SeriousDlqin2yrs, # factor variable for classification
labels = c("Failure", "Success")))
# xgboost fitting with arbitrary parameters
xgb_params_1 = list(
objective = "binary:logistic", # binary classification
eta = 0.01, # learning rate
max.depth = 3, # max tree depth
eval_metric = "auc" # evaluation/loss metric
)
# fit the model with the arbitrary parameters specified above
xgb_1 = xgboost(data = as.matrix(df_train %>%
select(-SeriousDlqin2yrs)),
label = df_train$SeriousDlqin2yrs,
params = xgb_params_1,
nrounds = 100, # max number of trees to build
verbose = TRUE,
print.every.n = 1,
early.stop.round = 10 # stop if no improvement within 10 trees
)
# cross-validate xgboost to get the accurate measure of error
xgb_cv_1 = xgb.cv(params = xgb_params_1,
data = as.matrix(df_train %>%
select(-SeriousDlqin2yrs)),
label = df_train$SeriousDlqin2yrs,
nrounds = 100,
nfold = 5, # number of folds in K-fold
prediction = TRUE, # return the prediction using the final model
showsd = TRUE, # standard deviation of loss across folds
stratified = TRUE, # sample is unbalanced; use stratified sampling
verbose = TRUE,
print.every.n = 1,
early.stop.round = 10
)
# plot the AUC for the training and testing samples
xgb_cv_1$dt %>%
select(-contains("std")) %>%
mutate(IterationNum = 1:n()) %>%
gather(TestOrTrain, AUC, -IterationNum) %>%
ggplot(aes(x = IterationNum, y = AUC, group = TestOrTrain, color = TestOrTrain)) +
geom_line() +
theme_bw()
Así es como se ve el AUC de prueba versus entrenamiento:
2. Búsqueda de hiperparámetros usando train
Para la búsqueda de hiperparámetros, realizamos los siguientes pasos:
- crear un
data.frame
con combinaciones únicas de parámetros para los que queremos modelos entrenados.
- Especifique los parámetros de control que se aplican a la capacitación de cada modelo, incluidos los parámetros de validación cruzada, y especifique que se calculen las probabilidades para que se pueda calcular el AUC
- validar y entrenar los modelos para cada combinación de parámetros, guardando el AUC para cada modelo.
Aquí hay un código que muestra cómo hacer esto.
# set up the cross-validated hyper-parameter search
xgb_grid_1 = expand.grid(
nrounds = 1000,
eta = c(0.01, 0.001, 0.0001),
max_depth = c(2, 4, 6, 8, 10),
gamma = 1
)
# pack the training control parameters
xgb_trcontrol_1 = trainControl(
method = "cv",
number = 5,
verboseIter = TRUE,
returnData = FALSE,
returnResamp = "all", # save losses across all models
classProbs = TRUE, # set to TRUE for AUC to be computed
summaryFunction = twoClassSummary,
allowParallel = TRUE
)
# train the model for each parameter combination in the grid,
# using CV to evaluate
xgb_train_1 = train(
x = as.matrix(df_train %>%
select(-SeriousDlqin2yrs)),
y = as.factor(df_train$SeriousDlqin2yrs),
trControl = xgb_trcontrol_1,
tuneGrid = xgb_grid_1,
method = "xgbTree"
)
# scatter plot of the AUC against max_depth and eta
ggplot(xgb_train_1$results, aes(x = as.factor(eta), y = max_depth, size = ROC, color = ROC)) +
geom_point() +
theme_bw() +
scale_size_continuous(guide = "none")
Por último, puede crear un diagrama de burbujas para el AUC sobre las variaciones de eta
y max_depth
: