Press "Enter" to skip to content

为机器学习模型选择正确的度量评估(第二部分)

作者:Alvira Swalin

 

编译:ronghuaiyang

 

导读

 

今天是第二部分,分类的度量。

 

本系列的第二部分将重点讨论分类指标

 

在第一部分中,我们讨论了回归中使用的一些重要指标、它们的优缺点和用例。这一部分将着重于分类中常用的度量标准,为什幺我们应该在上下文中选择其中的一些。

 

 

定义

 

在讨论每种方法的优缺点之前,让我们首先了解分类问题中使用的基本术语。如果你已经熟悉这些术语,可以跳过本节。

 

 

召回率或敏感性或TPR(真阳率):在全部真实阳性中正确识别为阳性的项目数量- TP/(TP+FN)

 

特异性或TNR(真阴率):在总的阴性中正确识别为阴性的项目数量- TN/(TN+FP)

 

精度:在确定为阳性的总项目中,正确确定为阳性的项目数量- TP/(TP+FP)

 

假阳率或I型错误:在全部真阴性中错误识别为阳性的项目数量- FP/(FP+TN)

 

假阴率或II类错误:在全部真阳性中错误识别为阴性的项目数量- FN/(FN+TP)

 

混淆矩阵

F1分数 :是给出的精度和召回率的调和平均值
F1 = 2 Precision Recall/(Precision + Recall)
准确性: 分类正确总项目的百分比- (TP+TN)/(N+P)

ROC-AUC Score

 

ROC-AUC分数的概率解释是,如果你随机选择一个正样本和一个负样本,根据分类器,正样本排在负样本前面的概率由AUC给出。在这里,排序是根据预测值的顺序确定的。

 

 

在数学上,它是由灵敏度曲线(TPR) vs FPR(1-specificity)下的面积来计算的。理想情况下,我们希望有高敏感性和高特异性,但在现实场景中,敏感性和特异性之间总是存在权衡。

 

ROC-AUC的一些重要特征是:

取值范围从0到1。而对于平衡数据,随机分类器的auc评分为0.5
ROC-AUC评分独立于设定的分类阈值,因为它只考虑每个预测的秩,不考虑其绝对值。F1分数不一样,在概率输出的情况下,它需要一个阈值。

Log-Loss

 

Log-loss是一种精度度量,它结合了概率置信度的思想,由以下二元类的表达式给出:

 

它考虑到你的预测的不确定性基于它与实际标签的差异。在最坏的情况下,假设所有观测值都是0.5。所以log-loss就变成-log(0.5)= 0.69。因此,我们可以说,考虑到实际概率,任何大于0.6的模型都是非常糟糕的。

 

案例1

 

Log-loss 和 ROC 和 F1的对比

 

 

考虑情形1(平衡数据),看起来模型1在预测绝对概率方面做得更好,而模型2在根据观测值的真实标签对其进行排序方面做得最好。让我们用实际分数来验证:

 

 

如果考虑log-loss,模型2给出log-loss的高值是最糟糕的,因为绝对概率与实际标签有很大的差异。但这与F1和AUC评分完全不一致,其中模型2的准确率为100%。此外,你还需要注意,随着阈值的不同,F1分数也在变化,默认阈值0.5更倾向于模型1而不是模型2。

 

由以上例子得出的推论(平衡数据集):如果你关心的是绝对概率差,那就用log-loss吧

如果你只关心最后的类预测,你不想调整阈值,去AUC评分
f1分数对阈值很敏感,在比较模型之前,你需要先对其进行优化

案例2

 

如何处理不均衡数据集?

 

 

这两种模型的唯一区别是它们对观测结果13和14的预测。模型1是在样本13(标签为0)的分类上做的更好,而模型2在样本14(标签为1)的分类上做的更好。我们的目标是看哪个模型实际捕获的不同分类不平衡类更好(样本很少的类别,这里是标签1)。在欺诈检测/垃圾邮件检测等问题,正样本很少,我们希望我们的模型能够正确地预测阳性类,因此我们有时会更喜欢那些能够对这些阳性标签进行分类的模型。

 

 

