在 mlr 中,可以使用嵌套交叉验证进行过滤器特征选择和超参数调整,例如使用以下代码。
lrn = makeFilterWrapper(learner = "regr.kknn", fw.method = "chi.squared")
ps = makeParamSet(makeDiscreteParam("fw.abs", values = 10:13),
makeDiscreteParam("k", values = c(2, 3, 4)))
ctrl = makeTuneControlGrid()
inner = makeResampleDesc("CV", iter = 2)
outer = makeResampleDesc("Subsample", iter = 3)
lrn = makeTuneWrapper(lrn, resampling = inner, par.set = ps, control = ctrl, show.info = FALSE)
res = resample(lrn, bh.task, outer, mse, extract = getTuneResult)
但据我所知,使用包装器特征选择是不可能做这样的事情的,例如:
lrn = makeFeatSelWrapper(learner = "regr.kknn", ww.method = "random") # imaginary code
ps = makeParamSet(makeDiscreteParam("maxit", 15),
makeDiscreteParam("k", values = c(2, 3, 4))) # imaginary code, no method parameter & no resampling provided
ctrl = makeTuneControlGrid()
inner = makeResampleDesc("CV", iter = 2)
outer = makeResampleDesc("Subsample", iter = 3)
lrn = makeTuneWrapper(lrn, resampling = inner, par.set = ps, control = ctrl, show.info = FALSE)
res = resample(lrn, bh.task, outer, mse, extract = getTuneResult)
有没有办法实现这样的目标?特别是为了避免嵌套嵌套交叉验证?有什么方法论上的理由不合适吗?因为实际上,使用带有调整参数(特征数量)的过滤器特征选择看起来与包装器方法非常相似,也就是说,您的附加超参数实际上是一组特征,或者来自过滤器(例如“卡方”)+阈值(前 90%、80%、70%)或包装算法的输出(随机、遗传算法、穷举、顺序),并且在这两种情况下,最佳特征集都基于内部 cv 性能。
我相信这两种方法(嵌套了用于过滤的附加参数和嵌套嵌套)在计算复杂性方面是相似的,但是您可能不想使用嵌套嵌套 CV 进一步减少训练数据集,这可以通过第一种方法实现.
这是我正在犯的方法错误还是缺少(可能不是很受欢迎)功能?