R mlr – 包装器特征选择和超参数调整是否可以避免嵌套-嵌套交叉验证?

在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") # 假设代码
ps = makeParamSet(makeDiscreteParam("maxit", 15),
                  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)

有没有办法实现这样的操作?特别是,为了避免嵌套-嵌套交叉验证?有没有任何方法论上的原因表明这样做不合适?因为实际上,使用过滤器特征选择与调整参数(特征数量)看起来与包装器方法非常相似,即,您的额外超参数实际上是一组特定的特征,这些特征要么来自过滤器(例如“卡方”)+ 阈值(前90%,80%,70%),要么是包装器算法的输出(随机,遗传算法,穷举,顺序),并且在两种情况下,最佳特征集都基于内部交叉验证的性能。

我认为这两种方法(带有额外过滤参数的嵌套和嵌套-嵌套)在计算复杂度方面是相似的,但您可能不希望通过嵌套-嵌套交叉验证进一步减少训练数据集,而第一种方法可以实现这一点。

这是我犯的方法论错误,还是因为缺乏(可能不太受欢迎的)功能?


回答:

自从七月起,mlr中已提供此功能。需要安装git版本

devtools::install_github("mlr-org/mlr")

TuneWrapper需要在内部重采样循环中,而FeatSelWrapper需要在外部重采样循环中。这里有一个使用iris.task和rpart进行后向选择的示例:

library(mlr)

调整参数:

ps <- makeParamSet(  makeNumericParam("cp", lower = 0.01, upper = 0.1),  makeIntegerParam("minsplit", lower = 10, upper = 20))

网格搜索:

ctrl <- makeTuneControlGrid(resolution = 5L)

指定学习器:

lrn <- makeLearner("classif.rpart", predict.type = "prob")

生成调参包装器:

lrn <- makeTuneWrapper(lrn, resampling = cv3, par.set = ps, control = makeTuneControlGrid(), show.info = FALSE)

生成特征选择包装器:

lrn = makeFeatSelWrapper(lrn,                         resampling = cv3,                         control = makeFeatSelControlSequential(method = "sbs"), show.info = FALSE)

执行重采样:

res <- resample(lrn, task = iris.task,  resampling = cv3, show.info = TRUE, models = TRUE)

请注意,即使是这个小示例也需要一些时间

res#outputResample ResultTask: iris_exampleLearner: classif.rpart.tuned.featselAggr perf: mmce.test.mean=0.1000000Runtime: 92.1436

可以不使用最外层的重采样来做同样的事情:

lrn <- makeLearner("classif.rpart", predict.type = "prob")
lrn <- makeTuneWrapper(lrn, resampling = cv3, par.set = ps, control = makeTuneControlGrid(), show.info = TRUE)
res2 <- selectFeatures(learner = lrn , task = iris.task, resampling = cv3,                       control = makeFeatSelControlSequential(method = "sbs"), show.info = TRUE)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注