在平衡数据集中AUC高而准确率低的原因

19

给定一个平衡的数据集(两个类别的大小相同),将其放入SVM模型中,我得到了一个高的AUC值(约为0.9),但低准确率(约为0.5)。

我完全不知道为什么会发生这种情况,有人能为我解释一下吗?


2
你能绘制混淆矩阵吗? - Alvaro Silvino
顺便说一句,我的第一个想法是你误导了正确的标签。尝试绘制ROC曲线,可能会注意到AUC将0猜测为1,反之亦然... - Alvaro Silvino
答案有帮助吗? - Alvaro Silvino
4个回答

15
ROC曲线偏向于正类。当分类器在正类上表现良好(高AUC),而误判负类的情况较多时(或真负样本数量较少),就会出现AUC高而准确率低的情况。为什么训练过程导致分类器预测性能差,这个问题具体取决于您的问题/数据和所使用的分类方法。ROC分析告诉您正类样本与其他类别的区分度如何,而预测准确率则提示您分类器的实际性能。

关于ROC分析

ROC分析的一般背景是二元分类,其中分类器将一个集合中的元素分配到两个组中。这两个类通常被称为“阳性”和“阴性”。在这里,我们假设分类器可以归结为以下功能行为:

def classifier(observation, t):
    if score_function(observation) <= t: 
        observation belongs to the "negative" class
    else:           
        observation belongs to the "positive" class

分类器的核心是得分函数,将观察结果转换为数值,衡量观察结果与正类的亲和度。在这里,得分函数包括规则集、数学函数、权重和参数,以及所有使分类器良好的创意。例如,在逻辑回归分类中,得分函数的一个可能选择是估计观察结果x属于正类的概率p(x)的逻辑函数。
最后,分类器通过将计算出的得分与决策阈值(或预测截止值)t进行比较,将其转换为二进制类别分配。
给定分类器和固定的决策阈值t,我们可以计算出给定观察结果x的实际类别预测y_p。为了评估分类器的能力,将类别预测y_p与验证数据集的真实类别标签y_t进行比较。如果y_p和y_t匹配,则称为真正例TP或真负例TN,具体取决于y_p和y_t的值;如果y_p和y_t不匹配,则称为假正例FP或假负例FN。
我们可以将此应用于整个验证数据集,并计算TPs、TNs、FPs和FNs的总数,以及真正例率(TPR)和假正例率(FPR),其定义如下:
TPR = TP / P = TP / (TP+FN) = number of true positives / number of positives
FPR = FP / N = FP / (FP+TN) = number of false positives / number of negatives

请注意,TPR通常被称为“灵敏度”,而FPR等同于1-特异性。
相比之下,“准确率”被定义为所有正确标记的案例与总案例数的比率:
accuracy = (TP+TN)/(Total number of cases) = (TP+TN)/(TP+FP+TN+FN)

给定一个分类器和一个验证数据集,我们可以评估不同决策阈值t下的真正例率TPR(t)和假正例率FPR(t)。然后,绘制FPR(t)与TPR(t)的曲线可以得到接收者操作特征(ROC)曲线。以下是一些使用roc-utils*在Python中绘制的样本ROC曲线。

Exemplary ROC curves

将决策阈值t视为可以在训练过程结束时进行调整的最后一个自由参数。ROC分析提供了查找最佳截断t*的方法(例如,Youden指数、协同性、距离最优点)。此外,我们可以通过ROC曲线检验分类器如何区分“正”类和“负”类样本:尝试理解FPR和TPR如何随着t值增加而改变。在第一种极端情况下(使用非常小的t值),所有样本都被归为“正”类,因此没有真负样本(TN=0),因此FPR=TPR=1。通过增加t,FPR和TPR逐渐减少,直到我们达到第二种极端情况,即将所有样本分类为负面,没有一个样本是正面:TP=FP=0,因此FPR=TPR=0。在这个过程中,我们从ROC曲线的右上角开始,逐渐移动到左下角。在评分函数能够完美地分离样本并导致完美分类器的情况下,ROC曲线通过最优点FPR(t)=0和TPR(t)=1(参见下图左侧)。在另一种极端情况下,评分分布对于两个类别都相同,导致随机翻硬币分类器,ROC曲线沿对角线移动(参见下图右侧)。

Extreme ROC curves

很不幸,我们几乎不可能找到一个完美的分类器,达到ROC曲线上的最优点(0,1)。但是我们可以尽可能接近它。
ROC曲线下面积(AUC)试图捕捉这个特征。它是衡量分类器区分两个类别的能力的一种指标。它的值在1和0之间变化。对于完美的分类器,AUC为1。将随机类标签分配给输入数据的分类器将产生0.5的AUC。
*免责声明:我是roc-utils的作者

1
而且,如果您想要更详细的答案,请在这里查看[https://stats.stackexchange.com/questions/90659]! - normanius
在例如ExtraTrees的二进制情况下,这仍然适用吗?由于AUC对于“正”类和“负”类都是相同的(不是吗?),因此我会假设(在数据集平衡的假设下)AUC将给出与准确度相同的结果。 - CutePoison
难道 TPR 不应该是:“真正例的数量 / 标签为正的总次数”吗? - snowneji
请纠正我如果我错了,假设阈值为0.5不能很好地分离两个类别,但是0.7可以完美地分离它们。那么我们将有AUC=1,但(由于大多数分类器仅使用最高“概率”对类别进行分类),您可能会得到低准确性但高AUC的结果。如果您将类别的分类更改为0.7而不是0.5的阈值,我们是否也应该具有高准确性(在这种情况下等于1)? - CutePoison

3
我猜你在计算roc曲线时错读了正确的类别...这解释了低准确率和高(错误计算的)AUC。
很容易看出,如果两个分类器的ROC曲线交叉,使用AUC比较它们可能会产生误导。分类器A可能会产生比B更高的AUC,而B在您可能实际使用分类器的大多数阈值下表现更好。事实上,实证研究表明,常见分类器的ROC曲线交叉是非常普遍的。还有更深层次的原因,说明AUC不连贯,因此不是一个合适的度量方法(参见下面的参考文献)。

http://sandeeptata.blogspot.com/2015/04/on-dangers-of-auc.html


2
这种行为的另一个简单解释是,你的模型实际上非常好——只是其最终用于进行二元预测的阈值很糟糕。
我在进行二元图像分类任务的卷积神经网络中遇到了这个问题。例如,考虑有4个标签为0、0、1、1的样本。假设你的模型像这样为这四个样本创建连续的预测:0.7、0.75、0.9和0.95。
我们认为这是一个好的模型,因为高值(>0.8)预测类1,低值(<0.8)预测类0。因此,ROC-AUC为1。请注意,我使用了0.8的阈值。然而,如果你为这些预测使用固定且糟糕选择的阈值,比如0.5,这正是我们有时对模型输出强加的情况,那么所有4个样本的预测都将是类1,这导致准确率为50%。
请注意,大多数模型优化的不是准确性,而是某种损失函数。在我的CNN中,训练更多的轮次就解决了这个问题。
当你将连续的模型输出转换为二元预测时,请确保知道自己在做什么。如果你不知道要为给定的ROC曲线使用哪个阈值,请查看Youden指数或找到代表ROC曲线中“最靠上、最靠左”点的阈值。

如果您正在使用神经网络,您需要学习阈值。 - Union find

0

如果每次都发生这种情况,可能是您的模型不正确。 从kernel开始,您需要更改并尝试使用新集合来验证模型。 每次查看混淆矩阵并检查TN和TP区域。模型应该无法检测到其中之一。


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