R mlr - 没有嵌套交叉验证的包装特征选择+超参数调整?
R mlr - Wrapper feature selection + hyperparameter tuning without nested-nested cross validation?
在 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)
有没有办法实现这样的目标?特别是,为了避免嵌套交叉验证?是否有任何方法论原因说明这不合适?因为实际上,使用带有调整参数(特征数量)的过滤器特征选择看起来与包装器方法非常相似,也就是说,您的附加超参数实际上是一组特定的特征,要么来自过滤器(例如 "chi-squared")+阈值(前 90%、80%、70%)或包装器算法的输出(随机、GA、详尽、顺序),并且在这两种情况下,最佳特征集都基于内部 cv 性能。
我相信这两种方法(嵌套有用于过滤的附加参数和嵌套嵌套)在计算复杂性方面是相似的,但您可能不想使用嵌套嵌套 CV 进一步减少训练数据集,这将是可以通过第一种方法实现。
这是我犯的方法错误还是缺少(可能不是很受欢迎的)功能?
如果我没听错,你基本上是在问如何调整 FeatSelWrapper
?这有点复杂,因为特征选择(在 mlr
中)取决于重采样,因为它基本上是在调整。我们不调整学习器参数,但我们调整特征的选择以优化 性能测量 。为了计算 measure 我们需要重新采样。
换句话说,您的建议是通过为 功能调整 选择最佳参数来调整 "feature tuning"算法。这自然又带来了一层嵌套重采样。
但是是否有必要这样做值得商榷,因为功能选择的选择通常取决于您的可用资源和其他情况。
您可以做的是对不同的特征选择方法进行基准测试:
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))
此功能自 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)
在 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)
有没有办法实现这样的目标?特别是,为了避免嵌套交叉验证?是否有任何方法论原因说明这不合适?因为实际上,使用带有调整参数(特征数量)的过滤器特征选择看起来与包装器方法非常相似,也就是说,您的附加超参数实际上是一组特定的特征,要么来自过滤器(例如 "chi-squared")+阈值(前 90%、80%、70%)或包装器算法的输出(随机、GA、详尽、顺序),并且在这两种情况下,最佳特征集都基于内部 cv 性能。
我相信这两种方法(嵌套有用于过滤的附加参数和嵌套嵌套)在计算复杂性方面是相似的,但您可能不想使用嵌套嵌套 CV 进一步减少训练数据集,这将是可以通过第一种方法实现。
这是我犯的方法错误还是缺少(可能不是很受欢迎的)功能?
如果我没听错,你基本上是在问如何调整 FeatSelWrapper
?这有点复杂,因为特征选择(在 mlr
中)取决于重采样,因为它基本上是在调整。我们不调整学习器参数,但我们调整特征的选择以优化 性能测量 。为了计算 measure 我们需要重新采样。
换句话说,您的建议是通过为 功能调整 选择最佳参数来调整 "feature tuning"算法。这自然又带来了一层嵌套重采样。
但是是否有必要这样做值得商榷,因为功能选择的选择通常取决于您的可用资源和其他情况。
您可以做的是对不同的特征选择方法进行基准测试:
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))
此功能自 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)