在mlr中,可以使用嵌套交叉验证来进行过滤器特征选择以及超参数调整,例如,用下面的代码。R 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进一步减少训练数据集,这是可以实现的采用第一种方法。
这是我正在做的一个方法错误还是这是一个缺乏(可能不是真正流行)的功能?
'bh.task'是一个回归任务'lm'也是一种回归方法。您可能希望使用'mse'作为重采样的一项措施。 –
@jakobr啊,对不起,我只是无意识地复制了一段代码,只是为了展示我所问的概念。编辑 – Matek