考虑具有以下混淆矩阵的三类分类问题。
cm_matrix =
predict_class1 predict_class2 predict_class3
______________ ______________ ______________
Actual_class1 2000 0 0
Actual_class2 34 1966 0
Actual_class3 0 0 2000
Multi-Class Confusion Matrix Output
TruePositive FalsePositive FalseNegative TrueNegative
____________ _____________ _____________ ____________
Actual_class1 2000 34 0 3966
Actual_class2 1966 0 34 4000
Actual_class3 2000 0 0 4000
我使用的公式是:
Accuracy Of Each class=(TP ./total instances of that class)
(基于此处答案的公式:Individual class accuracy calculation confusion)
Sensitivity=TP./TP+FN ;
在Matlab中的实现是:
acc_1 = 100*(cm_matrix(1,1))/sum(cm_matrix(1,:)) = 100*(2000)/(2000+0+0) = 100
acc_2 = 100*(cm_matrix(2,2))/sum(cm_matrix(2,:)) = 100*(1966)/(34+1966+0) = 98.3
acc_3 = 100*(cm_matrix(3,3))/sum(cm_matrix(3,:)) = 100*(2000)/(0+0+2000) = 100
sensitivity_1 = 2000/(2000+0)=1 = acc_1
sensitivity_2 = 1966/(1966+34) = 98.3 = acc_2
sensitivity_3 = 2000/2000 = 1 = acc_3
问题1)我的每个类别的准确性公式是否正确?为了计算每个类别的准确性,例如对于肯定类别,我应该将TP作为分子。同样,对于仅负数类的准确性,我应该在公式中考虑分子中的TN以获得准确性。相同的公式适用于二进制分类吗?我的实现正确吗?
问题2)我的灵敏度公式正确吗?那我怎么能得到与个人课堂准确性相同的答案?
答案 0 :(得分:1)
问题1的答案。似乎准确性仅用于二进制分类,请检查this link。 您可以在此站点上参考答案,但它也涉及二进制分类(即仅分类为2类)。您似乎有两个以上的类,在这种情况下,您应该尝试其他方法,或者对每个类进行一个“所有”的分类(对于每个类,解析对class_n和non_class_n的预测)。
问题2的答案。同一问题,此度量标准适用于二进制分类,这不是您的情况。
灵敏度公式为:
TP./(TP + FN)
准确性的公式是:
(TP)./(TP+FN+FP+TN)
请参阅文档here。
更新
如果您希望使用混淆矩阵,则可以:
对角线上的TP,在班级
FN类类别中所有值的总和。在函数getvalues
中,从函数声明开始计数行,然后检查第30和31行:
TP(i)=c_matrix(i,i);
FN(i)=sum(c_matrix(i,:))-c_matrix(i,i);
FP(i)=sum(c_matrix(:,i))-c_matrix(i,i);
TN(i)=sum(c_matrix(:))-TP(i)-FP(i)-FN(i);
如果应用精度公式,则需要在计算和简化之后得出:
accuracy = c_matrix(i,i) / sum(c_matrix(:))
为简化后获得的灵敏度:
sensitivity = c_matrix(i,i) / sum(c_matrix(i,:))
如果您想更好地理解,只需查看我发送给您的链接即可。
答案 1 :(得分:1)
问题1)我的每个类别的准确性公式是否正确?
否,您使用的公式用于灵敏度(调用)。见下文。
要计算每个单独类别的准确性,例如对于正类别,我应该将TP作为分子。同样,对于仅负数类的准确性,我应该在公式中考虑分子中的TN以获得准确性。相同的公式适用于二进制分类吗?我的实现正确吗?
精度是正确分类的实例数与实例总数之比。 TN或正确识别为 not 属于类的实例数也属于正确分类的实例。您不能简单地将它们排除在外。
准确性通常也仅用于评估所有类别的整个分类器,而不是单个类别。但是,您可以概括准确性公式以处理各个类别,就像here所做的那样,用于计算多类别分类器的平均分类准确性。 (另请参见referenced article。)
他们为每个类使用的公式是:
如您所见,它的准确性与通常的公式相同,但是我们仅考虑了各个类别的TP和TN分数(分母仍是观测值的总数)。将其应用于您的数据集,我们得到:
acc_1 = (2000+3966)/(2000+34+0+3966) = 0.99433
acc_2 = (1966+4000)/(1966+0+34+4000) = 0.99433
acc_3 = (2000+4000)/(2000+0+0+4000) = 1.00000
这至少在更直观的意义上讲,因为前两个类的实例分类错误,而第三个没有。这些措施是否真的有用是另一个问题。
问题2)我的灵敏度公式正确吗?
是的,灵敏度为:
TP / TP+FN
是正确识别出属于该类的实例与该实例中 实例总数的比率。在二元分类器中,默认情况下,您正在计算阳性分类的灵敏度。否定类别的敏感度是错误率(在维基百科文章中也称为未命中率或错误否定率),简单来说就是:
FN / TP+FN === 1 - Sensitivity
FN只不过是负面类的TP! (TP的含义也相反。)因此,很自然地将它扩展到所有类。
那我怎么能得到与个人课堂准确性相同的答案?
因为两者都使用相同的公式。
看看你的困惑矩阵:
cm_matrix =
predict_class1 predict_class2 predict_class3
______________ ______________ ______________
Actual_class1 2000 0 0
Actual_class2 34 1966 0
Actual_class3 0 0 2000
第1类的TP显然是2000
cm_matrix(1,1)
FN是该行中其他两列的总和。因此,TP + FN是第1行的总和
sum(cm_matrix(1,:)
这正是您用于准确性的公式。
acc_1 = 100*(cm_matrix(1,1))/sum(cm_matrix(1,:)) = 100*(2000)/(2000+0+0) = 100