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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:04