Je vais commencer par poser ma question en disant que je suis actuellement incapable de partager mes données en raison d'accords de confidentialité extrêmement stricts. J'espère pouvoir obtenir la permission de partager les données en aveugle sous peu.XGBoost (R) Test de CV vs erreur de formation
Je me bats pour obtenir une formation correcte de XGBoost dans R. J'ai suivi le guide here et je suis tellement coincé à l'étape 1, en ajustant le paramètre nrounds. Les résultats que je reçois de ma validation croisée ne font pas ce que je m'attendais à ce qu'ils fassent, ce qui me laisse dans l'incapacité de savoir où aller.
Mes données contiennent 105 observations, une variable de réponse continue (histogramme dans le volet supérieur gauche de l'image dans le lien ci-dessous) et 16095 variables prédictives. Tous les prédicteurs sont sur la même échelle et un histogramme de tous est dans le volet supérieur droit de l'image dans le lien ci-dessous. Les variables prédicteurs sont tout à fait nuls avec 62,82% de toutes les valeurs étant 0.
En tant que jeu séparé de données de test, j'ai 48 autres observations. Les deux ensembles de données ont une gamme très similaire dans leurs variables de réponse.
Jusqu'à présent, j'ai pu adapter un modèle PLS et une forêt au hasard (en utilisant la garde de la bibliothèque R). En appliquant ces deux modèles à mon jeu de données de test, j'ai pu prédire et obtenir un RMSE de 19.133 de PLS et de 15.312 de Ranger. Dans le cas du rôdeur, les ajustements successifs des modèles se révèlent très stables avec 2000 arbres et 760 variables divisées. En retournant à XGBoost, en utilisant le code ci-dessous, j'ai corrigé tous les paramètres excepté nrounds et en utilisant la fonction xgb.cv dans le paquetage xgboost pour calculer les erreurs de formation et de test.
data.train<-read.csv("../Data/Data_Train.csv")
data.test<-read.csv("../Data/Data_Test.csv")
dtrain <- xgb.DMatrix(data = as.matrix(data.train[,-c(1)]),
label=data.train[,1])
# dtest <- xgb.DMatrix(data = as.matrix(data.test[,-c(1)]), label=data.test[,1]) # Not used here
## Step 1 - tune number of trees using CV function
eta = 0.1; gamma = 0; max_depth = 15;
min_child_weight = 1; subsample = 0.8; colsample_bytree = 0.8
nround=2000
cv <- xgb.cv(
params = list(
## General Parameters
booster = "gbtree", # Default
silent = 0, # Default
## Tree Booster Parameters
eta = eta,
gamma = gamma,
max_depth = max_depth,
min_child_weight = min_child_weight,
subsample = subsample,
colsample_bytree = colsample_bytree,
num_parallel_tree = 1, # Default
## Linear Booster Parameters
lambda = 1, # Default
lambda_bias = 0, # Default
alpha = 0, # Default
## Task Parameters
objective = "reg:linear", # Default
base_score = 0.5, # Default
# eval_metric = , # Evaluation metric, set based on objective
nthread = 60
),
data = dtrain,
nround = nround,
nfold = 5,
stratified = TRUE,
prediction = TRUE,
showsd = TRUE,
# early_stopping_rounds = 20,
# maximize = FALSE,
verbose = 1
)
library(ggplot)
plot.df<-data.frame(NRound=as.matrix(cv$evaluation_log)[,1], Train=as.matrix(cv$evaluation_log)[,2], Test=as.matrix(cv$evaluation_log)[,4])
library(reshape2)
plot.df<-melt(plot.df, measure.vars=2:3)
ggplot(data=plot.df, aes(x=NRound, y=value, colour=variable)) + geom_line() + ylab("Mean RMSE")
Si cette fonction fait ce que je crois qu'il est-ce que j'espérais voir l'erreur de formation diminution à un plateau et l'erreur de test pour diminuer ensuite commencer à augmenter à nouveau le modèle overfits. Cependant la sortie que je reçois ressemble au code ci-dessous (et aussi le chiffre inférieur dans le lien ci-dessus).
##### xgb.cv 5-folds
iter train_rmse_mean train_rmse_std test_rmse_mean test_rmse_std
1 94.4494006 1.158343e+00 94.55660 4.811360
2 85.5397674 1.066793e+00 85.87072 4.993996
3 77.6640230 1.123486e+00 78.21395 4.966525
4 70.3846390 1.118935e+00 71.18708 4.759893
5 63.7045868 9.555162e-01 64.75839 4.668103
---
1996 0.0002458 8.158431e-06 18.63128 2.014352
1997 0.0002458 8.158431e-06 18.63128 2.014352
1998 0.0002458 8.158431e-06 18.63128 2.014352
1999 0.0002458 8.158431e-06 18.63128 2.014352
2000 0.0002458 8.158431e-06 18.63128 2.014352
Vu comment ranger les travaux que je suis porté à croire que je fais quelque chose stupide et causer XGBoost à combattre!
Merci
utile, merci. J'avais prévu d'utiliser un processus gaussien (la bibliothèque rBayesianOptimization) pour l'optimisation des paramètres, mais je n'étais pas sûr de continuer. Le fait que mon erreur de test/entraînement ne semble pas montrer le schéma habituel de suralimentation après un certain nombre de tours m'a fait penser que quelque chose de plus sérieux était faux. –