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

使用mlr库做不平衡分类时fbeta对象未找到及混淆矩阵异常问题

不平衡分类任务中的f-beta指标问题及混淆矩阵异常排查

问题描述

  1. 使用mlr库设置measures=fbeta时触发错误:
    Error in checkMeasures(measures, learner) : object 'fbeta' not found
    
  2. 数据集共150000条实例,但测试集混淆矩阵仅显示149887条,实例数缺失:
    > confusionMatrix(xgpred$data$response,xgpred$data$truth)
         [,1]   [,2]
    [1,]    0      0
    [2,]    0 149887
    
  3. 自行编写了f-beta度量函数,需验证正确性:
    fbeta = makeMeasure(id = "fbeta", minimize = FALSE, best = 1, worst = 0,
                        properties = c("classif", "req.pred", "req.truth"),
                        name = "Fbeta measure",
                        note = "Defined as: (1+beta^2) * tp/ (beta^2 * sum(truth == positive) + sum(response == positive))",
                        fun = function(task, model, pred, feats, extra.args) {
                          beta = 1
                          beta = beta^2
                          truth = pred$data$truth
                          response = pred$data$response
                          positive = pred$task.desc$positive
                          (1+beta) * measureTP(truth, response, positive) /
                            (beta * sum(truth == positive) + sum(response == positive))
                        }
    )
    

问题解决

1. fbeta未找到的错误修复

mlr包中没有内置名为fbeta的度量对象,可通过以下两种方式解决:

  • 使用内置F1度量:若你的beta值为1,直接替换为measures = f1即可,f1是mlr内置的分类度量。
  • 验证并优化自定义f-beta函数:你编写的函数核心公式是正确的,但存在变量冗余且不支持自定义beta值。优化后的函数如下(支持自定义beta参数):
    fbeta = makeMeasure(
      id = "fbeta", 
      minimize = FALSE, 
      best = 1, 
      worst = 0,
      properties = c("classif", "req.pred", "req.truth"),
      name = "F-beta Measure",
      note = "加权F度量,可通过extra.args自定义beta值,公式符合标准F-beta定义",
      extra.args = list(beta = 1),
      fun = function(task, model, pred, feats, extra.args) {
        beta_val = extra.args$beta
        beta_sq = beta_val^2
        truth = pred$data$truth
        response = pred$data$response
        positive = pred$task.desc$positive
        tp = measureTP(truth, response, positive)
        true_pos_total = sum(truth == positive)
        pred_pos_total = sum(response == positive)
        (1 + beta_sq) * tp / (beta_sq * true_pos_total + pred_pos_total)
      }
    )
    
    定义完成后,在tuneParams中即可正常使用measures = fbeta。

2. 混淆矩阵实例数缺失的排查

出现实例数不足的情况,可从以下方向排查:

  • 测试集数据缺失:先检查cbind(x_test,y_test)的原始行数是否为150000,再用getTaskSize(testtask)查看任务实际包含的样本数。若两者不一致,说明创建任务时自动过滤了含NA的样本,可提前处理NA值:
    # 示例:用中位数填充数值型NA,再删除剩余NA
    x_test <- impute(x_test, classes = list(numeric = imputeMedian()))
    test_data <- na.omit(cbind(x_test, y_test))
    testtask <- makeClassifTask(data = test_data, target = "DEFAULT", positive = 1)
    
  • 预测样本丢失:检查nrow(xgpred$data)与getTaskSize(testtask)是否一致,若不一致,查看xgpred$warn字段是否有预测警告,排查无法预测的样本。
  • 混淆矩阵显示异常:当前混淆矩阵仅显示正类结果,说明模型所有预测都输出了1(不平衡分类中模型偏向多数类的常见情况)。需确保测试任务与训练任务的positive参数一致,避免显示偏差:
    testtask <- makeClassifTask(data = cbind(x_test,y_test), target = "DEFAULT", positive = 1)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:55:14