显然在这种情况下log-loss是失败的,因为根据log-loss,这两个模型的性能是相同的。这是因为log-loss函数是对称的,不区分类。

 

F1评分和ROC-AUC评分均优于模型2和模型1。我们可以用这两种方法来处理类不平衡。但我们还需要进一步研究,看看他们对待类别不平衡的方式有何不同。

 

 

在前面的例子中,我们看到正样本的标签很少。在第二个例子中,负样本标签很少。让我们看看F1分数和ROC-AUC如何区分这两种情况。

 

 

ROC-AUC score处理少量负标签的方式与处理少量正标签的方式相同。这里需要注意的一件有趣的事情是,F1分数对于模型3和模型4几乎是相同的,因为正标签的数量很大,它只关心正标签的错误分类。

 

从上面的例子中得出的推论:

如果你关系的是一个数量较少的类,而与它是正的还是负的无关,那幺选择ROC-AUC分数。

什幺时候用F1比ROC-AUC好?

 

当你的正类的数量很少,那幺F1分数更有意义。这是欺诈检测中常见的问题,因为正面标签很少。我们可以通过下面的例子来理解这个语句。

 

from sklearn import metrics
 import numpy as np
 
 y_true = np.concatenate((np.ones(100), np.zeros(900)))
 
 a = np.random.uniform(0.5,1, 5)
 b = np.random.uniform(0,0.5, 995)
 y_pred1 = np.concatenate((a,b))
 
 a = np.random.uniform(0.5,1, 90)
 b = np.random.uniform(0,0.5, 910)
 y_pred2 = np.concatenate((a,b))
 
 print(metrics.f1_score(y_true, y_pred1>0.5))
 print(metrics.f1_score(y_true, y_pred2>0.5))
 
 print(metrics.roc_auc_score(y_true, y_pred1))
 print(metrics.roc_auc_score(y_true, y_pred2))

 

我们可以看到,模型(1)在10K大小的数据集中预测100个真实阳性数据中的5个阳性,而另一个模型(2)预测100个真实阳性数据中的90个阳性。显然,在这种情况下,模型(2)比模型(1)做得更好。让我们看看F1分数和ROC-AUC分数是否能够捕捉到这种差异。

 

模型(1)F1评分= 2 (1) (0.1)/1.1 = 0.095

 

模型(2)F1评分= 2 (1) (0.9)/1.9 = 0.947

 

是的,F1分数的差异反映了模型的性能。

 

模型(1)的ROC-AUC = 0.5

 

模型(2)的ROC-AUC = 0.93

 

ROC-AUC也给模型1打了一个不错的分数,但这并不能很好地反映模型1的性能。因此,对于不平衡的数据集,在选择ROC-AUC时要非常小心。

 

对于多分类你应该用什幺样的度量?

 

我们还有另外三种类型的非二进制分类:

 

多类:分类任务有两个以上的类,使输入被分类为其中一个类,并且只能分为一个类。示例:将一组水果图像分成以下任意一类—苹果、香蕉和橙子。

 

多标签:将样本分类为一组目标标签。例如:将博客标记为一个或多个主题,如技术、宗教、政治等。标签是孤立的,它们之间的关系并不重要。

 

层次分类:每个类别都可以与类似的类别分组在一起,创建元类,这些元类又可以分组,直到我们到达根级别(包含所有数据的集合)。例如文本分类和物体分类。有关更多细节,请参考这个博客。

 

在本文中,我们将只讨论第一类。

 

 

正如你在上表中所看到的,我们大致有两种指标类型—微观平均和宏观平均,我们将讨论每种指标的优缺点。多类最常用的度量标准是F1分数、平均精度、log损失。目前还没有完善的针对多类的ROC-AUC评分。

 

多类的log-loss定义为:

 

 

在微观平均法中,将不同集合的系统的真阳性、假阳性和假阴性相加,然后应用它们得到统计数据。在宏观平均中,取系统在不同集合上的精度和召回率的平均值

 

如果存在类不平衡问题,最好使用微观平均值

 

英文原文:https://medium.com/usf-msds/choosing-the-right-metric-for-evaluating-machine-learning-models-part-2-86d5649a5428

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注