2017-06-16 3 views
2

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.

enter image description here

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

Répondre

0

Pour régler vos paramètres, vous pouvez utiliser tuneParams. Voici un exemple

task = makeClassifTask(id = id, data = "your data", target = "the name of the column in your data of the y variable") 

    # Define the search space 
    tuning_options <- makeParamSet(          
    makeNumericParam("eta",    lower = 0.1,   upper = 0.4), 
    makeNumericParam("colsample_bytree", lower = 0.5,   upper = 1), 
    makeNumericParam("subsample",  lower = 0.5,   upper = 1), 
    makeNumericParam("min_child_weight", lower = 3,   upper = 10),  
    makeNumericParam("gamma",   lower = 0,   upper = 10), 
    makeNumericParam("lambda",   lower = 0,   upper = 5), 
    makeNumericParam("alpha",   lower = 0,   upper = 5), 
    makeIntegerParam("max_depth",  lower = 1,   upper = 10), 
    makeIntegerParam("nrounds",   lower = 50,   upper = 300)) 

ctrl = makeTuneControlRandom(maxit = 50L) 
    rdesc = makeResampleDesc("CV", iters = 3L) 
    learner = makeLearner("classif.xgboost", predict.type = "response",par.vals = best_param) 

res = tuneParams(learner = learner,task = task, resampling = rdesc, 
        par.set = tuning_options, control = ctrl,measures = acc) 

Bien sûr, vous pouvez jouer avec les intervalles de vos paramètres. À la fin res contiendra l'ensemble optimal de paramètres pour votre xgboost, puis vous pouvez former votre xgboost en utilisant ces paramètres. Gardez à l'esprit que vous pouvez choisir une autre méthode, sauf en dehors de validation croisée, essayez ?makeResampleDesc

J'espère que cela aide

+0

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. –