作者:Alvira Swalin
编译:ronghuaiyang
导读
今天是第二部分,分类的度量。
本系列的第二部分将重点讨论分类指标
在第一部分中,我们讨论了回归中使用的一些重要指标、它们的优缺点和用例。这一部分将着重于分类中常用的度量标准,为什么我们应该在上下文中选择其中的一些。
定义
在讨论每种方法的优缺点之前,让我们首先了解分类问题中使用的基本术语。如果你已经熟悉这些术语,可以跳过本节。
召回率或敏感性或TPR(真阳率):在全部真实阳性中正确识别为阳性的项目数量- TP/(TP+FN)
特异性或TNR(真阴率):在总的阴性中正确识别为阴性的项目数量- TN/(TN+FP)
精度:在确定为阳性的总项目中,正确确定为阳性的项目数量- TP/(TP+FP)
假阳率或I型错误:在全部真阴性中错误识别为阳性的项目数量- FP/(FP+TN)
假阴率或II类错误:在全部真阳性中错误识别为阴性的项目数量- FN/(FN+TP)
- 混淆矩阵
- F1分数:是给出的精度和召回率的调和平均值
- F1 = 2PrecisionRecall/(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
本文为专栏文章,来自:AI公园,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/76102.html 。