Я искал байесовскую оптимизацию для настройки гиперпараметра и пытался сравнить полученные результаты с теми, которые я получил, используя разные методы (случайный поиск по сетке).
Я наткнулся на этот сайт, где автор использует пакет 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
)