【发布时间】:2019-12-06 16:20:34
【问题描述】:
我正在使用包 mlr 和 mlrMBO 进行嵌套交叉验证。内部 CV 用于参数化(例如,找到最佳参数)。由于我想比较不同学习者的表现,所以我使用 mlr 的 benchmark 功能进行了基准实验。我的问题如下:是否可以对参数化模型/学习器进行置换?当我在基准实验中使用的学习器上调用 generateFeatureImportanceData 时,会再次估计模型(忽略通过顺序优化学习的参数化)。这是 iris 数据集上的一些代码来说明我的问题(没有预处理,仅用于说明)。
library(dplyr)
library(mlr)
library(mlrMBO)
library(e1071)
nr_inner_cv <- 3L
nr_outer_cv <- 2L
inner = makeResampleDesc(
"CV"
, iters = nr_inner_cv # folds used in tuning/bayesian optimization)
learner_knn_base = makeLearner(id = "knn", "classif.knn")
par.set = makeParamSet(
makeIntegerParam("k", lower = 2L, upper = 10L)
)
ctrl = makeMBOControl()
ctrl <- makeMBOControl(propose.points = 1L)
ctrl <- setMBOControlTermination(ctrl, iters = 10L)
ctrl <- setMBOControlInfill(ctrl, crit = crit.ei, filter.proposed.points = TRUE)
set.seed(500)
tune.ctrl <- makeTuneControlMBO(
mbo.control = ctrl,
mbo.design = generateDesign(n = 10L, par.set = par.set)
)
learner_knn = makeTuneWrapper(learner = learner_knn_base
, resampling = inner
, par.set = par.set
, control = tune.ctrl
, show.info = TRUE
)
learner_nb <- makeLearner(
id = "naiveBayes"
,"classif.naiveBayes"
)
lrns = list(
learner_knn
, learner_nb
)
rdesc = makeResampleDesc("CV", iters = nr_outer_cv)
set.seed(12345)
bmr = mlr::benchmark(lrns, tasks = iris.task, show.info = FALSE,
resamplings = rdesc, models = TRUE, keep.extract = TRUE)
【问题讨论】:
-
一些代码会有所帮助,因为您不完全清楚您如何调整以及您想要获得哪些功能重要性。您在使用
tuneWrapper吗?您想计算每个外部 CV 拆分的特征重要性吗?一种选择是事后进行。您必须使用makeResampleInstance修复 CV 拆分,对任务进行子集化,提取每个获得的最佳超参数设置。然后,您可以在子集任务上调用generateFeatureImportanceData之前相应地手动设置超参数。 -
@jakob-r 非常感谢您的评论。我添加了一些代码来显示到目前为止我在做什么。据我了解,计算每个外部分割的特征重要性是很常见的(在每个外部循环的训练集上)。