mlr:避免交叉验证中的数据泄漏

时间:2019-07-24 03:28:21

标签: r mlr

我正在将mlr用于我的机器学习项目。我正在使用重复5次的5倍交叉验证和许多不同的算法。我使用MICE(链式方程的多次插补)插补缺失的数据。我还需要标准化数字数据。

我读过的所有内容都说,为避免数据泄漏,我必须在交叉验证循环中执行任何与数据相关的步骤,例如标准化。但是,例如,当normalizeFeatures方法应用于整个任务时,如何在mlr中实现这一目标?

这就是我所拥有的(没有显示鼠标的插补,因为在调用此代码之前已经完成了插补-可能是错误的):

surv.task <- makeSurvTask(id = task_id, data = dataset, target = c(time_var, status_var))
surv.task <- normalizeFeatures(surv.task)
surv.task <- createDummyFeatures(surv.task)
surv.measures = list(cindex)

ridge.lrn  <-  makeLearner(cl="surv.cvglmnet", id = "ridge", predict.type="response", alpha = 0, nfolds=5)
cboostcv.lrn <- makeLearner(cl="surv.cv.CoxBoost", id = "CoxBoostCV", predict.type="response")

outer = makeResampleDesc("RepCV", reps=num_iters, folds=5, stratify=TRUE)
learners = list(ridge.lrn, cboostcv.lrn)
bmr = benchmark(learners, surv.task, outer, surv.measures, show.info = TRUE)

如何在交叉验证循环中调用normalizeFeatures(或进行归因)?

1 个答案:

答案 0 :(得分:3)

这是mlr中包装器的作用,或者您可以使用具有可重新采样管道的mlrCPO软件包。 基本上,您使用mlrCPO pipeop %>>%定义管道。您放置在学习者面前的每一个烟斗都将在训练之前但在火车测试拆分之后立即应用。

library(mlrCPO)

surv.task <- mlr::lung.task
surv.measures = list(cindex)

ridge.lrn  <-  makeLearner(cl="surv.cvglmnet", id = "ridge", predict.type="response", alpha = 0, nfolds=5)
cboostcv.lrn <- makeLearner(cl="surv.cv.CoxBoost", id = "CoxBoostCV", predict.type="response")

my_pipeline <- cpoScale() %>>% cpoDummyEncode() 
ridge.lrn <- my_pipeline %>>% ridge.lrn
cboostcv.lrn <- my_pipeline %>>% cboostcv.lrn

outer = makeResampleDesc("RepCV", reps=2, folds=5, stratify=TRUE)
learners = list(ridge.lrn, cboostcv.lrn)
bmr = benchmark(learners, surv.task, outer, surv.measures, show.info = TRUE)