我正在尝试使用 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 赛车?自适应重采样?)和分层 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...?
Run Code Online (Sandbox Code Playgroud)