计算 multi-class classification 的准确度
Calculating accuracy for multi-class classification
考虑具有以下混淆矩阵的三 class class化问题。
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)
(基于此处答案的公式:)
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) 我计算每个 class 的准确度的公式是否正确?为了计算每个人的准确度 class,对于正数 class,我应该将 TP 作为分子。同样,对于只有负 class 的准确性,我应该考虑公式中分子中的 TN 以提高准确性。相同的公式是否适用于二进制 classification?我的实现是否正确?
问题2)我的灵敏度公式正确吗?那我怎么会得到与个人 class 准确度相同的答案?
问题1的答案 accuracy好像只用在二进制class化,查this link。
您参考了此站点上的答案,但它还涉及二进制 classification(即仅 classification 为 2 classes)。您似乎有两个以上的 classes,在这种情况下,您应该尝试其他方法,或者对每个 class 进行一对一 class 化(对于每个 class,解析 class_n 和非_class_n) 的预测。
问题 2 的答案。 同样的问题,此措施适用于二进制 class化,但您的情况并非如此。
灵敏度的公式为:
TP./(TP + FN)
准确度公式为:
(TP)./(TP+FN+FP+TN)
请参阅文档 here。
更新
如果你想使用混淆矩阵,你有:
对角线上的 TP,在 class 的水平
FN class 列中所有值的总和。在函数 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,:))
如果您想更好地理解,请查看我发送给您的链接。
Question1) Is my formula for Accuracy of each class correct?
不,您使用的公式是针对灵敏度(召回率)的。见下文。
For calculating accuracy of each individual class, say for positive class I should take the TP in the numerator. Similarly, for accuracy of only the negative class, I should consider TN in the numerator in the formula for accuracy. Is the same formula applicable to binary classification? Is my implementation of it correct?
准确率是正确class化实例的数量与实例总数的比率。 TN,或者正确识别为 not 的实例数在 class 中,也是正确的 classified 实例。你不能简单地将它们排除在外。
准确性通常也仅用于评估所有 classes 的整个 classifier,而不是单个 classes。但是,您可以将精度公式概括为处理单个 classes,就像 here for computing the average classification accuracy for a multiclass classifier. (See also the referenced article 所做的那样。)
他们对每个 class 使用的公式是:
如你所见,它与通常的准确性公式相同,但我们只考虑了个体class的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
这至少更直观,因为前两个 classes 有错误的 classified 实例,而第三个没有。这些措施是否有用是另一个问题。
Question2) Is my formula for sensitivity correct?
是的,灵敏度给出为:
TP / TP+FN
这是在此class中正确识别的实例与class中实例总数的比率]。在二进制 class 运算符中,您默认计算正值 class 的灵敏度。负值 class 的灵敏度是错误率(在维基百科文章中也称为未命中率或假阴性率),简单来说就是:
FN / TP+FN === 1 - Sensitivity
FN无非就是TP对负class! (TP 的含义同样是相反的。)因此很自然地将它扩展到所有 classes,就像你所做的那样。
Then how come I am getting same answer as individual class accuracies?
因为您对两者使用相同的公式。
看看你的混淆矩阵:
cm_matrix =
predict_class1 predict_class2 predict_class3
______________ ______________ ______________
Actual_class1 2000 0 0
Actual_class2 34 1966 0
Actual_class3 0 0 2000
class 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
考虑具有以下混淆矩阵的三 class class化问题。
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)
(基于此处答案的公式:
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) 我计算每个 class 的准确度的公式是否正确?为了计算每个人的准确度 class,对于正数 class,我应该将 TP 作为分子。同样,对于只有负 class 的准确性,我应该考虑公式中分子中的 TN 以提高准确性。相同的公式是否适用于二进制 classification?我的实现是否正确?
问题2)我的灵敏度公式正确吗?那我怎么会得到与个人 class 准确度相同的答案?
问题1的答案 accuracy好像只用在二进制class化,查this link。 您参考了此站点上的答案,但它还涉及二进制 classification(即仅 classification 为 2 classes)。您似乎有两个以上的 classes,在这种情况下,您应该尝试其他方法,或者对每个 class 进行一对一 class 化(对于每个 class,解析 class_n 和非_class_n) 的预测。
问题 2 的答案。 同样的问题,此措施适用于二进制 class化,但您的情况并非如此。
灵敏度的公式为:
TP./(TP + FN)
准确度公式为:
(TP)./(TP+FN+FP+TN)
请参阅文档 here。
更新
如果你想使用混淆矩阵,你有:
对角线上的 TP,在 class 的水平
FN class 列中所有值的总和。在函数 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,:))
如果您想更好地理解,请查看我发送给您的链接。
Question1) Is my formula for Accuracy of each class correct?
不,您使用的公式是针对灵敏度(召回率)的。见下文。
For calculating accuracy of each individual class, say for positive class I should take the TP in the numerator. Similarly, for accuracy of only the negative class, I should consider TN in the numerator in the formula for accuracy. Is the same formula applicable to binary classification? Is my implementation of it correct?
准确率是正确class化实例的数量与实例总数的比率。 TN,或者正确识别为 not 的实例数在 class 中,也是正确的 classified 实例。你不能简单地将它们排除在外。
准确性通常也仅用于评估所有 classes 的整个 classifier,而不是单个 classes。但是,您可以将精度公式概括为处理单个 classes,就像 here for computing the average classification accuracy for a multiclass classifier. (See also the referenced article 所做的那样。)
他们对每个 class 使用的公式是:
如你所见,它与通常的准确性公式相同,但我们只考虑了个体class的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
这至少更直观,因为前两个 classes 有错误的 classified 实例,而第三个没有。这些措施是否有用是另一个问题。
Question2) Is my formula for sensitivity correct?
是的,灵敏度给出为:
TP / TP+FN
这是在此class中正确识别的实例与class中实例总数的比率]。在二进制 class 运算符中,您默认计算正值 class 的灵敏度。负值 class 的灵敏度是错误率(在维基百科文章中也称为未命中率或假阴性率),简单来说就是:
FN / TP+FN === 1 - Sensitivity
FN无非就是TP对负class! (TP 的含义同样是相反的。)因此很自然地将它扩展到所有 classes,就像你所做的那样。
Then how come I am getting same answer as individual class accuracies?
因为您对两者使用相同的公式。
看看你的混淆矩阵:
cm_matrix =
predict_class1 predict_class2 predict_class3
______________ ______________ ______________
Actual_class1 2000 0 0
Actual_class2 34 1966 0
Actual_class3 0 0 2000
class 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