Parámetros de Hypertuning XGBoost

27

XGBoost ha estado haciendo un gran trabajo cuando se trata de lidiar con variables dependientes categóricas y continuas. Pero, ¿cómo selecciono los parámetros optimizados para un problema de XGBoost?

Así es como apliqué los parámetros para un problema reciente de 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
)

Todo lo que hago para experimentar es seleccionar aleatoriamente (con intuición) otro conjunto de parámetros para mejorar el resultado.

¿Hay alguna forma de automatizar la selección del conjunto optimizado (mejor) de parámetros?

(Las respuestas pueden estar en cualquier idioma. Solo estoy buscando la técnica)

Dawny33
fuente

Respuestas:

40

Cada vez que trabajo con xgboost, a menudo hago mi propia búsqueda de parámetros homebrew, pero puedes hacerlo con el paquete caret, como KrisP que acabo de mencionar.

  1. Signo de intercalación

Consulte esta respuesta en Cross Validated para obtener una explicación exhaustiva sobre cómo usar el paquete caret para la búsqueda de hiperparámetros en xgboost. ¿Cómo ajustar los hiperparámetros de los árboles xgboost?

  1. Búsqueda de cuadrícula personalizada

A menudo comienzo con algunas suposiciones basadas en las diapositivas de Owen Zhang sobre consejos para la ciencia de datos P. 14

ingrese la descripción de la imagen aquí

Aquí puede ver que en su mayoría necesitará ajustar el muestreo de filas, el muestreo de columnas y tal vez la profundidad máxima del árbol. Así es como hago una búsqueda personalizada de muestreo de filas y columnas para un problema en el que estoy trabajando en este 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))

})

Y combinado con algo de magia ggplot2 usando los resultados de esa función de aplicación, puede trazar una representación gráfica de la búsqueda.Mi búsqueda de hiperparámetros xgboost

En esta gráfica, los colores más claros representan un error menor y cada bloque representa una combinación única de muestreo de columna y muestreo de fila. Entonces, si desea realizar una búsqueda adicional de say eta (o profundidad de árbol), terminará con una de estas gráficas para cada parámetro eta probado.

Veo que tiene una métrica de evaluación diferente (RMPSE), solo conéctela en la función de validación cruzada y obtendrá el resultado deseado. Además de eso, no me preocuparía demasiado por ajustar los otros parámetros porque hacerlo no mejorará demasiado el rendimiento, al menos no tanto en comparación con pasar más tiempo diseñando características o limpiando los datos.

  1. Otros

La búsqueda aleatoria y la selección de parámetros bayesianos también son posibles, pero aún no he realizado / encontrado una implementación de ellos.

Aquí hay una buena introducción a la optimización bayesiana de hiperparámetros por Max Kuhn, creador de caret.

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

wacax
fuente
Tengo una pregunta sobre el parámetro min_child_weight. dice 3 / (% de eventos raros) Suponga que tengo 3 clases 0 (3.4%), 1 (96.4%) y 2 (0.2%). Entonces, ¿debería ser 3 / 3.6 o 3 / 0.2? Supongo que el anterior
En la mayoría de los casos, xgboost trata cualquier cosa por debajo del 5% como eventos raros en la mayoría de los problemas, supongo que es una de las peculiaridades del algoritmo. Me gusta pensar que cualquier cosa debajo de un clic en un problema de CTR es un "evento raro". Entonces en este caso sería 3 / 3.6. A veces es más bajo, pero no tan a menudo.
wacax
1
rBayesianOptimizationpaquete hace que la implementación de BO sea bastante sencilla
MichaelChirico
0

Grid, Random, Bayesian y PSO ... etc.

Cuando trabajas con XGBoost, todo lo anterior no importa, porque XGB es realmente rápido, por lo que puedes usar Grid con muchos hiperparámetros hasta que encuentres tu solución.

Una cosa que puede ayudarlo: use un método aproximado, siempre me da el error ms bajo.

MasterOne Piece
fuente