mlr3调用benchmark()时报错如何排查learner运行失败原因
故障排查步骤
第一步:定位出现问题的
task/learner/resampling组合
不要直接执行全局聚合,先提取所有基准测试的预测结果,筛选出存在响应值缺失的组合:# 提取所有预测对象 preds = bmr$predictions() # 检查每个预测结果是否存在缺失 has_na = sapply(preds, function(p) any(is.na(p$response))) # 输出有问题的组合在design表中的行索引 which(has_na)拿到索引后即可对应到具体的任务、学习器、重采样方案,缩小排查范围。
第二步:排查重采样分折的训练集特征异常
该问题90%以上的概率来自于某一折训练集中存在标准差为0的常量特征:你前置了po("scale")标准化节点,当特征在训练集内全部为同一个值时,标准化计算时分母(标准差)为0,会输出全量NaN,导致SVM、朴素贝叶斯等学习器训练失败,最终预测输出NA。
可以通过以下代码验证该问题:# 取第一个有问题的组合为例,i为上一步拿到的索引 task_i = design$task[[i]] resample_i = design$resampling[[i]] # 遍历该重采样的所有折,检查训练集数值特征标准差 num_feats = task_i$feature_types[type == "numeric", id] for (k in 1:resample_i$iters) { train_data = task_i$data(rows = resample_i$train_set(k)) const_feats = names(which(sapply(train_data[, ..num_feats], function(x) sd(x) == 0))) if (length(const_feats) > 0) { print(paste0("第",k,"折存在常量特征:", paste(const_feats, collapse = ","))) } }如果确认是该问题,修复方案为在预处理流水线的
po("scale")前增加po("removeconstants")节点,先自动删除训练集中的常量特征即可。第三步:单组复现验证其他边缘问题
如果排除常量特征问题,可以单独运行有问题的组合,复现故障定位根因:learner_i = design$learner[[i]] rr = resample(task_i, learner_i, resample_i) # 查看预测结果、训练日志确认问题 print(rr$prediction()$response) print(rr$learners[[1]]$errors)常见的其他边缘原因包括:
- 重采样分折极端不平衡,某类样本在训练集中完全缺失,导致分类器无法学习该类
- 学习器参数配置错误,比如误将分类学习器的目标设置为回归模式
- 分类特征存在训练集未出现、测试集独有的水平,导致预处理/预测失败
内容的提问来源于stack exchange,提问作者ds_col
相关产品推荐
相关产品推荐

