前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >机器学习入门 10-4 F1 Score

机器学习入门 10-4 F1 Score

作者头像
触摸壹缕阳光
发布2020-04-08 16:05:43
发布2020-04-08 16:05:43
1.7K0
举报

该来的自然来,会走的留不住;不违心、不刻意、不必太在乎、放开执念,随缘是最好的生活。

全文字数:4485字

阅读时间:13分钟

前言

本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍新的指标F1 Score,F1 Score通过计算调和平均值来综合精准率和召回率这两个指标,由于调和平均的优势,只有当精准率和召回率的值都大的时候,F1 Score值才会大。

a

不同任务下的精准率和召回率

前面介绍了混淆矩阵进而引入精准率和召回率两个指标,如果在处理二分类任务中遇到极度偏斜的数据集,使用精准率和召回率这两个指标要比使用准确率能够更好的衡量算法的性能。

不过这里有个问题,通常精准率和召回率这两个指标之间可能会产生差异,对于一个二分类任务来说,一些算法可能计算的精准率比较高而召回率比较低,而有一些算法恰恰相反,精准率比较低而召回率比较高。这就涉及到如何来解读精准率和召回率这两个指标,这个问题的答案和大多数机器学习领域中关于取舍问题的答案是一致的,都需要视具体的场景而定。

▲精准率和召回率

对于一些场景来说,我们更加注重的是精准率。下面举一个简单的例子。

▲股票预测问题中更加注重精准率

比如我们要做一个机器学习算法来进行股票的预测,将股票预测这样的问题转换成一个二分类问题,预测未来的股票是升还是降,我们关注的是股票升的事件,因此将预测股票升这个事件发生定义为类别1,将股票降这个事件发生定义为类别0。

在进行股票预测升降的二分类问题中,我们更加关注的是精准率这个指标。要说明原因,首先从精准率的定义来说,精准率简单来说就是算法预测为1的所有样本中有多少样本被算法分类正确,对于股票预测问题来说,就是在所有算法预测为升的股票中有多少股票被算法预测正确,我们肯定希望这个比例越高越好,这是因为如果算法预测股票要升,可能我们会相应的购买这支股票,但是由于算法的精准率比较低,此时如果算法将这支股票预测错了,就犯了False Positive(股票真实情况为降Negative,但是算法错误的将这支股票预测为升Positive),我们购买的实际上是会降的股票,这种情况下我们肯定会亏很多钱。

但是股票预测问题对召回率这个指标不太关注,召回率简单来说就是在所有真实要升的股票中有多少被算法正确的识别出来,对于股票预测问题来说,可能现实中有很多会升的股票,这里我们漏掉了一些会升的股票,也就是本来是上升的股票但是被算法错误分类为降,不过对于我们来说并没有很大的损失,如果我们相信算法可能不会投入钱买这些股票,因此这些股票不会对我们造成太大的损失。

总的来说,对于预测股票升降的二分类问题,我们更加关注精准率,不太关注召回率。因为我们买入算法预测错误的股票,本来股票是降的但是算法预测为升,我们相信算法的预测买入了这些股票,这会让我们有很大的损失,而这正是精准率所关注的。而召回率会让算法将本来是升的股票错误预测成降,我们相信算法的预测,不买入这些有争议的股票,这并不会给我们带来损失。这种情况下,精准率就比召回率要更加重要。

而对于另外一些场景召回率可能比精准率更加重要。最典型的例子就是医疗领域中病人诊断。

▲病人诊断中我们更加注重召回率

对于医疗领域如果召回率低,意味着本来有一个病人已经得病了,但是算法却没有正确的把这位病人识别出来,这会导致病人的病情会继续恶化甚至发生更为严重的后果,所以此时的召回率非常重要。我们希望将所有有病的人群都能够正确的识别出来,如果此时精准率低一些并没有关系,因为在这种情况下精准率低意味着算法犯了False Positive(有可能一些人群他们本身并没有病,但是算法却错误的预测有病),在这种情况下让这些人做一些更进一步的检查,进一步判断这些人到底有没有病,在这种情况下犯了False Positive的错误只是让一些人多做了一些检查而已。更加关注召回率表示我们并不想漏掉任何真正患病的人,这种情况下召回率比精准率更重要。

这里举了两个例子来说明对于不同的应用场景我们可能会偏好不同的指标,有一些情况下(股票预测等),精准率比召回率更重要,而有一些情况下(病人诊断),召回率比精准率更重要。

b

F1 Score

上面介绍了在一些应用场景中可能更关注精准率,也有可能更关注召回率。不过有些情况很可能并不像上面列举的两个例子那样极端,一定要特别关注精准率或者一定要特别关注召回率。我们希望获得的这两个指标之间能够达到一个平衡,换句话说希望同时关注精准率和召回率这两个指标,在这种情况下使用一个新的指标F1 Score。F1 Score这个指标的目的就是要兼顾精准率和召回率这两个指标。

▲F1 Score

如果想要同时兼顾精准率和召回率这两个指标,最容易想到的就是取两个指标的平均值,其实F1 Score背后的理念和计算两个指标的算法平均值差不多。F1表达式本质上描述的是精准率和召回率这两个指标的调和平均值,而不是简单的计算精准率和召回率两个指标的算术平均值。调和平均值也非常简单,下面就是没有化简后的F1 Score的调和平均值表达式。

▲没有化简的F1 Score

