【发布时间】:2020-04-14 22:21:46
【问题描述】:
我正在使用 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)
我的第一个问题是我怎样才能获得 FINAL 调整的超参数(而不是与 CV 的每次迭代相对应的调整的超参数,所以不是 @987654327 @ 争论) ?在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()调整学习器,然后按照教程 (mlr.mlr-org.com/articles/tutorial/tune.html) 中的说明提取最佳超参数。你当然不必包裹你的学习者。这样做的目的是让您可以简单地训练模型,而不必担心超参数是什么。您应该进行嵌套重采样,否则您估计的性能可能会有偏差。这样说清楚了吗? -
感谢拉斯的回答。只是为了确保我很好地理解了您的答案:所以,我可以先进行非包裹式采样然后然后使用
tuneParams()调整超参数,而不必担心从测试到训练数据的泄漏?我问这个是因为tuneParams还包含一个resampling参数。 -
是的,只要您将欠采样作为一个完全独立的步骤执行,从测试到训练应该没有泄漏。
-
非常感谢拉斯。我尝试过这个。 - 我从
tuneParams获得的调优超参数与makeTuneWrapper不同是否正常? - 我什至注意到makeTuneWrapper在缩小lower:upper区间时不会给出相同的结果,尽管之前发现的优化超参数仍处于缩小区间(seed设置为特定值。)为什么是这样的吗? -
原则上这当然是可能的,具体取决于您的设置和设置种子的方式。如果您得到非常不同的结果,这可能表明您需要运行调整以进行更多迭代。
标签: hyperparameters mlr