나는 더 짧은 해결책이 있다고 생각하지만 다음은 그렇게 해킹되지 않습니다. 우리는 래퍼 (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
와우, 감사합니다. 나는 그 대답을 받아 들일 것이다. 정말 깨끗해 보인다. 그것은 해커가 아니지만 간단하지 않습니다 - 당신은 mlr 기고 가나 sth입니까? 또는이 패키지 깊숙한 기능을 직접 살펴 보았습니까? – Matek
mlr developer;) - 우리는 opt.path 튜닝에 모든 모델을 저장하는 옵션을 추가하려고합니다. 그러나 현재 우리의 기능 요청 목록은 정말 큽니다. –
Thoguht so :). 행운을 빌고 다시 한 번 감사드립니다! – Matek