【问题标题】:R-MLR : get tuned hyperparameters for a wrapped learnerR-MLR : 为包装学习器调整超参数
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 2018-12-14
    • 2018-12-07
    • 2022-04-27
    • 2014-08-27
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多