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) 中所述提取最佳超参数。您当然不必包装您的学习器;这样做的目的是让您可以简单地训练模型,而不必担心超参数是什么。您应该进行嵌套重采样,否则您的性能估计可能会有偏差。
我正在使用 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) 中所述提取最佳超参数。您当然不必包装您的学习器;这样做的目的是让您可以简单地训练模型,而不必担心超参数是什么。您应该进行嵌套重采样,否则您的性能估计可能会有偏差。