Hypertuning des paramètres XGBoost

27

XGBoost a fait un excellent travail en ce qui concerne les variables dépendantes catégoriques et continues. Mais, comment puis-je sélectionner les paramètres optimisés pour un problème XGBoost?

Voici comment j'ai appliqué les paramètres d'un problème Kaggle récent:

param <- list(  objective           = "reg:linear", 
                booster = "gbtree",
                eta                 = 0.02, # 0.06, #0.01,
                max_depth           = 10, #changed from default of 8
                subsample           = 0.5, # 0.7
                colsample_bytree    = 0.7, # 0.7
                num_parallel_tree   = 5
                # alpha = 0.0001, 
                # lambda = 1
)


clf <- xgb.train(   params              = param, 
                    data                = dtrain, 
                    nrounds             = 3000, #300, #280, #125, #250, # changed from 300
                    verbose             = 0,
                    early.stop.round    = 100,
                    watchlist           = watchlist,
                    maximize            = FALSE,
                    feval=RMPSE
)

Tout ce que je fais pour expérimenter est de sélectionner au hasard (avec intuition) un autre ensemble de paramètres pour améliorer le résultat.

Existe-t-il de toute façon que j'automatise la sélection du (meilleur) ensemble de paramètres optimisé?

(Les réponses peuvent être dans n'importe quelle langue. Je cherche juste la technique)

Dawny33
la source

Réponses:

40

Chaque fois que je travaille avec xgboost, je fais souvent ma propre recherche de paramètres homebrew mais vous pouvez le faire avec le package caret comme KrisP vient d'être mentionné.

  1. Caret

Voir cette réponse sur Cross Validated pour une explication approfondie sur la façon d'utiliser le package caret pour la recherche d'hyperparamètre sur xgboost. Comment régler les hyperparamètres des arbres xgboost?

  1. Recherche de grille personnalisée

Je commence souvent par quelques hypothèses basées sur les diapositives d' Owen Zhang sur les conseils pour la science des données P. 14

entrez la description de l'image ici

Ici, vous pouvez voir que vous devrez principalement régler l'échantillonnage des lignes, l'échantillonnage des colonnes et peut-être la profondeur maximale de l'arbre. Voici comment effectuer un échantillonnage de ligne et une recherche d'échantillonnage de colonne personnalisés pour un problème sur lequel je travaille en ce moment:

searchGridSubCol <- expand.grid(subsample = c(0.5, 0.75, 1), 
                                colsample_bytree = c(0.6, 0.8, 1))
ntrees <- 100

#Build a xgb.DMatrix object
DMMatrixTrain <- xgb.DMatrix(data = yourMatrix, label = yourTarget)

rmseErrorsHyperparameters <- apply(searchGridSubCol, 1, function(parameterList){

    #Extract Parameters to test
    currentSubsampleRate <- parameterList[["subsample"]]
    currentColsampleRate <- parameterList[["colsample_bytree"]]

    xgboostModelCV <- xgb.cv(data =  DMMatrixTrain, nrounds = ntrees, nfold = 5, showsd = TRUE, 
                           metrics = "rmse", verbose = TRUE, "eval_metric" = "rmse",
                           "objective" = "reg:linear", "max.depth" = 15, "eta" = 2/ntrees,                               
                           "subsample" = currentSubsampleRate, "colsample_bytree" = currentColsampleRate)

    xvalidationScores <- as.data.frame(xgboostModelCV)
    #Save rmse of the last iteration
    rmse <- tail(xvalidationScores$test.rmse.mean, 1)

    return(c(rmse, currentSubsampleRate, currentColsampleRate))

})

Et combiné avec de la magie ggplot2 en utilisant les résultats de cette fonction d'application, vous pouvez tracer une représentation graphique de la recherche.Ma recherche d'hyperparamètres xgboost

Dans ce graphique, des couleurs plus claires représentent une erreur plus faible et chaque bloc représente une combinaison unique d'échantillonnage de colonne et d'échantillonnage de ligne. Donc, si vous souhaitez effectuer une recherche supplémentaire de disons eta (ou profondeur d'arbre), vous vous retrouverez avec l'un de ces tracés pour chaque paramètre eta testé.

Je vois que vous avez une métrique d'évaluation différente (RMPSE), branchez-la simplement dans la fonction de validation croisée et vous obtiendrez le résultat souhaité. En plus de cela, je ne m'inquiéterais pas trop du réglage fin des autres paramètres car cela n'améliorera pas trop les performances, du moins pas autant que de passer plus de temps à concevoir des fonctionnalités ou à nettoyer les données.

  1. Autres

La recherche aléatoire et la sélection des paramètres bayésiens sont également possibles mais je n'ai pas encore fait / trouvé une implémentation.

Voici une bonne introduction à l'optimisation bayésienne des hyperparamètres par Max Kuhn créateur de caret.

http://blog.revolutionanalytics.com/2016/06/bayesian-optimization-of-machine-learning-models.html

wacax
la source
J'ai une question concernant le paramètre min_child_weight. il dit 3 / (% d'événements rares) Supposons que j'ai 3 classes 0 (3,4%), 1 (96,4%) et 2 (0,2%). devrait-il donc être de 3 / 3,6 ou 3 / 0,2? Je devine l'ancien
Dans la plupart des cas, xgboost traite tout ce qui est inférieur à 5% comme des événements rares dans la plupart des problèmes, je suppose que c'est l'une des bizarreries de l'algorithme. J'aime à penser que tout ce qui est en dessous d'un clic dans un problème CTR est un "événement rare". Donc, dans ce cas, ce serait 3 / 3,6. Je suis parfois plus bas mais pas si souvent.
wacax
1
rBayesianOptimizationpackage rend la mise en œuvre de BO assez simple
MichaelChirico
0

Grille, aléatoire, bayésien et PSO ... etc.

Lorsque vous travaillez avec XGBoost, tout ce qui précède n'a pas d'importance, car XGB est très rapide, vous pouvez donc utiliser Grid avec de nombreux hyperparamètres jusqu'à ce que vous trouviez la solution.

Une chose qui peut vous aider: utilisez la méthode approx, elle me donne toujours l'erreur mse la plus faible.

MasterOne Piece
la source