Гипертюнинг параметров XGBoost

27

XGBoost проделал большую работу, когда речь идет о работе как с категориальными, так и с непрерывно зависимыми переменными. Но как выбрать оптимизированные параметры для проблемы XGBoost?

Вот как я применил параметры для недавней проблемы 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
)

Все, что я делаю, чтобы экспериментировать, это случайно выбираю (с интуицией) другой набор параметров для улучшения результата.

Есть ли вообще автоматизировать выбор оптимального (лучшего) набора параметров?

(Ответы могут быть на любом языке. Я просто ищу технику)

Dawny33
источник

Ответы:

40

Всякий раз, когда я работаю с xgboost, я часто делаю свой собственный поиск параметров homebrew, но вы можете сделать это с помощью пакета caret, как только что упомянутое KrisP.

  1. знак вставки

Посмотрите этот ответ на Cross Validated для подробного объяснения того, как использовать пакет каретки для поиска гиперпараметров в xgboost. Как настроить гиперпараметры деревьев xgboost?

  1. Пользовательский поиск по сетке

Я часто начинаю с нескольких предположений, основанных на слайдах Оуэна Чжана о советах по науке о данных, с. 14

введите описание изображения здесь

Здесь вы можете видеть, что вам в основном нужно настроить выборку строк, выборку столбцов и, возможно, максимальную глубину дерева. Вот как я выполняю выборочную выборку строк и столбцов для поиска проблемы, над которой я сейчас работаю:

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

})

И в сочетании с некоторой магией ggplot2, используя результаты этой функции применения, вы можете построить графическое представление поиска.Мой поиск по гиперпараметрам xgboost

На этом графике более светлые цвета представляют меньшую ошибку, и каждый блок представляет уникальную комбинацию выборки столбца и выборки строки. Поэтому, если вы хотите выполнить дополнительный поиск, скажем, eta (или глубины дерева), вы получите один из этих графиков для каждого протестированного eta-параметра.

Я вижу, у вас есть другая метрика оценки (RMPSE), просто подключите ее к функции перекрестной проверки, и вы получите желаемый результат. Кроме того, я бы не стал слишком беспокоиться о тонкой настройке других параметров, потому что это не слишком сильно повысит производительность, по крайней мере, не так сильно, по сравнению с затрачиванием большего количества времени на разработку функций или очистку данных.

  1. другие

Случайный поиск и выбор байесовских параметров также возможны, но я еще не нашел / не нашел их реализацию.

Вот хороший учебник по байесовской оптимизации гиперпараметров, создатель карета Макса Куна.

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

wacax
источник
У меня есть вопрос, касающийся параметра min_child_weight. это говорит 3 / (% редких событий) Предположим, у меня есть 3 класса 0 (3,4%), 1 (96,4%) и 2 (0,2%). так должно быть 3 / 3,6 или 3 / 0,2? Я предполагаю, что бывший
В большинстве случаев xgboost рассматривает что-либо ниже 5% как редкие события в большинстве задач, я думаю, это одна из особенностей алгоритма. Мне нравится думать, что все, что ниже щелчка в CTR, является «редким событием». Так что в этом случае это будет 3 / 3,6. Я иногда ниже, но не так часто.
Wacax
1
rBayesianOptimizationпакет делает реализацию BO довольно проста
MichaelChirico
0

Сетка, рандом, байесовский и PSO ... и т.д ..

Когда вы работаете с XGBoost, все вышеперечисленное не имеет значения, потому что XGB действительно быстр, поэтому вы можете использовать Grid со многими гиперпараметрами, пока не найдете свое решение.

Одна вещь, которая может вам помочь: используйте приблизительный метод, он всегда дает мне самую низкую ошибку mse.

MasterOne Piece
источник