我试图使用R软件包mlr在非常适度的硬件(我的4GB内存笔记本电脑)上使用大型数据集(大约850000行和大约100个功能)在二进制分类问题上训练glmnet模型 - - 我无法获得更多的CPU肌肉)。我决定使用mlr,因为我需要使用嵌套交叉验证来调整分类器的超参数并评估最终模型的预期性能。据我所知,目前,插入符号或h2o都没有提供嵌套的交叉验证,但mlr提供了提供此功能的基础结构。但是,我发现mlr提供的大量功能极其庞大,并且很难知道如何将所有功能集中在一起以实现我的目标。怎么回事?它们如何结合在一起?我在这里阅读了整个文档:https://mlr-org.github.io/mlr-tutorial/release/html/我仍然感到困惑。有代码片段展示了如何做特定的事情,但它(如果我)不清楚如何将这些拼接在一起。大局是什么?我找了一个完整的工作示例作为模板使用,但只发现了这个:https://www.bioconductor.org/help/course-materials/2015/CSAMA2015/lab/classification.html我一直在使用它作为我的起点。任何人都可以帮助填补空白吗?
这是我想做的事情:
使用网格搜索或随机网格搜索调整glmnet模型的超参数(l1和l2正则化参数)(如果存在的话,还是更快的任何东西 - 迭代的F-racing?自适应重采样?)和分层k折叠交叉验证内循环,带有外部交叉验证循环,以评估预期的最终性能。我想在内循环中包含一个特征预处理步骤,包括居中,缩放和Yeo-Johnson变换,以及基于快速滤波器的特征选择(后者是必需的,因为我有非常适度的硬件,我需要缩小特征空间减少训练时间)。我有不平衡的课程(正面课程约为20%)所以我选择使用AUC作为我的优化目标,但这只是感兴趣的实际指标的替代品,是少数真阳性的假阳性率固定点(即,我想知道TPR的FPR = 0.6,0.7,0.8)。我想调整概率阈值以实现这些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...?