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

混淆矩阵出现多余0行求助:如何删除顶部0行保证计算准确

解决混淆矩阵边际顶部全0行的问题

嘿,我之前处理分类模型性能评估时也碰到过一模一样的问题!顶部那行全0大概率是实际标签和预测标签的因子水平不匹配导致的——比如你的实际不良贷款标签里根本没有0这个类别,但预测结果的因子水平却包含了它,或者反过来。下面给你一步步的解决思路:

第一步:先排查标签类别是否一致

先看看你的实际值和预测值各自的类别分布,确认是不是有一方多了不存在的类别:

# 查看实际标签的类别及数量
table(actual.oversamp)
# 查看预测标签的类别及数量
table(predicted.oversample)

如果发现其中一个有另一个没有的水平(比如实际值只有1和2,预测值却有0),那先把两者的类别统一:

# 强制让预测值的类别和实际值完全一致
predicted.oversample <- factor(predicted.oversample, levels = levels(actual.oversamp))

第二步:重新生成带边际的混淆矩阵

类别统一后,再重新生成混淆矩阵并添加边际,这时候应该就不会出现全0的冗余行了:

# 生成基础混淆矩阵,给行列命名更清晰
conf_mat <- table(Actual = actual.oversamp, Predicted = predicted.oversample)
# 添加边际(行/列的合计值)
conf_mat_with_margins <- addmargins(conf_mat)

如果还是有全0行?手动精准移除

要是确认那行确实是完全多余的(比如是某个不存在的类别),可以直接通过索引或者判断来删除:

# 方式1:如果确定是第一行全0,直接移除
conf_mat_cleaned <- conf_mat_with_margins[-1, ]

# 方式2:自动检测所有全0行并移除(更稳妥)
zero_rows <- which(rowSums(conf_mat_with_margins) == 0)
if(length(zero_rows) > 0){
  conf_mat_cleaned <- conf_mat_with_margins[-zero_rows, ]
}

额外小技巧:用caret包简化操作

要是你经常做模型评估,推荐用caret包的confusionMatrix()函数,它会自动处理类别匹配的问题,还能直接输出准确率、召回率等一堆性能指标,省很多事:

library(caret)
# 先把两者都转成因子,确保水平一致
actual.oversamp <- factor(actual.oversamp)
predicted.oversample <- factor(predicted.oversample, levels = levels(actual.oversamp))
# 生成带边际的混淆矩阵及性能报告
cm <- confusionMatrix(predicted.oversample, actual.oversamp)
# 查看混淆矩阵(包含边际)
print(cm$table)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:03:07