Использование ParBayesianOptimization для задачи регрессии в R (минимизация rmse) - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь использовать пакет ParBayesianOptimization для настройки параметров в моей модели. Исходный репозиторий GitHub демонстрирует, как реализовать пакет для настройки параметров в задаче классификации (максимизация AU C). Однако в моем случае я хочу реализовать функцию в задаче регрессии и минимизировать значение rmse.

Основная проблема, с которой я сталкиваюсь, состоит в том, чтобы понять, почему конечные параметры getBestPars(optObj) выбираются в соответствии с самое высокое значение в столбце Оценка здесь: optObj$scoreSummary. Как я понимаю, столбец оценки представляет значение rmse для данной итерации, поэтому функция должна возвращать параметры для самой низкой оценки.

Мои результаты: enter image description here

Пример кода для воспроизведения:


# install.packages("mlbench")
library('mlbench')
library('ParBayesianOptimization')
library("xgboost")
library("data.table")
library('doParallel')


#------------------------------------------------------------------------------#
#### Get data
#------------------------------------------------------------------------------#

set.seed(123)
data(BostonHousing)
BostonHousing <- data.frame(apply(BostonHousing, 2, as.numeric))
setDT(BostonHousing)


train_x <- BostonHousing[ , .SD,.SDcols = setdiff(names(BostonHousing), "medv")]
train_y <- BostonHousing[ ,.SD,.SDcols = "medv"]



#------------------------------------------------------------------------------#
#### Create Folds
#------------------------------------------------------------------------------#
Folds <- list(
  Fold1 = as.integer(seq(1,nrow(BostonHousing),by = 3))
  , Fold2 = as.integer(seq(2,nrow(BostonHousing),by = 3))
  , Fold3 = as.integer(seq(3,nrow(BostonHousing),by = 3))
)


#------------------------------------------------------------------------------#
#### define the scoring function
#------------------------------------------------------------------------------#
scoringFunction <- function(max_depth, min_child_weight, subsample, eta, gamma, 
                            colsample_bytree) {

  dtrain <- xgboost::xgb.DMatrix(as.matrix(train_x), label = as.matrix(train_y))

  Pars <- list(
    booster = "gbtree"
    , gamma = gamma
    , colsample_bytree = colsample_bytree
    , eta = eta
    , max_depth = max_depth
    , min_child_weight = min_child_weight
    , subsample = subsample
    , objective = 'reg:linear'
    , eval_metric = "rmse"
  )

  xgbcv <- xgb.cv(
    params = Pars
    , data = dtrain
    , nround = 100
    , folds = Folds
    , early_stopping_rounds = 100
    , maximize = TRUE
    , verbose = 1
  )

  return(
    list(Score = min(xgbcv$evaluation_log$test_rmse_mean)
         , nrounds = xgbcv$best_iteration
    )
  )

}

#------------------------------------------------------------------------------#
#### Bounds
#------------------------------------------------------------------------------#
bounds <- list(
  gamma = c(0.1,50L) 
  , colsample_bytree = c(0.5,1L)
  , eta = c(0.01,0.1) 
  , max_depth = c(1L, 5L) 
  , min_child_weight = c(0, 25) 
  , subsample = c(0.1, 1) 
)


#------------------------------------------------------------------------------#
#### To run in parallel
#------------------------------------------------------------------------------#
cl <- makeCluster(parallel::detectCores() - 1)
registerDoParallel(cl)
clusterExport(cl,c('Folds','train_x', "train_y"))
clusterEvalQ(cl,expr= {
  library(xgboost)
})

tWithPar <- system.time(
  optObj <- bayesOpt(
    FUN = scoringFunction
    , bounds = bounds
    , initPoints = 7 
    , iters.n = (parallel::detectCores() - 1)*2 
    , iters.k = (parallel::detectCores() - 1)*2 
    , parallel = TRUE
    , verbose = 1
  )
)


stopCluster(cl)
registerDoSEQ()


#------------------------------------------------------------------------------#
#### Printing results
#------------------------------------------------------------------------------#
optObj$scoreSummary
getBestPars(optObj)

Буду признателен за любую помощь в лучшем понимании функции и как правильно реализовать это в задаче регрессии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...