平衡精度分数和准确率分数的区别

6
我正在使用sklearn.metrics中的balanced_accuracy_score和accuracy_score两种指标。根据文档,这两个指标是相同的,但在我的代码中,前者给出了96%,而后者给出了97%,而来自训练的准确度为98%。
您能否向我解释一下三种准确度之间的区别以及每种准确度是如何计算的?
注意:该问题是一个三类多分类问题。
我已经附上了代码示例。
准确度为98%。
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.00001),
              metrics=['accuracy'])

准确率为96%

from sklearn.metrics import balanced_accuracy_score
balanced_accuracy_score(all_labels, all_predications)

准确率为97%

from sklearn.metrics import accuracy_score
accuracy_score(all_labels, all_predications)

你忘记分享你的代码了,这会使得复现你的问题变得更加容易。 - Nico Haase
我已经添加了代码示例。 - s.ali
2个回答

14
据我理解,(不知道 all_labels 和 all_predictions 是在哪运行的),但你的问题是关于在样本外预测中,balanced_accuracy_scoreaccuracy_score 之间的差异是由于前者函数的平衡操作引起的。 accuracy_score 只返回你正确预测的标签百分比(例如有 1000 个标签,你预测了 980 个正确,你得到 98% 的得分)。
然而balanced_accuracy_score 的工作方式不同,它返回每个类别的平均准确度,这是一种不同的度量方法。假设你的1000个标签来自2个类别,其中第1类有750个观察值,第2类有250个观察值。如果你误判了每个分类10次,那么你在第1类中的准确率为740/750=98.7%,第2类中的准确率为240/250=96%。balanced_accuracy_score 然后将返回(98.7%+96%)/2 = 97.35%。因此,我认为该程序根据文档按预期工作。

1
奇怪的是,balanced_accuracy_score 的文档说它是 召回率 的平均值,我认为这应该是一个错误。 - Michael
1
我猜这取决于你对召回率的定义。在Sklearn的在线指南中,他们引用了Mosley(2013)(https://lib.dr.iastate.edu/etd/13537),鉴于该作者对召回率的定义,`balanced_accuracy_score`计算似乎是准确的。不过,你也可以使用其他加权规则,而不仅仅是将每个类别的召回率之和除以所有类别的数量。 - seulberg1

7

准确率(Accuracy)= 真正 + 真负 / (真正 + 真负 + 假正 + 假负)对于不平衡的类别效果不佳。

因此,我们可以使用平衡准确率(Balanced Accuracy)= TPR+TNR/2

TPR= true positive rate = 真正 / (真正 + 假负):也称为“敏感度”

TNR = true negative rate = 真负 / (真负 + 假正):也称为“特异度”

平衡准确率与ROC AUC得分几乎相同。

链接:

1 https://zh.wikipedia.org/wiki/精度和回归

2 https://scikit-learn.org/stable/modules/generated/sklearn.metrics.balanced_accuracy_score.html#sklearn.metrics.balanced_accuracy_score

3 https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html


我不相信平衡精度与AUC几乎相同。对于我的数据来说,AUC是0.75,但平衡精度仅为0.54。 - iggy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接