【问题标题】:MLR: How to compute permuted feature importance for sequential MBO parametrized models?MLR:如何计算顺序 MBO 参数化模型的置换特征重要性?
【发布时间】: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 非常感谢您的评论。我添加了一些代码来显示到目前为止我在做什么。据我了解,计算每个外部分割的特征重要性是很常见的(在每个外部循环的训练集上)。

标签: r mlr


【解决方案1】:

我认为这是我们经常遇到的一个普遍问题:我可以在 CV 中安装的模型上做 XY 吗?简短的回答:是的,你可以,但你真的想要吗?

详细解答

类似的问题:

正如@jakob-r 的评论所示,有两种选择:

  1. 要么在 CV 之外重新创建模型,然后在其上调用所需的函数
  2. 您可以通过 resample() 中的 extract 参数在相应折叠的每个拟合模型的 CV 中执行此操作。另请参阅上面链接的 Q2。

1) 如果您想在所有型号上执行此操作,请参阅下面的 2)。如果您只想在某些折叠的模型上执行此操作:您使用哪些标准来选择这些?

2) 是高度计算密集型的,您可能想问为什么要这样做 - 即您想对每个折叠模型的所有信息做什么?

一般来说,我从未见过已应用的研究/用例。您在 CV 中所做的一切都有助于估计每个折叠的性能值。之后您不想与这些模型进行交互。

您宁愿在未分区的数据集上估计特征重要性一次(您已经事先优化了超标准一次)。这同样适用于 ML 模型的其他诊断方法:将它们应用于您的“完整数据集”,而不是应用于 CV 中的每个模型。

【讨论】:

  • 非常感谢您的详尽回答!我将研究您发布的链接,但我已经有一个问题了。在上一节中,您对非分区数据集的确切含义是什么?假设我做了一个 3x5(外部 x 内部)嵌套 CV。我将整个数据集分成 3 个部分,使用内部循环中的优化参数估计“泛化性能”。然后我会在整个数据集上使用这三个最好的超参数设置来最终置换和估计重要性?这是正确的吗?
  • 不,CV 仅用于估计性能,而不是用于查询(多个)超参数以应用于整个数据集。这些超标准仅对于选择它们的 CV 的特定折叠是“最佳的”。我不认为你想要/不应该对 CV 的模型做任何事情——但我不能/不会阻止你做不同的事情;)
  • 感谢您的快速回复。但后来我似乎不明白你会估计特征重要性的集合。你能具体说明一下吗?谢谢?
  • 在你的完整数据集上估计它。
猜你喜欢
  • 2020-10-26
  • 2017-10-25
  • 1970-01-01
  • 2021-09-07
  • 2021-08-22
  • 2021-04-15
  • 2016-03-17
  • 2021-02-04
  • 1970-01-01
相关资源
最近更新 更多