Hypertuning von XGBoost-Parametern

27

XGBoost hat hervorragende Arbeit geleistet, wenn es um den Umgang mit kategorialen und kontinuierlichen abhängigen Variablen geht. Aber wie wähle ich die optimierten Parameter für ein XGBoost-Problem aus?

So habe ich die Parameter für ein aktuelles Kaggle-Problem angewendet:

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
)

Alles, was ich zum Experimentieren mache, ist die zufällige Auswahl (mit Intuition) eines anderen Parametersatzes zur Verbesserung des Ergebnisses.

Gibt es eine Möglichkeit, die Auswahl optimierter (bester) Parametersätze zu automatisieren?

(Die Antworten können in jeder Sprache sein. Ich suche nur nach der Technik.)

Dawny33
quelle

Antworten:

40

Wann immer ich mit xgboost arbeite, mache ich oft meine eigene Homebrew-Parametersuche, aber Sie können dies auch mit dem Caret-Paket wie KrisP tun, das gerade erwähnt wurde.

  1. Caret

In dieser Antwort auf Cross Validated finden Sie eine ausführliche Erläuterung zur Verwendung des Caret-Pakets für die Hyperparametersuche in xgboost. Wie werden Hyperparameter von xgboost-Bäumen optimiert?

  1. Benutzerdefinierte Rastersuche

Ich beginne oft mit ein paar Annahmen, die auf den Dias von Owen Zhang über Tipps für die Datenwissenschaft basieren. S. 14

Bildbeschreibung hier eingeben

Hier können Sie sehen, dass Sie hauptsächlich die Zeilen- und Spaltenabtastung und möglicherweise die maximale Baumtiefe optimieren müssen. So führen Sie eine benutzerdefinierte Reihen- und Spaltenabtastung durch, um nach einem Problem zu suchen, an dem ich gerade arbeite:

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))

})

In Kombination mit etwas ggplot2-Magie und den Ergebnissen dieser Apply-Funktion können Sie eine grafische Darstellung der Suche zeichnen.Meine xgboost Hyperparametersuche

In diesem Diagramm repräsentieren hellere Farben einen geringeren Fehler und jeder Block repräsentiert eine eindeutige Kombination aus Spaltenabtastung und Zeilenabtastung. Wenn Sie also eine zusätzliche Suche nach etwa eta (oder der Baumtiefe) durchführen möchten, erhalten Sie für jeden getesteten eta-Parameter einen dieser Plots.

Ich sehe, dass Sie eine andere Bewertungsmetrik (RMPSE) haben, schließen Sie diese einfach an die Kreuzvalidierungsfunktion an und Sie erhalten das gewünschte Ergebnis. Außerdem würde ich mir keine Sorgen um die Feinabstimmung der anderen Parameter machen, da dies die Leistung nicht allzu sehr verbessert, zumindest nicht so sehr im Vergleich dazu, mehr Zeit mit der Entwicklung von Funktionen oder der Bereinigung der Daten zu verbringen.

  1. Andere

Zufallssuche und Bayes'sche Parameterauswahl sind ebenfalls möglich, ich habe jedoch noch keine Implementierung gefunden.

Hier ist eine gute Einführung in die Bayes'sche Optimierung von Hyperparametern von Max Kuhn, dem Schöpfer des Caret.

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

Wacax
quelle
Ich habe eine Frage zum Parameter min_child_weight. es heißt 3 / (% der seltenen Ereignisse) Angenommen, ich habe 3 Klassen 0 (3,4%), 1 (96,4%) und 2 (0,2%). sollte es also 3 / 3.6 oder 3 / 0.2 sein? Ich
In den meisten Fällen betrachtet xgboost alles, was unter 5% liegt, als seltenes Ereignis bei den meisten Problemen. Ich denke, es ist eine der Macken des Algorithmus. Ich denke gerne, dass alles, was unter einem Klick in einem CTR-Problem liegt, ein "seltenes Ereignis" ist. In diesem Fall wäre es also 3 / 3.6. Ich bin manchmal niedriger, aber nicht so oft.
Wacax
1
rBayesianOptimizationPaket macht die Implementierung von BO ziemlich einfach
MichaelChirico
5

Sie können das Caret-Paket verwenden, um eine Hyperparameter-Space-Suche durchzuführen, entweder über eine Rastersuche oder über eine Zufallssuche .

KrisP
quelle
0

Grid, Random, Bayesian und PSO ... etc ..

Wenn Sie mit XGBoost arbeiten, spielt all dies keine Rolle, da XGB sehr schnell ist und Sie Grid mit vielen Hyperparametern verwenden können, bis Sie Ihre Lösung gefunden haben.

Eine Sache, die Ihnen helfen kann: Verwenden Sie die ungefähre Methode, es gibt mir immer den niedrigsten mse-Fehler.

MasterOne Piece
quelle