【问题标题】:R-MLR : tuning hyper parameters using ' makeTuneControlRandom ' for a wrapped learnerR-MLR:使用“makeTuneControlRandom”为包装学习器调整超参数
【发布时间】:2020-04-15 01:43:28
【问题描述】:

按照my previous question 及其 cmets 中提出的建议,我试图为makeTuneControlRandom 函数的maxit 参数找到一个合适的值,这样当我缩小lower:upper 间隔时,优化的超参数不会改变。在这样做的过程中,我遇到了一个我找不到原因的案例: 假设要调整的超参数是max_depth,它必须是一个整数。在第一步中,我将搜索空间定义如下:

set.seed(1365)
# 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", 
                       predict.threshold = NULL)

paramSet <- makeParamSet(makeIntegerParam(id = "max_depth", lower = 3, upper = 10))

和:

tuneControl <- makeTuneControlRandom(maxit = 50)

如您所见,3 到 10 之间的唯一整数值​​是 3、4、5、6、7、8、10,总共表示 8 个数字(

我运行代码:

# make an undersample-wrapped learner
lrnUnder <- makeUndersampleWrapper(learner = lrnBase, usw.rate = 0.2, usw.cl = "no")

tuneControl <- makeTuneControlRandom(maxit = 50)

# resampling
resampin <- makeResampleDesc(method = "CV",
                             iters = 4L,
                             predict = "test")
# make a tuning-wrapped learner
lrnTune <- makeTuneWrapper(learner = lrnUnder,
                           resampling = resampin, 
                           measures = fp,
                           par.set = paramSet,
                           control = tuneControl)

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)

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

调整后的max_depth 返回为 7,具有特定的混淆矩阵(fp=20,fn=20)。我预计如果我增加maxit 参数的值,调整算法应该仍然会找到相同的最佳max_depth。所以我将maxit 设置为 100,令人惊讶的是它返回了max_depth = 4,相应的混淆矩阵也不同(fp=33,fn=22)。为什么我无法重新找到相同的最佳值?这是因为包含欠采样过程会随机减少我的一个类,因此每次运行时剩余的观察结果都会发生变化?如果是这样,我似乎永远找不到一个单一的调谐模型。我有什么可能的解决方案来克服这个问题?提前非常感谢。

【问题讨论】:

  • 您能否提供一个完整的示例,允许重现该行为,包括数据?
  • 根据 pat-s 的回答,这种行为是完全正常的,因此我没有用我的数据集更新我的问题。不过还是谢谢你。

标签: hyperparameters mlr downsampling


【解决方案1】:

今天阅读您的问题,您似乎没有完全理解“调整模型”时发生的情况,而不是特别关注调整方法(这里:随机搜索)。 我的回答只会解释一个特定的部分,但我强烈建议查阅有关一般统计学习/机器学习的文献。 Elements of Statistical Learning 是一个好的开始。

优化超参数

您要求的是“调整稳定性”。 在您的问题中,您想找到优化问题的局部最小值,并且假设您已经通过 50 次随机搜索尝试找到了它 (max_depth = 7)。

但是,事实证明,如果您使用maxit = 100(100 次随机搜索尝试),您将获得另一个最优值。 这完全没问题。

这样看:如果你幸运的话,你可以在第一次尝试(!)时找到局部最小值(即最能最小化你的错误的超参数设置)。 如果运气不好,你可能会尝试 10^6 次而找不到局部最小值。

问题是,您不知道局部最小值是多少。 你永远不会发现。 没有人会。 因此,50 次尝试和 10^6 次尝试的“最佳设置”可能相同 - 或者在使用 50 次和 51 次尝试时会有所不同。

是否总是一个关于您能够覆盖搜索空间的密集程度的问题。搜索空间是 n 维的(n 是超参数的数量),n 越大,您就越不可能在相同的尝试次数下找到最佳设置。

寻找“最佳模型”

这是由于随机包含欠采样过程吗? 减少我的一门课,所以剩下的观察结果会改变 每次运行?如果是这样,我似乎永远找不到一个调谐 型号。

我不确定您在这里的确切意思,但这些问题可能指向交叉验证和“寻找最佳模型”之间的常见误解。最近有几个问题都存在这些概念问题:您没有在简历中搜索那个“最佳模型”。 CV 仅用于性能估计,每个折叠都是独一无二的,具有自己的优化、特征选择等。 您不应该在折叠中搜索任何“最佳”内容或尝试提取某些内容。

再次,我建议您参考上述文献,以便更好地了解您正在做的事情的全貌。

附录

  • 您可能想发布这样的问题,这些问题完全集中在“为什么像 XX”和“我没有完全了解 XY 中发生的事情,有人可以帮助我吗?”在 https://stats.stackexchange.com 而不是 Stackoverflow 上。
  • 考虑使用 mlr3 代替 mlr,因为后者已于 2019 年 7 月被开发团队停用。

【讨论】:

  • 感谢 Pat 的回答和建议。
猜你喜欢
  • 2020-04-14
  • 2018-12-14
  • 2018-12-07
  • 2016-01-17
  • 2022-04-27
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多