多分类混淆矩阵下K-NN模型二类Accuracy计算正确性确认
关于多分类混淆矩阵中类别级Accuracy计算的验证与实现建议
你自学机器学习还手动啃混淆矩阵算指标,这认真劲儿必须点个赞!先给你吃个定心丸:你对A类和B类的Accuracy计算方法完全正确!
为什么你的计算逻辑是对的?
在多分类场景下计算单个类别的二分类指标(比如Accuracy),核心思路就是把当前类别当作「正类」,剩下所有类别统一当作「负类」,你对tp、fp、tn、fn的定义完美契合这个规则:
tp:该类别被正确分类的样本数(混淆矩阵中对应行对应列的元素)fp:其他类别被错误归类到该类的样本数(对应列中除了tp之外的所有元素之和)fn:该类别被错误分到其他类的样本数(对应行中除了tp之外的所有元素之和)tn:既不属于该类,也没被错误分到该类的样本数(整个混淆矩阵的总样本数减去tp+fp+fn,这个方法比手动加所有元素更不容易出错)
小修正:tn的简化计算
你手动计算tn的时候出现了小失误,比如B类的tn其实应该是总样本数(4768)减去tp(25)+fp(2)+fn(4),也就是4768-31=4737,而不是你算的4752——不过这只是计算失误,核心方法逻辑没问题!
自动化计算的代码实现
为了避免手动计算的误差,你可以用Python结合numpy快速实现所有类别的指标计算,代码如下:
import numpy as np # 定义你的混淆矩阵 confusion_matrix = np.array([ [238, 1, 2, 0, 41, 11, 0], [0, 25, 0, 0, 3, 1, 0], [21, 1, 32, 0, 17, 4, 0], [0, 0, 0, 7, 9, 3, 0], [7, 0, 0, 0, 3633, 8, 0], [44, 0, 4, 1, 397, 256, 1], [4, 0, 0, 0, 7, 2, 3] ]) class_names = ['A', 'B', 'C', 'D', 'E', 'F', 'G'] # 定义计算单个类别Accuracy的函数 def calculate_class_accuracy(conf_mat, class_index): tp = conf_mat[class_index, class_index] # 计算fp:该列所有元素和减去tp fp = conf_mat[:, class_index].sum() - tp # 计算fn:该行所有元素和减去tp fn = conf_mat[class_index, :].sum() - tp total_samples = conf_mat.sum() tn = total_samples - tp - fp - fn accuracy = (tp + tn) / total_samples return accuracy # 遍历所有类别计算并输出结果 for idx, name in enumerate(class_names): acc = calculate_class_accuracy(confusion_matrix, idx) print(f"{name}类Accuracy: {acc:.2f}")
额外小提示
多分类任务中,大家更常关注Precision(精确率)、Recall(召回率)、F1-Score这些指标,但如果你确实需要类别级的Accuracy,你的方法完全是标准操作~之前找不到相关资料可能是因为大多数教程更聚焦于宏观/微观/加权的整体指标,但单个类别的二分类转化计算是完全合理的。
内容的提问来源于stack exchange,提问作者Chinmay Nayak




