私はより短い解決策があると思いますが、以下はあまりハッキーではありません。 ラッパーを使用してモデルを保持し、グローバル環境のリストに保存することができます。また、その行をより洗練されたものに変更し、ハードディスクに保存することもできます。モデルがかなり大きくなる可能性があるので、これは価値があるかもしれません。
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
すごく感謝しています。私は答えを受け入れるでしょう。本当にきれいに見えます。それはハッキーではありませんが、単純ではありません - あなたはmlrの貢献者かsthですか?あるいは、あなたはこれらのパッケージ深い機能を自分で調べましたか? – Matek
mlr developer;) - すべてのモデルをチューニングopt.pathに保存するオプションを追加することを検討しています。しかし、現時点では、私たちの機能要求リストは本当に大きいです。 –
Thoguht so :)幸運、そしてもう一度ありがとう! – Matek