Pregunta

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

¿Fue útil?

Solución

Cada vez que trabajo con xgboost a menudo hago mi propia búsqueda de parámetros caseros, pero puede hacerlo con el paquete Caret, así como Krisp, acabamos de mencionar.

  1. Signo de intercalación

Vea esta respuesta en Cross Valided para obtener una explicación exhaustiva sobre cómo usar el paquete Caret para la búsqueda de hiperparameter en XGBOOST.¿Cómo sintonizar los hiperparámetros de los árboles xgboost?

  1. Búsqueda de cuadrícula personalizada

A menudo empiezo con algunas suposiciones basadas en Owen ZhangSlides en Consejos para la ciencia de datos P. 14

enter image description here

Aquí puede ver que principalmente necesitará ajustar el muestreo de filas, el muestreo de columnas y tal vez la máxima profundidad del árbol. Así es como hago un muestreo de fila personalizada y muestreo de columnas en la búsqueda de 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 alguna magia GGPLOT2 utilizando los resultados de esa función de aplicación, puede trazar una representación gráfica de la búsqueda.My xgboost hyperparameter search

En esta gráfica, los colores más ligeros representan un error más bajo y cada bloque representa una combinación única de muestreo de columnas y muestreo de filas. Entonces, si desea realizar una búsqueda adicional de decir ETA (o profundidad del árbol), terminará con una de estas parcelas para cada parámetros ETA probados.

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 características de ingeniería de tiempo o limpiar 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 hecho/encontrado una implementación de ellos.

Aquí hay una buena imprimación sobre la optimización bayesiana de hiperparametros por Max Kuhn Creador de Caret.

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

Otros consejos

Puede usar el paquete Caret para realizar una búsqueda de espacio de hiperparameter, ya sea a través de un búsqueda de cuadrícula , o a través de búsqueda aleatoria.

Cuadrícula, aleatoria, bayesiana y PSO ... etc.

Cuando trabaja con XGBOost, todo lo anterior no importa, porque XGB es realmente rápido, por lo que puede usar la cuadrícula con muchos hiperparametrs hasta que encuentre su solución.

Una cosa que puede ayudarlo: usar el método de aprox, siempre me da el error MSE más bajo.

Licenciado bajo: CC-BY-SA con atribución
scroll top