R mlr 包 - 是否可以从参数调整中保存所有模型?

R mlr package - is it possible to save all models from Parameter tuning?

我想问一下是否可以保存在调参过程中创建的所有模型,例如具有 tuneParams 功能。我想从每个超参数集的交叉验证中保存模型。

我可以看到 resamplebenchmark 函数都有 models 参数,但我在 tuneParams 或类似函数中找不到,我找不到真的找到了一种使用其他函数来模仿这种行为的方法(我是 mlr 的新手)。

有办法吗?

PS我知道这听起来很疯狂,但我需要它进行一些内部验证。

PS2 不幸的是,似乎还没有 "mlr" 标签,我没有足够的代表来创建一个。

我想有更短的解决方案,但以下不是那么 hacky。 我们使用 Wrapper 来获取模型,以便我们可以将其保存在全局环境中的列表中。或者,您可以将该行更改为更复杂的内容并将其保存在硬盘上。这可能是值得的,因为模型可以变得非常大。

library(mlr)

# Define the tuning problem
ps = makeParamSet(
  makeDiscreteParam("C", values = 2^(-2:2)),
  makeDiscreteParam("sigma", values = 2^(-2:2))
)
ctrl = makeTuneControlGrid()
rdesc = makeResampleDesc("Holdout")
lrn = makeLearner("classif.ksvm")


# Define a wrapper to save all models that were trained with it
makeSaveWrapper = function(learner) {
  mlr:::makeBaseWrapper(
    id = paste0(learner$id, "save", sep = "."),
    type = learner$type,
    next.learner = learner,
    par.set = makeParamSet(),
    par.vals = list(),
    learner.subclass = "SaveWrapper",
    model.subclass = "SaveModel")
}

trainLearner.SaveWrapper = function(.learner, .task, .subset, ...) {
  m = train(.learner$next.learner, task = .task, subset = .subset)
  stored.models <<- c(stored.models, list(m)) # not very efficient, maybe you want to save on hard disk here?
  mlr:::makeChainModel(next.model = m, cl = "SaveModel")
}

predictLearner.SaveWrapper = function(.learner, .model, .newdata, ...) {
  NextMethod(.newdata = .newdata)
}

stored.models = list() # initialize empty list to store results
lrn.saver = makeSaveWrapper(lrn)

res = tuneParams(lrn.saver, task = iris.task, resampling = rdesc, par.set = ps, control = ctrl)

stored.models[[1]] # the normal mlr trained model
stored.models[[1]]$learner.model # the underlying model
getLearnerParVals(stored.models[[1]]$learner) # the hyper parameter settings
stored.models[[1]]$subset # the indices used to train the model