Parametry Hypertuning XGBoost

27

XGBoost wykonało świetną robotę, jeśli chodzi o radzenie sobie zarówno z kategorycznymi, jak i ciągłymi zmiennymi zależnymi. Ale jak wybrać zoptymalizowane parametry dla problemu XGBoost?

Oto jak zastosowałem parametry do ostatniego problemu Kaggle:

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
)

Wszystko, co robię, aby eksperymentować, to losowo (intuicyjnie) wybrać inny zestaw parametrów, aby poprawić wynik.

Czy w ogóle automatyzuję wybór zoptymalizowanego (najlepszego) zestawu parametrów?

(Odpowiedzi mogą być w dowolnym języku. Po prostu szukam techniki)

Dawny33
źródło

Odpowiedzi:

40

Ilekroć pracuję z xgboost, często dokonuję własnego wyszukiwania parametrów homebrew, ale możesz to zrobić za pomocą pakietu caret, takiego jak wspomniany wcześniej KrisP.

  1. Wstawka korektorska

Zobacz tę odpowiedź na Cross Validated, aby uzyskać dokładne wyjaśnienie, jak korzystać z pakietu Caret do wyszukiwania hiperparametrów na xgboost. Jak dostroić hiperparametry drzew xgboost?

  1. Niestandardowe wyszukiwanie w siatce

Często zaczynam od kilku założeń opartych na slajdach Owena Zhanga na temat wskazówek dotyczących analizy danych P. 14

wprowadź opis zdjęcia tutaj

Tutaj możesz zobaczyć, że przede wszystkim musisz dostroić próbkowanie wierszy, próbkowanie kolumn i być może maksymalną głębokość drzewa. Oto jak wykonuję niestandardowe próbkowanie wierszy i próbkowanie kolumn w poszukiwaniu problemu, nad którym obecnie pracuję:

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

})

W połączeniu z pewną magią ggplot2, korzystając z wyników tej funkcji zastosuj, możesz wykreślić graficzną reprezentację wyszukiwania.Moje wyszukiwanie hiperparametrów xgboost

Na tym wykresie jaśniejsze kolory oznaczają mniejszy błąd, a każdy blok reprezentuje unikalną kombinację próbkowania kolumn i próbkowania wierszy. Więc jeśli chcesz przeprowadzić dodatkowe wyszukiwanie powiedzmy eta (lub głębokość drzewa), skończysz z jednym z tych wykresów dla każdego testowanego parametru eta.

Widzę, że masz inną metrykę oceny (RMPSE), wystarczy podłączyć ją do funkcji weryfikacji krzyżowej, a uzyskasz pożądany wynik. Poza tym nie martwiłbym się zbytnio o dostrajanie innych parametrów, ponieważ nie poprawi to zbytnio wydajności, a przynajmniej nie tak bardzo w porównaniu do poświęcania więcej czasu na projektowanie funkcji lub czyszczenie danych.

  1. Inne

Możliwe jest również wyszukiwanie losowe i wybór parametrów bayesowskich, ale jeszcze ich nie znalazłem / nie znalazłem.

Oto dobry podkład do bayesowskiej optymalizacji hiperparametrów autorstwa Maxa Kuhna, twórcy Caret.

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

wacax
źródło
Mam pytanie dotyczące parametru min_child_weight. mówi 3 / (% rzadkich zdarzeń) Załóżmy, że mam 3 klasy 0 (3,4%), 1 (96,4%) i 2 (0,2%). więc powinno to być 3 / 3,6 czy 3 / 0,2? Zgaduję, że były
W większości przypadków xgboost traktuje wszystko poniżej 5% jako rzadkie zdarzenia w większości problemów, myślę, że to jedna z dziwactw algorytmu. Lubię myśleć o tym, ponieważ wszystko poniżej kliknięcia w problem CTR jest „rzadkim wydarzeniem”. W tym przypadku byłoby to 3 / 3.6. Czasami jestem niższa, ale nie tak często.
wacax,
1
rBayesianOptimizationpakiet sprawia, że ​​implementacja BO jest bardzo prosta
MichaelChirico
0

Siatka, losowa, bayesowska i PSO ... itd.

Podczas pracy z XGBoost wszystkie powyższe nie mają znaczenia, ponieważ XGB jest naprawdę szybki, więc możesz używać siatki z wieloma hiperparametrami, dopóki nie znajdziesz rozwiązania.

Jedna rzecz, która może ci pomóc: użyj metody ok, zawsze daje mi to najniższy błąd mse.

MasterOne Piece
źródło