混淆矩阵出现多余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
相关产品推荐
相关产品推荐

