介绍
我最近发布了一篇最具挑战性的文章,关于多类分类(MC)的主题。我所面临的困难主要是由于我必须学习和解释的分类度量过多。到我完成的时候,我已经意识到这些度量值值得拥有一篇文章。
因此,本文将介绍7种最常用的MC度量:精度、召回率、F1分数、ROC AUC分数、Cohen Kappa分数、Matthew's相关系数和对数损失。你将了解它们的计算方法、Sklearn中的细微差别以及如何在自己的工作流中使用它们。
解释N乘N混淆矩阵
今天介绍的所有度量值都与混淆矩阵有关。虽然2乘2混淆矩阵直观且易于理解,但更大的混淆矩阵可能会令人困惑。因此,在深入研究从中得出的度量之前,最好先接触一下更大的N乘N矩阵。
在本文中,我们将以钻石分类为例。具体而言,目标包含4种类型的钻石:理想的、优质的、良好的和公平的。对这些钻石数据进行任何分类器的评估都将产生一个4乘4的矩阵:
即使随着类别数量的增加,矩阵变得更难解释,但有确定的方法可以找到任何形状矩阵的方法。
第一步始终是确定正类和负类。这取决于你要解决的问题。如果分类是平衡的,即你同样关心每个类(这很少见),则可能没有任何正类或负类。如果是这种情况,则根据每个类定义正类和负类。
然而,作为珠宝店主,你可能希望你的分类器更好地分类理想和优质的钻石,因为它们更昂贵。在这种情况下,理想和优质标签将是一个正类,其他标签将被统称为负类。
在确定正类和负类之后,定义真正的正例、真正的负例、假正例和假负例。在我们自己的问题方面:
- 真正的正例,类型1:实际理想,预测理想
- 真正的正例,类型2:实际优质,预测优质
- 真正的负例:任何正确预测的负类标签(好的,公平的)
- 假正例:实际值属于好的或公平的类别,但预测为理想或优质
- 假负例:实际值属于正类,但预测为好的或公平的
一旦定义了这4个术语,从矩阵中找到每个术语应该很容易,因为这只是一些简单的求和和减法问题。
从二元度量到多类
默认情况下,大多数分类度量值都是针对二元情况定义的。在将这些二元度量扩展到多类情况时,使用了几种平均技术。
首先,使用One-vs-One(OVO)或One-vs-Rest(OVR,也称为One-vs-All)方法将多类问题分解为一系列二元问题。OVO存在计算上的缺陷,因此专业人士更喜欢OVR方法。由于我在我的上一篇文章中详细讨论了这两种方法之间的差异,因此我们今天只关注OVR。
本质上,One-vs-Rest策略将多类问题转换为目标中每个类的一系列二元任务。例如,将4种类型的钻石分类为4个任务与OVR的二元分类器:
- 任务1:理想vs. [优质的,良好的,公平的] — 即理想与非理想
- 任务2:优质vs. [理想的,良好的,公平的] — 即优质与非优质
- 任务3:良好vs. [理想的,优质的,公平的] — 即良好与非良好
- 任务4:公平vs. [理想的,优质的,良好的] — 即公平与非公平
对于每个任务,将构建一个二元分类器(所有任务应该是相同的分类器),并使用二元分类度量(如精度或我们今天将讨论的任何度量)来测量它们的性能。结果将是4个精度分数。为了将一个分类器与另一个分类器进行比较,我们需要一个单一的精度分数,而不是4个,因此我们需要一种方法来表示所有类别的精度。这就是平均技术的作用。
具体而言,有3种适用于多类分类的平均技术:
- 宏平均:这是所有度量在类别间的简单算术平均值。这种技术给予所有类别相同的权重,使其成为平衡分类任务的好选择。
- 加权平均:通过计算每个类别在目标中的样本数加权的二元度量的平均值来考虑类别不平衡。如果3个(精度分数)对于3个类别是:类别1(0.85),类别2(0.80)和类别3(0.89),则将通过将每个分数乘以每个类别的出现次数并除以样本总数来计算加权平均值。
- 微平均:这与准确性相同。微平均通过将矩阵的对角线单元格的总和除以所有单元格的总和来找到。由于准确性是如此误导性的度量,因此很少使用这种平均技术。现在让我们终于进入实际的指标!
多类分类的精确率和召回率
精确率回答了“预测的正例中有多少是真正的正例?”这个问题。当然,你只能在二元分类中回答这个问题。这就是为什么你要针对目标中的类别数量多次提出这个问题。每次,你将针对一个类别与其他类别提出这个问题。对于我们的钻石分类,一个例子是“预测的理想钻石中有多少是真正的理想钻石?”
精确率的计算方法是将真正的正例除以真正的正例和假正例之和(三倍P法则):
让我们计算理想类别的精确率。以下是参考的混淆矩阵:
理想钻石的真正正例是左上角的格子(22)。假正例是所有其他类型的钻石被预测为理想钻石的格子。这些格子在左上角格子下面(5 + 2 + 9 = 19)。因此,精确率将为:
精确率(理想):22 / (22 + 19) = 0.536 ——一个糟糕的分数。
当你想要减少假正例的数量时,你应该为精确率优化你的模型。在我们的情况下,优化理想钻石的精确率是有意义的。原因是理想钻石是最昂贵的,如果你将一个便宜的钻石误分类为理想钻石,就会出现假正例。如果你不小心出现这种情况,你可能会因欺诈而被起诉。现在,让我们转向召回率。
召回率回答了“真正的正例有多少被正确分类?”它的计算方法是将真正的正例除以真正的正例和假负例之和。
让我们计算高级珠宝类别的召回率。
有27个真正的正例(第二行,第二列)。假负例是任何将高级珠宝分类为理想、好或普通的情况。这将是真正正例格子的左边和右边的格子(5 + 7 + 6 = 18)。因此,召回率将为:
召回率(高级):27 / (27 + 18) = 0.6 ——也不是一个好的分数。
当你想要减少假负例的数量时,你应该为召回率优化你的模型。如果你试图在黄色和红色香蕉中检测蓝色香蕉,你会想要减少假负例,因为蓝色香蕉非常罕见(罕至你第一次听说)。你不想将它们与普通香蕉混淆。
如果你想看到所有类别的精确率和召回率以及它们的宏平均值和加权平均值,你可以使用Sklearn的classification_report
函数。假设我们的标签在y_test
中,预测结果在y_pred
中,则钻石分类的报告将如下所示:
最后两行显示了精确率和召回率的宏平均值和加权平均值,它们看起来不太好!
多类分类的F1分数
由于它们的本质,精确率和召回率处于权衡关系。你可能不得不在其中一个指标上进行优化,以换取另一个指标的牺牲。然而,如果你想要一个分类器,它在最小化假正例和假负例方面同样出色怎么办?例如,拥有一个模型,它同样擅长捕捉你错误地将便宜的钻石销售为理想钻石的情况,这样你就不会被起诉,并检测你错误地将理想钻石销售为更便宜价格的情况。
这就是F1分数的作用。它通过精确率和召回率的调和平均值来计算,范围从0到1。
为什么要采用调和平均数而不是简单算术平均数?因为调和平均数具有一种很好的算术性质,表示一种真正平衡的平均数。如果精确率或召回率低,它会受到严重的影响。例如,假设我们将两个分类器相互比较。第一个分类器的精确率和召回率分别为0.9、0.9,而第二个分类器的精确率和召回率分别为1.0和0.7。对两者分别计算F1得到0.9和0.82。正如你所看到的,第二个分类器的低召回率分数使得F1得分下降。
你可以使用分类报告输出来查看这两个平均F1分数:
F1分数通常会介于精确率和召回率之间,但加权平均值可能会给出超出它们范围的值。
请继续关注接下来的几节,我们将讨论ROC AUC分数并将其与F1进行比较。你将了解到这两个指标的主要缺点。
多类分类的ROC AUC分数
在二元分类中,另一个常用的指标是接收器操作特征曲线下面积(ROC AUC或AUROC)。它量化了模型区分每个类别的能力。该指标仅用于能够生成类别成员概率的分类器。就Sklearn估计器而言,这些是具有predict_proba()
方法的模型。
例如,如果目标包含猫和狗类别,则具有predict_proba
方法的分类器可以为每个样本生成成员概率,例如0.35表示猫,0.65表示狗。然后,每个预测都基于决策阈值(如0.5)进行分类。在进一步解释AUROC之前,让我们详细看一下MC的计算方法。选择具有predict_proba
方法的二元分类器,用于在OVR中为第一个二元任务生成成员概率。然后选择一个接近0的初始决策阈值。使用该阈值进行预测,并创建混淆矩阵。从该混淆矩阵中计算出两个指标:真正率(与召回相同)和假正率:
然后选择一个新的更高的阈值,并创建一个新的混淆矩阵。使用该混淆矩阵计算新的TPR和FPR。在0到1之间的许多不同决策阈值下重复此过程,对于每个阈值,都会找到新的TPR和FPR。最后,将所有TPR和FPR绘制在一起:
该图是在我们的钻石数据集中计算理想类与其他类之间ROC曲线的实现。对于所有其他二元任务,都要重复此过程。换句话说,找到了3条ROC曲线:
最终的图还显示了这些曲线下的面积。AUROC越大,类别之间的区别就越大。最终的AUROC也使用宏观或加权方法进行平均。以下是Sklearn中所有这些内容的实现:
我们得到了平均AUROC分数为0.82。
多类分类中的ROC AUC分数与F1分数
简而言之,ROC AUC和F1之间的主要区别与类别不平衡有关。以下是阅读许多StackOverflow线程并选择一个指标的总结:
如果存在高度的类别不平衡,则始终选择F1分数,因为高F1分数考虑了精确度和召回率。 要获得高F1,必须使假阳性和假阴性都很低。另一方面,ROC AUC可以在有足够的假阳性的情况下给出宝贵的高分数。此外,你还可以将ROC AUC分数视为在各个阈值下评估的F1分数(良好和不良)。在存在类别不平衡时始终使用F1。更高的ROC AUC并不一定意味着更好的分类器。
如果你想了解更多关于此差异的信息,请参阅以下讨论:
多类分类的Cohen's Kappa分数
你可以将Kappa分数视为精度的超级版本,该版本还集成了机会和类别不平衡的测量。
你可能知道,精度可能非常具有误导性,因为它不考虑类别不平衡。在正负比率为10:100的目标中,如果分类器仅正确预测所有负样本,则仍然可以获得超过90%的精度。此外,由于机器学习算法依赖于数据的概率性假设,因此我们需要一种可以测量生成预测时固有不确定性的分数。而Kappa分数(以Jacob Cohen命名)是少数可以用单个指标表示所有这些内容的分数之一。
在官方文献中,其定义为“衡量两个评分员之间协议的度量标准。”以下是维基百科的定义:
Cohen’s kappa coefficient (κ)是用于衡量定性(分类)项目的评分员间可靠性(以及评分员内部可靠性)的统计量。通常认为它比简单的百分比协议计算更为稳健,因为κ考虑了协议可能出现的偶然性。
以下是官方公式:
在分类中,此公式的解释如下:
_P_0_是实际值和预测值之间的观察比例一致性。这将是任何混淆矩阵的对角线单元格之和除以非对角线单元格之和。换句话说,是简单精度的另一个名称。
_P_e_是真值和假值通过偶然性达成一致的概率。我们将看到如何使用我们在本指南中使用的矩阵来计算它们:
首先找到准确性:对角线单元格的总和除以非对角线单元格的总和-0.6。要找到_P_e_的值,我们需要找到每个类别的真实值和预测值之间的概率以偶然性达成一致。
- _理想_类别-通过偶然性,真实值和预测值都是_理想_的概率。有250个样本,其中57个是理想的钻石。因此,随机钻石是理想的概率为P(actual_ideal)= 57/250 = 0.228。
现在,我们有250个预测结果,其中有38个理想的结果。因此,一个随机预测结果是理想结果的概率为
P(predicted_ideal) = 16 / 250 = 0.064
两个条件同时成立的概率是它们的乘积:
P_e(actual_ideal, predicted_ideal) = 0.228 * 0.064 = 0.014592
现在,我们将对其他类别进行相同的计算:
- _Premium_类别——真实值和预测值都是_premium_的概率: P(actual_premium) = 45 / 250 = 0.18
P(predicted_premium) = 28 / 250 = 0.112
P_e(actual_premium, predicted_premium) = 0.02016
- _Good_类别——真实值和预测值都是_good_的概率: P(actual_good) = 74 / 250 = 0.296
P(predicted_good) = 26 / 250 = 0.104
P_e(actual_good, predicted_good) = 0.030784
- _Fair_类别——真实值和预测值都是_fair_的概率: P(actual_fair) = 74 / 250 = 0.296
P(predicted_fair) = 30 / 250 = 0.12
P_e(actual_fair, predicted_fair) = 0.03552
最终的P_e是上述计算的总和:
P_e(final) = 0.014592 + 0.02016 + 0.030784 + 0.03552 = 0.101056
准确率,P_0 = 0.6
将数字代入公式:
好消息是,你可以用Sklearn一行代码实现所有这些:
通常,得分高于0.8被认为是极好的。我们得到的得分是适中的。
想了解更多信息,我建议阅读这两篇优秀的文章:
多类分类的马修斯相关系数
马修斯相关系数是另一种单一数字的替代准确度的度量方法。我认为这是统计学家们能想出的唯一一个涉及所有4个矩阵项并且实际有意义的度量方法:
即使我知道为什么要这样计算,我也不会费心解释它。你只需要知道这个度量方法表示真实值和预测值之间的相关性。与Pearson相关系数类似,它的范围从-1到1。得分为1.0表示一个完美的分类器,而接近0的值表示我们的分类器不比随机选择更好。
MCC的酷之处在于它是完全对称的。与精度和召回率不同,交换正面和负面类别得到相同的得分。此外,它只关心每个类别是否被预测正确,而不关心类别不平衡。根据维基百科的说法,一些科学家甚至认为MCC是在混淆矩阵环境中建立分类器性能的最佳得分。
值得庆幸的是,Sklearn也包括了这个度量方法:
我们得到了0.46的得分,这是一个适度强的相关性。通常,得分超过0.7被认为是良好的得分。
顺便说一下,上述公式是针对二元分类器的。对于多类分类器,Sklearn提供了更为复杂的公式:
图像来源:Sklearn。(他们甚至费心试图简化公式,真是太好了!)
多类分类的对数损失
最坚固的单一数字指标之一是_log loss_,也称为交叉熵损失和逻辑误差损失。它不是一个点度量(越大越好),而是一个误差函数(越小越好)。因此,最小化对数函数的分类器被认为是最好的。
对数损失的另一个优点是,它仅适用于概率分数或者说能够生成概率成员分数的算法。这意味着该误差函数考虑了模型的不确定性。例如,一个0.9分数的类别预测比一个0.6分数的预测更可靠。我们今天讨论的许多指标使用预测标签(即类别1、类别2),这些标签隐藏了模型在生成这些预测时的不确定性,而对数损失没有这个问题。
它会严厉惩罚模型用低分数预测类别成员身份的情况。对于二元情况,它的公式为:
上述公式是二元情况的公式。多类情况更加复杂。我将不再解释如何计算该函数,因为它远远超出了本文的范围。因此,我将用Sklearn展示一个例子,并留下一些链接,以便你进一步了解这个度量方法:
以下是一些链接,以加强你的理解:
今天,我们学习了如何以及何时使用7个最常见的多类分类度量。我们还学习了它们在Sklearn中的实现方式以及如何从二元模式扩展到多类。使用这些度量,你可以评估任何分类器的性能并将它们彼此比较。
以下是一个最终的备忘单,可以根据你在多类问题中的需求来决定使用哪种度量:
- 比较一个分类器的整体性能与另一个分类器的单个度量——使用马修斯相关系数、科恩卡帕系数和对数损失。
- 在平衡分类中衡量分类器区分每个类的能力:ROC AUC 分数
- 在不平衡分类中最小化假阳性和假阴性的度量:F1 分数
- 专注于减少单个类别的假阳性:该类别的精确度
- 专注于减少单个类别的假阴性:该类别的召回率。
译自:https://towardsdatascience.com/comprehensive-guide-on-multiclass-classification-metrics-af94cfb83fbd
评论(0)