使用mlr库做不平衡分类时fbeta对象未找到及混淆矩阵异常问题
不平衡分类任务中的f-beta指标问题及混淆矩阵异常排查
问题描述
- 使用
mlr库设置measures=fbeta时触发错误:Error in checkMeasures(measures, learner) : object 'fbeta' not found - 数据集共150000条实例,但测试集混淆矩阵仅显示149887条,实例数缺失:
> confusionMatrix(xgpred$data$response,xgpred$data$truth) [,1] [,2] [1,] 0 0 [2,] 0 149887 - 自行编写了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
相关产品推荐
相关产品推荐

