You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在mlr3tuning嵌套重采样中实现无信息泄露的缺失值插补?

在mlr3tuning嵌套重采样中避免缺失值插补的信息泄露

实现方案(符合mlr3原生流程,无信息泄露)

mlr3的Pipeline系统天然支持在重采样过程中隔离训练集与测试集的插补逻辑,不需要手动拆分数据后分别插补。以下是具体实现步骤:

  1. 构建插补+模型的Pipeline
    用mlr3pipelines的算子组合缺失值插补与模型训练,确保插补规则仅在训练阶段拟合,预测阶段直接复用训练阶段的统计量:

    library(mlr3)
    library(mlr3tuning)
    library(mlr3pipelines)
    
    # 加载带缺失值的示例任务
    task = tsk("pima")
    
    # 构建Pipeline:数值特征中位数插补 → 分类特征众数插补 → 决策树模型
    graph = po("imputemedian", affect_columns = selector_type("numeric")) %>>%
      po("imputemode", affect_columns = selector_type("factor")) %>>%
      po("learner", learner = lrn("classif.rpart"))
    
    # 转换为可用于重采样的Learner对象
    learner = GraphLearner$new(graph)
    
  2. 配置嵌套重采样(含调优)
    如果需要超参数调优,设置内层调优逻辑和外层重采样策略:

    # 内层调优用的重采样策略
    inner_resampling = rsmp("holdout")
    # 定义调优空间(以决策树的cp参数为例)
    search_space = ps(cp = p_dbl(lower = 0.01, upper = 0.1))
    # 选择调优器
    tuner = tnr("grid_search", resolution = 10)
    
    # 构建带调优的Learner
    tuned_learner = TunedLearner$new(
      learner = learner,
      resampling = inner_resampling,
      measure = msr("classif.acc"),
      search_space = search_space,
      tuner = tuner
    )
    
    # 外层重采样策略(10折交叉验证)
    outer_resampling = rsmp("cv", folds = 10)
    
  3. 运行嵌套重采样并评估结果

    # 执行嵌套重采样,保存模型以便后续检查
    rr = resample(task, tuned_learner, outer_resampling, store_models = TRUE)
    # 输出整体性能指标
    rr$aggregate()
    

你可能忽略的关键要点

  • 手动拆分后单独插补测试集存在风险:你提到的“分别对训练集和测试集插补”如果是指用测试集自身的统计量插补,会引入信息泄露(测试集的统计属于模型不应接触的未来信息),导致性能估计偏乐观。mlr3的Pipeline默认用训练集的插补规则处理测试集,这才是正确的无泄露做法。
  • mlr3重采样框架自动隔离数据:无论是外层还是内层重采样,每个fold的训练阶段与预测阶段完全隔离,插补算子只会在训练集上拟合统计量(如中位数、众数),预测时直接套用该规则处理测试集,天然避免信息泄露。
  • 无需手动干预数据拆分:mlr3的resample()函数会自动处理外层循环的train/holdout拆分、插补、训练、预测全流程,不需要手动重复拆分逻辑。

内容的提问来源于stack exchange,提问作者googleplex101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:24:19