5

我正在尝试使用 R 包 mlr 在非常适中的硬件(我的笔记本电脑有 4GB RAM --- 我没有可以使用更多的 CPU 肌肉)。我决定使用 mlr,因为我需要使用嵌套交叉验证来调整分类器的超参数并评估最终模型的预期性能。据我所知,目前 caret 和 h2o 都没有提供嵌套交叉验证,但 mlr 提供了实现这一点的基础设施。但是,我发现 mlr 提供的大量功能非常令人不堪重负,并且很难知道如何将所有内容组合在一起以实现我的目标。什么去哪里?它们是如何组合在一起的?我在这里通读了整个文档:https://mlr-org.github.io/mlr-tutorial/release/html/我仍然很困惑。有一些代码片段显示了如何做特定的事情,但(对我来说)不清楚如何将它们拼接在一起。大局是什么?我寻找了一个完整的工作示例以用作模板,但只找到了这个:https ://www.bioconductor.org/help/course-materials/2015/CSAMA2015/lab/classification.html我一直在使用它作为我的开始观点。任何人都可以帮助填补空白吗?

这是我想要做的:

使用网格搜索或随机网格搜索(或者如果存在更快的方法——迭代 F-racing?自适应重采样?)和分层 k 折交叉验证内循环,调整 glmnet 模型的超参数(l1 和 l2 正则化参数),使用外部交叉验证循环来评估预期的最终性能。我想在内部循环中包含一个特征预处理步骤,包括居中、缩放和 Yeo-Johnson 变换,以及基于过滤器的快速特征选择(后者是必要的,因为我的硬件非常适中,我需要缩小特征空间以减少训练时间)。我有不平衡的类(正类约为 20%),所以我选择使用 AUC 作为我的优化目标,但这只是感兴趣的真实指标的替代品,with 是少数真阳性不动点的假阳性率(即,我想知道 TPR = 0.6、0.7、0.8 的 FPR)。我想调整概率阈值以实现这些 TPR,并注意这在嵌套 CV 中是可能的,但目前尚不清楚这里究竟优化了什么: https://github.com/mlr-org/mlr/issues/856 我想知道应该在哪里进行切割而不会导致信息泄漏,所以我想使用 CV 来选择这个。

我使用 glmnet 是因为我宁愿将 CPU 周期用于构建稳健的模型,而不是产生过于乐观的结果的花哨模型。如果我发现可以足够快地完成 GBM 或随机森林,则可以稍后再完成,但我不希望我的数据中的特征提供足够的信息,从而花费大量时间来训练任何特别复杂的东西。

最后,在我对最终模型的预期性能进行了估计之后,我想实际构建最终模型并获得 glmnet 模型的系数 --- 包括哪些系数为零,所以我知道哪些特征已被 LASSO 处罚选中。

希望这一切都有意义!

这是我到目前为止所得到的:

df <- as.data.frame(DT)

task <- makeClassifTask(id = "glmnet", 
                        data = df, 
                        target = "Flavour", 
                        positive = "quark")
task


lrn <- makeLearner("classif.glmnet", predict.type = "prob")
lrn

# Feature preprocessing -- want to do this as part of CV:
lrn <- makePreprocWrapperCaret(lrn,
                               ppc.center = TRUE, 
                               ppc.scale = TRUE,
                               ppc.YeoJohnson = TRUE)
lrn

# I want to use the implementation of info gain in CORElearn, not Weka:
infGain = makeFilter(
  name = "InfGain",
  desc = "Information gain ",
  pkg  = "CORElearn",
  supported.tasks = c("classif", "regr"),
  supported.features = c("numerics", "factors"),
  fun = function(task, nselect, ...) {
    CORElearn::attrEval(
      getTaskFormula(task), 
      data = getTaskData(task), estimator = "InfGain", ...)
  }
)
infGain

# Take top 20 features:
lrn <-  makeFilterWrapper(lrn, fw.method = "InfGain", fw.abs = 20)
lrn

# Now things start to get foggy...

tuningLrn <- makeTuneWrapper(
  lrn, 
  resampling = makeResampleDesc("CV", iters = 2,  stratify = TRUE), 
  par.set = makeParamSet(
    makeNumericParam("s", lower = 0.001, upper = 0.1),
    makeNumericParam("alpha", lower = 0.0, upper = 1.0)
  ), 
  control = makeTuneControlGrid(resolution = 2)
)

r2 <- resample(learner = tuningLrn, 
               task = task, 
               resampling = rdesc, 
               measures = auc)
# Now what...?
4

0 回答 0