Как установить фиксированное случайное начальное число для внутреннего цикла вложенной настройки гиперпараметров? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь выполнить настройку гиперпараметров с вложенной перекрестной проверкой.Это мои внутренние циклы для двух учеников lrn1 и lrn2:

inner = makeResampleDesc("CV", iters = 3L)

tune_lrn1 <- makeTuneWrapper(lrn1, resampling = inner, par.set = ps, control = ctrl)

tune_lrn2 <- makeTuneWrapper(lrn2, resampling = inner, par.set = ps, control = ctrl)

Есть ли способ установить фиксированное значение случайного начального числа каждый раз перед созданием экземпляра «inner», чтобы два ученика всегда использовали точноодни и те же разделы данных для оценки гиперпараметров?

1 Ответ

0 голосов
/ 29 апреля 2019

Есть две вещи, которые вы можете сделать, но они могут не полностью удовлетворить ваши потребности.

Исправить повторную выборку для данного задания

... или хотя бы данный номер. В этом примере мы используем задачу iris.task.

inner_fixed = makeResampleInstance(inner, iris.task)
tune_lrn1 <- makeTuneWrapper(lrn1, resampling = inner_fixed, par.set = ps, control = ctrl)
tune_lrn2 <- makeTuneWrapper(lrn2, resampling = inner_fixed, par.set = ps, control = ctrl)

Если вы хотите применить это для нескольких задач, вы должны решить это программно.

Установка семян может быть неудачной!

Следующая настройка уже используется по умолчанию

ctrl = makeTuneControl*(same.resampling.instance = TRUE, ...)

Это означает, что все оценки настройки оцениваются в одном и том же разделении поезда / теста Другими словами: makeResampleInstance вызывается в самом начале tune(). Теперь мы можем перейти к ответу @ pat-s, который не всегда работает, потому что RNG используется во время обучения для некоторых учеников, и, соответственно, текущий разделение поезда / теста будет «расходиться»:

library(mlr)
inner = makeResampleDesc("CV", iters = 3L)
task = iris.task
lrn1 = makeLearner("classif.rpart")
lrn2 = makeLearner("classif.svm")
ctrl = makeTuneControlRandom(same.resampling.instance = TRUE, budget = 4)

library(mlrHyperopt)
ps1 = getDefaultParConfig(lrn1)$par.set
ps2 = getDefaultParConfig(lrn2)$par.set

tune_lrn1 = makeTuneWrapper(lrn1, resampling = inner, par.set = ps1, control = ctrl)
tune_lrn2 = makeTuneWrapper(lrn2, resampling = inner, par.set = ps2, control = ctrl)
set.seed(1)
r1 = resample(tune_lrn1, resampling = cv10, task = iris.task, models = TRUE)
set.seed(1)
r2 = resample(tune_lrn2, resampling = cv10, task = iris.task, models = TRUE)

sapply(1:10, function(i) {
  identical(r2$models[[i]]$learner.model$opt.result$resampling$train.inds, r1$models[[i]]$learner.model$opt.result$resampling$train.inds)  
})

# [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
...