Da sich die Benutzeroberfläche von xgboost
in caret
kürzlich geändert hat, finden Sie hier ein Skript, das eine vollständig kommentierte exemplarische Vorgehensweise caret
zum Einstellen von xgboost
Hyperparametern enthält.
Dazu verwende ich die Trainingsdaten des Kaggle-Wettbewerbs "Give Me Some Credit" .
1. Ein xgboost
Modell montieren
In diesem Abschnitt werden wir:
- Passen Sie ein
xgboost
Modell mit beliebigen Hyperparametern an
- Bewertung des Verlusts (AUC-ROC) mittels Kreuzvalidierung (
xgb.cv
)
- Zeichnen Sie das Training in Abhängigkeit von der Testbewertungsmetrik
Hier ist ein Code, um dies zu tun.
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()
So sieht das Testen im Vergleich zur Trainings-AUC aus:
2. Hyperparametersuche mit train
Für die Hyperparametersuche führen wir folgende Schritte durch:
- Erstellen Sie eine
data.frame
mit einzigartigen Kombinationen von Parametern, für die wir trainierte Modelle benötigen.
- Geben Sie die Steuerparameter an, die für das Training jedes Modells gelten, einschließlich der Kreuzvalidierungsparameter, und geben Sie an, dass die Wahrscheinlichkeiten berechnet werden, damit die AUC berechnet werden kann
- Überprüfen und trainieren Sie die Modelle für jede Parameterkombination und speichern Sie die AUC für jedes Modell.
Hier ist ein Code, der zeigt, wie das geht.
# 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")
Zuletzt können Sie einen Bubbleplot für die AUC über die Variationen von eta
und erstellen max_depth
: