【问题标题】:R mlr package - is it possible to save all models from Parameter tuning?R mlr 包 - 是否可以从参数调整中保存所有模型?
【发布时间】:2017-03-08 03:26:04
【问题描述】:

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

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

有没有办法做到这一点?

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

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

【问题讨论】:

    标签: r machine-learning cross-validation mlr


    【解决方案1】:

    我想有更短的解决方案,但以下不是那么 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
    

    【讨论】:

    • 哇,非常感谢您提供的代码。我会接受答案。看起来真的很干净。这不是 hacky 但它并不简单 - 你是 mlr 贡献者还是某事?还是您自己探索了这些包深度功能?
    • mlr developer ;) - 我们正在考虑添加一个选项以将所有模型存储在调整 opt.path 中。但目前我们的功能请求列表确实很大。
    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2020-04-15
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多