Байесовская оптимизация гиперпараметров в R - PullRequest
0 голосов
/ 25 октября 2019

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

Я наткнулся на этот сайт, где автор использует пакет mlrMBO для МАКСИМАЛЬНОЙ вероятности записи в журнал (см. Пример № 2): https://www.simoncoulombe.com/2019/01/bayesian/. У меня есть другой сценарий, в котором я хочуМИНИМИЗИРУЙТЕ потерю журнала, поэтому я внес некоторые незначительные корректировки в код автора при определении целевой функции, но я не уверен, что она правильная. Его целевая функция вернула максимальное значение логарифмического правдоподобия теста, полученное путем перекрестной проверки, а аргумент minimize в функции makeSingleObjectiveFunction в библиотеке smoof установлен на FALSE. Поскольку я хочу минимизировать потери журнала, я возвратил минимум потери журнала из перекрестной проверки и установил аргумент minimize равным TRUE. Поскольку это моя первая попытка использования пакета и я не слишком разбираюсь в машинном обучении в целом, я не уверен, что мой код верен. Любые идеи будут с благодарностью!


obj.fun  <- makeSingleObjectiveFunction(
  name = "xgb_cv_bayes",
  fn = function(x){
    set.seed(12345)
    cv <- xgb.cv(params = list(
      booster          = "gbtree",
      eta              = x["eta"],
      max_depth        = x["max_depth"],
      min_child_weight = x["min_child_weight"],
      gamma            = x["gamma"],
      subsample        = x["subsample"],
      colsample_bytree = x["colsample_bytree"],
      objective        = "binary:logistic", 
      eval_metric     = "logloss"),
      data = dtrain,
      nrounds = x["nrounds"],
      folds =  cv_folds,
      prediction = FALSE,
      showsd = TRUE,
      early_stopping_rounds = 10,
      verbose = 0)

    cv$evaluation_log[, min(test_logloss_mean)]
  },
  par.set = makeParamSet(
    makeNumericParam("eta",              lower = 0.1, upper = 0.5),
    makeNumericParam("gamma",            lower = 0,   upper = 5),
    makeIntegerParam("max_depth",        lower = 3,   upper = 6),
    makeIntegerParam("min_child_weight", lower= 1,    upper = 2),
    makeNumericParam("subsample",        lower = 0.6, upper = 0.8),
    makeNumericParam("colsample_bytree", lower = 0.5, upper = 0.7),
    makeIntegerParam("nrounds", lower = 100, upper = 1000)
  ),
  minimize = TRUE
)
...