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


春风助手
2024-12-24 02:51:09 (2月前)

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

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

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


  1. 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(或进行归因)?

2 条回复
  1. 1# 只怕再见是故人 | 2020-08-10 09-58

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

    1. library(mlrCPO)
    2. surv.task <- mlr::lung.task
    3. surv.measures = list(cindex)
    4. ridge.lrn <- makeLearner(cl="surv.cvglmnet", id = "ridge", predict.type="response", alpha = 0, nfolds=5)
    5. cboostcv.lrn <- makeLearner(cl="surv.cv.CoxBoost", id = "CoxBoostCV", predict.type="response")
    6. my_pipeline <- cpoScale() %>>% cpoDummyEncode()
    7. ridge.lrn <- my_pipeline %>>% ridge.lrn
    8. cboostcv.lrn <- my_pipeline %>>% cboostcv.lrn
    9. outer = makeResampleDesc("RepCV", reps=2, folds=5, stratify=TRUE)
    10. learners = list(ridge.lrn, cboostcv.lrn)
    11. bmr = benchmark(learners, surv.task, outer, surv.measures, show.info = TRUE)
登录 后才能参与评论