[英]Interpreting AUC, accuracy and f1-score on the unbalanced dataset
我试图了解在数据集不平衡的情况下,AUC 是如何比分类准确度更好的指标。
假设一个数据集包含 3 个类的 1000 个示例,如下所示:
a = [[1.0, 0, 0]]*950 + [[0, 1.0, 0]]*30 + [[0, 0, 1.0]]*20
显然,这个数据是不平衡的。
一个天真的策略是预测属于第一个 class 的每个点。
假设我们有一个具有以下预测的分类器:
b = [[0.7, 0.1, 0.2]]*1000
使用列表a
中的真实标签和列表b
中的预测,分类准确率为 0.95。
所以有人会认为 model 在分类任务上确实做得很好,但这并不是因为 model 预测了一个 class 中的每个点。
因此,建议使用 AUC 指标来评估不平衡的数据集。
如果我们使用 TF KerasAUC度量来预测 AUC,我们得到 ~0.96。
如果我们通过设置b=[[1,0,0]]*1000
使用 sklearn f1-score指标预测 f1-score,我们得到 0.95。
现在我有点困惑,因为所有指标(准确度、AUC 和 f1 分数)都显示出很高的值,这意味着 model 非常擅长预测任务(这里不是这种情况)。
我在这里遗漏了哪一点以及我们应该如何解释这些值?
谢谢。
您很可能使用average='micro'
参数来计算 F1 分数。 根据docs ,将'micro'
指定为平均 startegy 将:
通过计算总的真阳性、假阴性和假阳性来全局计算指标。
在保证每个测试用例准确分配给一个 class 的分类任务中,计算微 F1 分数相当于计算准确度分数。 只需检查一下:
from sklearn.metrics import accuracy_score, f1_score
y_true = [[1, 0, 0]]*950 + [[0, 1, 0]]*30 + [[0, 0, 1]]*20
y_pred = [[1, 0, 0]]*1000
print(accuracy_score(y_true, y_pred)) # 0.95
print(f1_score(y_true, y_pred, average='micro')) # 0.9500000000000001
您基本上计算了两次相同的指标。 通过指定average='macro'
,将首先独立计算每个 label 的 F1 分数,然后取平均值:
print(f1_score(y_true, y_pred, average='macro')) # 0.3247863247863248
如您所见,整体 F1-score 取决于平均策略,小于 0.33 的宏观 F1-score 是模型在预测任务中存在缺陷的明确指标。
由于 OP 询问何时选择哪种策略,并且我认为它对其他人也可能有用,因此我将尝试详细说明这个问题。
scikit-learn
实际上为支持多类和多标签分类任务的平均值的指标实现了四种不同的策略。 方便的是, classification_report
将返回所有申请给定分类任务的Precision 、 Recall和F1-score :
from sklearn.metrics import classification_report
# The same example but without nested lists. This avoids sklearn to interpret this as a multilabel problem.
y_true = [0 for i in range(950)] + [1 for i in range(30)] + [2 for i in range(20)]
y_pred = [0 for i in range(1000)]
print(classification_report(y_true, y_pred, zero_division=0))
######################### output ####################
precision recall f1-score support
0 0.95 1.00 0.97 950
1 0.00 0.00 0.00 30
2 0.00 0.00 0.00 20
accuracy 0.95 1000
macro avg 0.32 0.33 0.32 1000
weighted avg 0.90 0.95 0.93 1000
根据对 class 分布的重视程度,它们都提供了不同的视角。
micro
平均是一种全局策略,基本上忽略了类别之间的区别。 如果某人真的只对真阳性、假阴性和假阳性方面的整体分歧感兴趣,并且不关心班级内的差异,这可能是有用或合理的。 如前所述,如果潜在问题不是多标签分类任务,这实际上等于准确度得分。 (这也是为什么classification_report
报告 function 返回accuracy
而不是micro avg
的原因)。
作为一种策略的macro
平均值将分别计算每个 label 的每个指标,并返回它们的未加权平均值。 如果每个 class 都具有同等重要性,并且结果不应偏向于数据集中的任何类,则这是合适的。
weighted
平均值还将首先分别计算每个 label 的每个指标。 但平均值是根据班级的支持度加权的。 如果类的重要性与其重要性成正比,则这是可取的,即代表性不足的 class 被认为不太重要。
samples
平均值仅对多标签分类有意义,因此在此示例中classification_report
报告不返回,此处也不讨论;)
因此,平均策略的选择和信任的结果实际上取决于类的重要性。 我是否关心 class 的差异(如果没有 -> 微观平均),如果是,那么所有类别都同样重要(如果是 -> 宏观平均)还是 class 具有更高的支持更重要(--> 加权平均) .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.