R mlr - Wrapper特征选择+超参数调整,没有嵌套嵌套交叉验证?

时间:2016-11-10 12:17:58

标签: r machine-learning cross-validation 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") # 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)

有没有办法实现这样的目标?特别是,为了避免嵌套嵌套交叉验证?是否有任何方法上的原因这是不合适的?因为实际上,使用带有调整参数(特征数量)的过滤器特征选择看起来非常类似于包装器方法,也就是说,您的附加超参数实际上是一组特征,或者来自过滤器(例如"卡方和#34;)+阈值(前90%,80%,70%)或包装算法的输出(随机,GA,穷举,顺序),最佳功能集基于两种情况下的内部cv性能

我相信这两种方法(嵌套了额外的过滤和嵌套嵌套参数)在计算复杂性方面是相似的,但您可能不希望使用嵌套嵌套的CV进一步减少训练数据集,这可以通过以下方法实现:第一种方法。

这是我正在制作的方法错误,还是缺少(可能不是很受欢迎)功能?

2 个答案:

答案 0 :(得分:2)

July起,此功能在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
#output
Resample Result
Task: iris_example
Learner: classif.rpart.tuned.featsel
Aggr perf: mmce.test.mean=0.1000000
Runtime: 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)

答案 1 :(得分:1)

如果我说得对,你基本上都在问如何调整FeatSelWrapper?这有点复杂,因为特征选择(在mlr中)依赖于重新采样,因为它基本上是调整。我们不调整学习者参数,但我们调整功能选择以优化性能测量。要计算度量,我们需要重新采样。

因此,您提出的建议是通过为特征调整算法选择最佳参数来调整“特征调整”。这自然会带来另一层嵌套重采样。

但是如果这是必要的话,这是有争议的,因为功能选择的选择通常取决于您的可用资源和其他情况。

您可以做的是对不同的特征选择方法进行基准测试:

inner = makeResampleDesc("CV", iter = 2)
outer = makeResampleDesc("Subsample", iter = 3)
settings = list(random1 = makeFeatSelControlRandom(maxit = 15), random2 =  makeFeatSelControlRandom(maxit = 20))
lrns = Map(function(x, xn) {
  lrn = makeFeatSelWrapper(learner = "regr.lm", control = x, resampling = inner)
  lrn$id = paste0(lrn$id, ".", xn)
  lrn
}, x = settings, xn = names(settings))
benchmark(lrns, bh.task, outer, list(mse, timeboth))