mlr :避免交叉验证中的数据泄漏
mlr : Avoiding data leakage in cross validation
我正在为我的机器学习项目使用 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(或进行插补)?
这就是 mlr 中的包装器的用途,或者您可以使用包 mlrCPO,它具有可以重新采样的管道。
基本上,您使用 mlrCPO pipeop %>>%
定义管道。您放在学习者之前的每个 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)
我正在为我的机器学习项目使用 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(或进行插补)?
这就是 mlr 中的包装器的用途,或者您可以使用包 mlrCPO,它具有可以重新采样的管道。
基本上,您使用 mlrCPO pipeop %>>%
定义管道。您放在学习者之前的每个 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)