mlr3嵌套CV基准测试中外环样本预测等结果提取技术问询
mlr3嵌套CV提取关键结果的解决方案
核心问题分析
你遇到的outer_learners返回NULL,是因为默认基准测试配置不会保存外环训练好的模型,需要显式开启模型存储;同时筛选最优内环模型需要结合内环验证结果来选择。
步骤1:调整基准测试配置,开启模型存储
在创建基准测试时,必须设置store_models = TRUE,才能保留外环训练模型及内环的相关结果。
示例代码调整:
library(mlr3) library(mlr3proba) library(mlr3learners) library(mlr3benchmark) # 加载并预处理lung数据集 task = tsk("lung") task$set_col_roles("inst", "ignore") # 定义生存学习器(以Cox模型为例) learner = lrn("surv.coxph") # 定义嵌套CV结构:外环5折,内环3折 inner_resampling = rsmp("cv", folds = 3) outer_resampling = rsmp("cv", folds = 5) # 构建基准测试设计 design = benchmark_grid( tasks = task, learners = learner, resamplings = outer_resampling ) # 运行基准测试,开启模型存储 bmr = benchmark(design, store_models = TRUE)
步骤2:提取外环样本的分布预测与linear predictors
通过bmr$score()获取所有外环折的结果,从PredictionSurv对象中提取所需信息:
# 获取外环所有折的评分结果 scores = bmr$score() # 遍历每个外环折提取预测数据 for (i in seq_len(nrow(scores))) { pred = scores$prediction[[i]] # 提取linear predictors(Cox模型的线性预测值) lp_values = pred$lp # 提取特定时间点的事件概率(以时间点100为例) surv_prob = pred$distr$survival(100) event_prob = 1 - surv_prob # 可将结果存入数据框或进行后续处理 # ... }
步骤3:提取内环训练的baseline hazard并筛选最优模型
内环的模型和验证结果需从外环模型的嵌套resampling属性中获取:
# 遍历每个外环折的训练模型 for (i in seq_len(nrow(scores))) { outer_learner = scores$learner[[i]] # 获取内环交叉验证的结果 inner_res_results = outer_learner$model$resampling$result # 筛选最优内环模型:比如选择验证集C-index最高的模型 best_inner_idx = which.max(inner_res_results$surv.cindex) best_inner_learner = outer_learner$model$learners[[best_inner_idx]] # 提取baseline hazard(Cox模型的基线风险) baseline_hazard = best_inner_learner$model$basehaz print(baseline_hazard) }
关键注意事项
- 确认使用的学习器支持返回
lp和distr属性,surv.coxph等标准生存学习器均支持,其他学习器需提前验证。 - 若同时测试多个学习器,可在
benchmark_grid中添加多个学习器,后续通过learner_id字段区分结果。 store_models = TRUE会增加内存占用,处理大数据集时需注意内存限制。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

