【发布时间】: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