F1 Score是精准率和召回率的调和平均值,具体来说就是精准率的倒数加上召回率的倒数,之后乘上0.5,结果为F1 Score的倒数。调和平均值不同于算术平均值的最大特点是:当两个指标极度不平衡的时候,比如说一个指标特别高,另外一个指标特别低的话,最终通过调和平均值计算出来的F1 Score的值也会特别低,只有两个指标的值都特别高的时候,最终计算出来的F1 Score才会特别的高。如果使用算术平均值的话,即使一个指标特别高,另外一个指标特别低,这两个指标的值相加除以2之后的结果也可能比较高。这也是为什么F1 Score指标没有使用算术平均值,而是使用调和平均值的原因所在。

精准率和召回率计算调和平均值F1 Score指标的具体推导如下。

▲F1 Score公式化简

通过上面的式子也应该可以看出来F1的取值范围,当精准率和召回率的值都是1的时候,此时F1 = 2 * (1 * 1) / (1 + 1) = 1,因为精准率和召回率的取值范围都是[0, 1],所以F1 = 1是F1的最大值。当精准率和召回率值都为0的时候,由于0作为分母,所以F1公式没有意义,我们将这种无意义情况下的F1 Score定义为0。所以F1 Score的取值范围在0-1之间。

c

编程实现F1 Score

接下来通过具体的编程实现F1 Score这个指标,同时看一下使用调和平均值来计算F1 Score的优势。

这里只需要注意由于precision精准率和recall召回率的值有可能为0,所以在计算F1 Score的时候,很有可能导致分母为0,所以我们需要通过try来捕获这个异常,当抛出异常的时候直接返回F1 Score的值为0.0。

接下来就来看看使用调和平均值计算F1 Score的优点。如果此时精准率和召回率的值都是0.5的话,相应的F1 Score的值也是0.5。

对于F1 Score来说,如果精准率和召回率值相等的话,假设都是x,将x代入上面F1的表达式中,F1 = 2x^2 / 2x = x,也就是当精准率和召回率相等的时候,F1值的结果能够真实的反映精准率和召回率值相等的情况。

关键在于如果precision和recall不等的话,比如说此时的precision = 0.1、recall = 0.9。

如果使用算术平均值计算的话(0.1 + 0.9 ) / 2 = 0.5,和precision = 0.5和recall = 0.5时候的算术平均值是一样的都是0.5。如果使用调和平均值的F1 Score计算precision = 0.1、recall = 0.9结果为0.18,0.18要远远小于0.5,这就是相比于算术平均,调和平均的优势,对于这个调和平均值来说,如果其中的某一个值非常小的话,都将大大拉低这个调和平均值的结果,而对于普通的算术平均值的话,是没有这个趋势的。

相应的尝试一下更极端的情况,如果准确率和召回率其中一个为0的时候,另外一个即使达到了1,最终计算的F1 Score的结果还是0。通过F1 Score的计算公式也可以发现其中分母为准确率和召回率的乘积,结果为0没有意义会抛出异常,所以这种情况下F1 Score的值为0.0。

这就是使用F1 Score的优势所在,F1 Score能够更好的表征精准率和召回率这两个指标,两个指标其中一个指标值大是没有用的,必须两个指标的值同时比较大的情况下,对应的F1 Score指标的值才会非常大。

下面使用具体的数据集来计算对应的F1 Score的值。这里使用和上一小节一样的手写数字识别数据集,不过由于手写数字识别的10个类别分布比较均衡,所以为了能够更好的验证试验,将10个类别均衡的手写数字识别的数据集转换成有偏数据的二分类问题。

接下来使用train_test_split的方式将数据集划分训练集和测试集,之后使用逻辑回归算法对数据进行fit训练,并通过score计算训练好的逻辑回归算法在测试集上的准确率。

训练好的算法在测试集上的准确率达到了97.5%,不过通过前几个小节的学习知道:对于这种极度偏斜的数据集来说,准确率很难来作为评价算法的性能的指标,因此有了混淆矩阵这个小工具,进而有了精准率和召回率这两个新的评价指标。当然不论是计算混淆矩阵还是精准率以及召回率这两个指标都需要使用算法在测试集上的预测值y_predict。

这里只需要注意不论是混淆矩阵还是精准率以及召回率都属于指标的范畴,所以这些函数都在sklearn.metrics模块下。

最后计算算法在测试集上的F1 Score指标。

当然可以使用最开始时候我们自己构建的f1_score的函数来计算,不过sklearn为我们提供了计算F1 Score指标的函数,同样F1 Score也是属于衡量指标,因此如果想要在sklearn中使用的话,需要导入sklearn.metrics模块。不过这里需要注意,在sklearn中计算F1 Score指标的值需要传入测试集的真实值y_test以及算法在测试集上对应的预测值y_predict,如果我们自己实现也非常简单,只需要将计算精准率和召回率的函数放到计算F1 Score的函数进行相应的计算即可。

应用逻辑回归算法在上面极度偏斜的二分类问题中计算的F1 Score值为0.86,这个结果显然要比算法的准确率0.97要小很多。这是因为:

  • 第一点:由于使用的数据集是极度偏斜的,所以相应的精准率和召回率都要比准确率低一些,所以精准率和召回率能够更好反映算法的性能;
  • 第二点:在这个极度偏斜的数据集上训练的算法的召回率为0.8,要比精准率0.94低一点,而F1 Score的计算基于调和平均值,所以相应的结果被召回率的0.8拉低了;

对于这个有偏的数据集来说,更倾向于使用F1 Score来衡量当前算法的性能水平。至此这一章介绍了精准率、召回率以及F1 Score三个新的指标,在下一小节将会进一步来介绍准率和召回率这两个指标之间非常重要的内在联系。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档