R-MLR:为包装学习者调整超参数

R-MLR : get tuned hyperparameters for a wrapped learner

我正在使用 mlr 包在 R 中构建 xgboost 分类任务:

# define task
Task <- mlr::makeClassifTask(id = "classif.xgboost",
                             data = df, 
                             target = "response", 
                             weights = NULL, 
                             positive = "yes", 
                             check.data = TRUE,
                             blocking = folds)

# make a base learner
lrnBase <- makeLearner(cl = "classif.xgboost", 
                       predict.type = "prob", 
                       # "response" (= labels) or "prob" (= labels and probabilities)
                       predict.threshold = NULL
                       )

我必须对我的 类 之一进行欠采样:

lrnUnder <- makeUndersampleWrapper(learner = lrnBase, usw.rate = 0.2, usw.cl = "no")

我还必须调整学习者的一些超参数:

paramSet <- makeParamSet(makeNumericParam(id = "eta", lower = 0.005, upper = 0.4),
                         makeIntegerParam(id = "nrounds", lower = 1, upper = 100))

tuneControl <- makeTuneControlRandom(maxit = 100)
resampin <- makeResampleDesc(method = "CV",
                             iters = 4L,
                             predict = "test")

lrnTune <- makeTuneWrapper(learner = lrnUnder,
                           resampling = resampin, 
                           measures = fp,
                           par.set = paramSet,
                           control = tuneControl)

我的第一个问题是如何获得最终调整的超参数(而不是对应于每个调整的超参数CV 的迭代所以不是 extract 参数)?在 mlr 教程中,我发现我必须 train 我的模型如下:

mdl <- mlr::train(learner = lrnTune, task = Task)
getTuneResult(mdl)

但如果没有 nested resampling,这将不起作用。因此,当我将此块添加到我的代码时,它会起作用:

resampout.desc <- makeResampleDesc(method = "CV",
                                   iters = length(levels(folds)),
                                   predict = "both",
                                   fixed = TRUE)
resampout <- makeResampleInstance(desc = resampout.desc, task = Task)

resamp <- mlr::resample(learner = lrnTune,
                        task = Task,
                        resampling = resampout, # outer
                        measures = f1, 
                        models = FALSE,
                        extract = getTuneResult,
                        keep.pred = TRUE)

我的第二个问题是,原则上,我是否必须包裹我的学习者如果我不想做嵌套重采样(即评估我的模型的性能)?或者我可以简单地制作一个非包装学习器并使用 tuneParams 执行我的调整吗?

预先感谢您的帮助,因为我对包装学习器和嵌套重采样的功能有点困惑。

您可以使用 tuneParams() 调整学习器,然后按照教程 (https://mlr.mlr-org.com/articles/tutorial/tune.html) 中所述提取最佳超参数。您当然不必包装您的学习器;这样做的目的是让您可以简单地训练模型,而不必担心超参数是什么。您应该进行嵌套重采样,否则您的性能估计可能会有偏差。