Parametri XGBoost per l'ipertensione


27

XGBoost ha fatto un ottimo lavoro, quando si tratta di gestire variabili dipendenti sia categoriche che continue. Ma come posso selezionare i parametri ottimizzati per un problema XGBoost?

Ecco come ho applicato i parametri per un recente problema di 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
)

Tutto ciò che faccio per sperimentare è selezionare casualmente (con intuizione) un altro set di parametri per migliorare il risultato.

Esiste un modo per automatizzare la selezione del set di parametri ottimizzato (migliore)?

(Le risposte possono essere in qualsiasi lingua. Sto solo cercando la tecnica)

Risposte:


40

Ogni volta che lavoro con xgboost faccio spesso la mia ricerca di parametri homebrew, ma puoi farlo con il pacchetto caret e KrisP appena menzionato.

  1. segno di omissione

Vedi questa risposta su Convalida incrociata per una spiegazione approfondita su come usare il pacchetto caret per la ricerca dell'iperparametro su xgboost. Come ottimizzare gli iperparametri degli alberi xgboost?

  1. Ricerca griglia personalizzata

Comincio spesso con alcune ipotesi basate sulle diapositive di Owen Zhang sui suggerimenti per la scienza dei dati P. 14

inserisci qui la descrizione dell'immagine

Qui puoi vedere che dovrai principalmente ottimizzare il campionamento delle righe, il campionamento delle colonne e forse la profondità massima dell'albero. Questo è il modo in cui eseguo un campionamento di righe personalizzato e un campionamento di colonne per cercare un problema a cui sto lavorando in questo momento:

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

})

E combinato con un po 'di magia ggplot2 usando i risultati di quella funzione di applicazione è possibile tracciare una rappresentazione grafica della ricerca.La mia ricerca di iperparametri xgboost

In questo grafico i colori più chiari rappresentano un errore inferiore e ogni blocco rappresenta una combinazione unica di campionamento di colonne e campionamento di righe. Quindi, se si desidera eseguire una ricerca aggiuntiva di say eta (o profondità dell'albero), si finirà con uno di questi grafici per ciascun parametro eta testato.

Vedo che hai una diversa metrica di valutazione (RMPSE), basta collegarla nella funzione di convalida incrociata e otterrai il risultato desiderato. Oltre a ciò, non mi preoccuperei troppo di mettere a punto gli altri parametri, perché così facendo non migliorerai troppo le prestazioni, almeno non tanto rispetto a dedicare più tempo a progettare funzionalità o pulire i dati.

  1. Altri

Sono anche possibili la ricerca casuale e la selezione dei parametri bayesiani, ma non ho ancora effettuato / trovato una loro implementazione.

Ecco un buon primer sull'ottimizzazione bayesiana degli iperparametri di Max Kuhn, creatore di caret.

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


Ho una domanda relativa al parametro min_child_weight. dice 3 / (% di eventi rari) Supponiamo che io abbia 3 classi 0 (3,4%), 1 (96,4%) e 2 (0,2%). quindi dovrebbe essere 3 / 3.6 o 3 / 0.2? Sto indovinando il primo

Nella maggior parte dei casi, xgboost tratta qualsiasi cosa al di sotto del 5% come eventi rari nella maggior parte dei problemi, immagino sia una delle stranezze dell'algoritmo. Mi piace pensarlo come qualsiasi cosa sotto un clic in un problema CTR sia un "evento raro". Quindi in questo caso sarebbe 3 / 3.6. A volte sono più basso ma non così spesso.
Wacax,

1
rBayesianOptimizationil pacchetto rende l'implementazione di BO abbastanza semplice
MichaelChirico il


0

Grid, Random, Bayesian e PSO ... ecc.

Quando lavori con XGB Quasi tutto quanto sopra non importa, perché XGB è molto veloce, quindi puoi usare Grid con molti hyperparametrs fino a trovare la soluzione.

Una cosa che può esserti utile: usa il metodo approx, mi dà sempre l'errore mse più basso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.