mlr3自动调优+自定义重采样结合类别平衡时行ID错误求助
检查自定义重采样的行ID映射
自定义分组+分层的拆分逻辑容易出现索引错位,直接打印重采样实例的训练/测试索引,和原始任务的行ID做比对:# 查看第一折的训练/测试索引 resampling$instance$train[[1]] resampling$instance$test[[1]] # 对比原始任务的行ID task$row_ids()确认所有索引都是原始行ID的子集,没有出现超出范围或类型不匹配的情况。
验证GraphLearner的节点执行逻辑
classbalancing节点仅在训练阶段生效,要确保Graph的流程是classbalancing在前、模型在后,且没有在测试阶段误修改行ID。可以单独测试GraphLearner的预测流程:# 手动取一组测试行ID test_ids <- task$row_ids()[1:10] # 尝试预测 graph_learner$predict(task, row_ids = test_ids)如果这里报错,直接定位是classbalancing节点的配置问题;如果正常,再排查benchmark的重采样嵌套逻辑。
排查auto_tuner与GraphLearner的嵌套冲突
嵌套调优时,内部重采样的行ID可能和外部benchmark的重采样ID出现传递错误。先去掉auto_tuner,用纯GraphLearner跑benchmark:# 临时替换为无调优的GraphLearner learner <- as_learner(graph) benchmark(benchmark_grid(task, learner, resampling))如果此时不报错,说明问题出在auto_tuner的内部重采样与GraphLearner的交互上,需要检查auto_tuner的
resampling参数是否和外部重采样兼容(比如是否都遵循了PatientID分组约束)。确认行ID的类型一致性
医疗数据集的PatientID如果是字符串,要确保任务的行ID类型和重采样输出的索引类型一致:# 查看行ID类型 class(task$row_ids()) # 查看重采样输出的测试ID类型 class(resampling$instance$test[[1]])若类型不一致(比如一个是字符串、一个是整数),会导致mlr3无法匹配行ID,需要统一行ID类型(比如把字符串ID转成整数,或确保重采样拆分时保留字符串ID)。
简化用例缩小问题范围
用极小的数据集子集(比如10个Patient,每个Patient2-3个样本)重现问题,逐步移除自定义逻辑:先去掉分组拆分,只用分层;再去掉classbalancing;最后去掉auto_tuner,一步步定位是哪部分逻辑导致的行ID错误。
内容的提问来源于stack exchange,提问作者NDe

