基于预训练VGG19的四类分类任务中准确率计算异常问询
嘿,这个问题其实是多分类任务里很常见的误区,我来帮你理清楚根源和解决办法:
核心原因:二分类准确率公式不能直接套用到多分类场景
先明确你用的两个公式的本质:
你写的Eq1
sum(predictedLabels==testLabels)/numel(predictedLabels)是多分类任务准确率的标准计算方式——它统计所有样本中预测与真实标签完全匹配的比例,本质就是把每一类的「真正例(TP)」加起来,再除以总样本数,展开后是:Accuracy = (TP1 + TP2 + TP3 + TP4) / 总样本数这里的TP1是第1类被正确预测为第1类的样本数,以此类推。
而Eq3
(TP+TN)/(TP+TN+FP+FN)是二分类专属的准确率公式。在二分类里,TN(真负例)是明确的:不属于正类的样本被正确预测为负类的数量。但在4分类任务中,「负类」的定义完全模糊了——比如对第1类来说,TN是被正确预测为2、3、4类的样本吗?但如果强行把所有非TP的样本合并成TN+FP+FN,就会完全错误地统计,因为多分类里的FP和FN是针对每一类单独存在的,不能像二分类那样统一合并计算。
举个直观的小例子:假设总共有100个样本,每类25个。如果模型把第1类的10个样本错预测成第2类,第2类的5个样本错预测成第1类,其他样本都分类正确。用Eq1算准确率是(25+20+25+25)/100=95%;但如果硬套二分类的Eq3,你根本没法定义统一的TN,算出来的结果自然和Eq1对不上。
用混淆矩阵计算多分类准确率的正确姿势
对于你得到的4×4混淆矩阵confMat(行代表真实标签,列代表预测标签),正确的准确率计算应该是取混淆矩阵对角线元素的和,再除以总样本数,代码如下:
accuracy_from_confMat = sum(diag(confMat)) / sum(confMat(:));
这个结果和你用Eq1计算的结果会完全一致,因为对角线元素正好对应每一类的TP,加起来就是所有分类正确的样本数,除以总样本数就是标准的多分类准确率。
额外小贴士
如果之后需要计算每一类的精确率(Precision)、召回率(Recall),也要针对每一类单独计算:
- 第i类的精确率:
confMat(i,i)/sum(confMat(:,i))(预测为i类的样本中,真正属于i类的比例) - 第i类的召回率:
confMat(i,i)/sum(confMat(i,:))(真实属于i类的样本中,被正确预测的比例)
内容的提问来源于stack exchange,提问作者Suvidha

