MLR:如何计算顺序 MBO 参数化模型的置换特征重要性?
MLR: How to compute permuted feature importance for sequential MBO parametrized models?
我正在使用 mlr 和 mlrMBO 包进行嵌套交叉验证。内部 CV 用于参数化(例如找到最佳参数)。由于我想比较不同学习者的表现,所以我使用mlr的基准函数进行基准实验。我的问题如下:是否可以对参数化 model/learner 进行置换?当我在基准实验中使用的学习器上调用 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)
我认为这是我们经常遇到的一个普遍问题:我可以在 CV 中安装的模型上做 XY 吗?简短回答:是的,你可以,但你真的想要吗?
详细解答
类似问题:
mlr: retrieve output of generateFilterValuesData within CV loop
R - mlr: Is there a easy way to get the variable importance of tuned support vector machine models in nested resampling (spatial)?
如@jakob-r 的评论所示,有两种选择:
- 要么在 CV 之外重新创建模型并在其上调用所需的函数
- 您通过
resample()
中的 extract
参数在相应折叠的每个拟合模型的 CV 中执行此操作。另见上面链接的 Q2。
1) 如果您想在所有型号上执行此操作,请参阅下面的 2)。如果您只想在某些折叠的模型上这样做:您使用了哪些标准 select 那些?
2) 是高度计算密集型的,您可能想质疑为什么要这样做 - 即您想要对每个折叠模型的所有信息做什么?
总的来说,我从未见过 study/use 应用的案例。您在 CV 中所做的一切都有助于估计每个折叠的 性能值 。您之后不想与这些模型进行交互。
您宁愿在非分区数据集上估计特征重要性 once(您已经预先优化了 hyperpars once).这同样适用于 ML 模型的其他诊断方法:将它们应用于您的 "full dataset",而不是应用于 CV 中的每个模型。
我正在使用 mlr 和 mlrMBO 包进行嵌套交叉验证。内部 CV 用于参数化(例如找到最佳参数)。由于我想比较不同学习者的表现,所以我使用mlr的基准函数进行基准实验。我的问题如下:是否可以对参数化 model/learner 进行置换?当我在基准实验中使用的学习器上调用 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)
我认为这是我们经常遇到的一个普遍问题:我可以在 CV 中安装的模型上做 XY 吗?简短回答:是的,你可以,但你真的想要吗?
详细解答
类似问题:
mlr: retrieve output of generateFilterValuesData within CV loop
R - mlr: Is there a easy way to get the variable importance of tuned support vector machine models in nested resampling (spatial)?
如@jakob-r 的评论所示,有两种选择:
- 要么在 CV 之外重新创建模型并在其上调用所需的函数
- 您通过
resample()
中的extract
参数在相应折叠的每个拟合模型的 CV 中执行此操作。另见上面链接的 Q2。
1) 如果您想在所有型号上执行此操作,请参阅下面的 2)。如果您只想在某些折叠的模型上这样做:您使用了哪些标准 select 那些?
2) 是高度计算密集型的,您可能想质疑为什么要这样做 - 即您想要对每个折叠模型的所有信息做什么?
总的来说,我从未见过 study/use 应用的案例。您在 CV 中所做的一切都有助于估计每个折叠的 性能值 。您之后不想与这些模型进行交互。
您宁愿在非分区数据集上估计特征重要性 once(您已经预先优化了 hyperpars once).这同样适用于 ML 模型的其他诊断方法:将它们应用于您的 "full dataset",而不是应用于 CV 中的每个模型。