Parâmetros do XGBoost com ajuste otimizado

27

O XGBoost tem feito um ótimo trabalho quando se trata de lidar com variáveis ​​dependentes categóricas e contínuas. Mas, como seleciono os parâmetros otimizados para um problema no XGBoost?

Foi assim que apliquei os parâmetros para um problema recente do 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
)

Tudo o que faço para experimentar é selecionar aleatoriamente (com intuição) outro conjunto de parâmetros para melhorar o resultado.

Existe alguma maneira de automatizar a seleção do melhor (melhor) conjunto de parâmetros?

(As respostas podem estar em qualquer idioma. Estou apenas procurando a técnica)

Dawny33
fonte

Respostas:

40

Sempre que trabalho com o xgboost, costumo fazer minha própria pesquisa de parâmetros de homebrew, mas você pode fazê-lo com o pacote de interpolação, assim como o KrisP que acabei de mencionar.

  1. Caret

Veja esta resposta em Validação cruzada para obter uma explicação completa sobre como usar o pacote de acento circunflexo para pesquisa por hiperparâmetro no xgboost. Como ajustar os hiperparâmetros das árvores xgboost?

  1. Pesquisa em grade personalizada

Costumo começar com algumas suposições baseadas nos slides de Owen Zhang sobre dicas para ciência de dados P. 14

insira a descrição da imagem aqui

Aqui você pode ver que você precisará ajustar a amostragem de linha, a coluna e talvez a profundidade máxima da árvore. É assim que faço uma amostragem de linha personalizada e uma pesquisa de coluna para encontrar um problema no qual estou trabalhando no 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 combinado com alguma mágica do ggplot2, usando os resultados dessa função de aplicação, você pode plotar uma representação gráfica da pesquisa.Minha pesquisa de hiperparâmetro xgboost

Neste gráfico, cores mais claras representam um erro menor e cada bloco representa uma combinação única de amostragem de coluna e amostragem de linha. Portanto, se você deseja executar uma pesquisa adicional de say eta (ou profundidade da árvore), você terminará com um desses gráficos para cada eta parâmetros testados.

Vejo que você tem uma métrica de avaliação diferente (RMPSE), basta inseri-la na função de validação cruzada e obterá o resultado desejado. Além disso, eu não me preocuparia muito com o ajuste fino dos outros parâmetros, pois isso não melhoraria muito o desempenho, pelo menos não muito comparado a gastar mais tempo projetando recursos ou limpando os dados.

  1. Outras

A pesquisa aleatória e a seleção de parâmetros bayesianos também são possíveis, mas ainda não fiz / encontrei uma implementação delas.

Aqui está uma boa cartilha sobre otimização bayesiana de hiperparâmetros pelo criador de caret de Max Kuhn.

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

wacax
fonte
Eu tenho uma pergunta sobre o parâmetro min_child_weight. diz 3 / (% de eventos raros) Suponha que eu tenha 3 classes 0 (3,4%), 1 (96,4%) e 2 (0,2%). então deveria ser 3 / 3.6 ou 3 / 0.2? Eu estou supondo que o ex
Na maioria dos casos, o xgboost trata qualquer coisa abaixo de 5% como eventos raros na maioria dos problemas, acho que é uma das peculiaridades do algoritmo. Eu gosto de pensar que qualquer coisa abaixo de um clique em um problema de CTR é um "evento raro". Portanto, neste caso, seria 3 / 3,6. Eu às vezes é mais baixo, mas não com tanta frequência.
Wacax 29/09/16
11
rBayesianOptimizationpacote torna a implementação do BO bastante direta
MichaelChirico
5

Você pode usar o pacote de intercalação para fazer a pesquisa de espaço com hiperparâmetros, por meio de uma pesquisa em grade ou por meio de pesquisa aleatória .

KrisP
fonte
0

Grade, Aleatório, Bayesiano e PSO ... etc.

Quando você trabalha com o XGBoost, tudo isso não importa, porque o XGB é realmente rápido, então você pode usar o Grid com muitos hiperparâmetros até encontrar a solução.

Uma coisa que pode ajudá-lo: use o método approx, ele sempre me dá o menor erro mse.

MasterOne Piece
fonte