[白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall)和F值(F-Measure)

二分类评估是对二分类算法的预测结果进行效果评估。本文将构造出一个水泊梁山的具体实例带领大家梳理相关概念。

[白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall)和F值(F-Measure)


目录


0x00 摘要

二分类评估是对二分类算法的预测结果进行效果评估。本文将构造出一个水泊梁山的具体实例带领大家梳理相关概念。

0x01 本文缘由

笔者最近在研究Alink源码,本来计划分析二分类评估,结果打开Alink相关文档发现里面给出不少概念和公式。于是本文先带领大家一起复习/熟悉其中部分概念和公式,为后续分析源码打下良好的基础。

以下是Alink中 “二分类评估” 的说明。

  • 支持Roc曲线,LiftChart曲线,Recall-Precision曲线绘制。

  • 流式的实验支持累计统计和窗口统计。

  • 给出整体的评估指标包括:AUC、K-S、PRC, 不同阈值下的Precision、Recall、F-Measure、Sensitivity、Accuracy、Specificity和Kappa。

这些概念基本都是评价指标,这是针对模型性能优劣的一个定量指标。一种评价指标只能反映模型一部分性能,如果选择的评价指标不合理,那么可能会得出错误的结论,故而应该针对具体的数据、模型选取不同的的评价指标。

接下来就分析梳理其中部分概念。

0x02 例子构建

  • 目标:因为在招安大计上,鲁智深提出了反对意见,所以宋公明希望在梁山内部查找和鲁智深有关联的人。
  • 样本全体:林冲,武松,史进,杨志,张青,孙二娘,呼延灼,关胜,石秀,杨雄。

宋江对蒋敬说:贤弟你是神算子,快帮哥哥想想如何能够找出与大和尚有串联的人,

蒋敬说:哥哥这个要求是 “二分类问题”(例如预测患或未患心脏病、股票涨或跌等这种只有两类情况的问题),里面门道甚多,哥哥且听我慢慢道来。

0x03 混淆矩阵

蒋敬说:首先小弟介绍的概念是混淆矩阵,这是一个 2 维方阵,它主要用于评估二分类问题的好坏。

3.1 四种分类情况

针对一个二分类问题,即将实例分成正类(positive)或负类(negative),在实际分类中会出现以下四种情况:

  • TN (True Negative ):算法预测为负例(N),实际上也是负例(N)的个数,即算法预测对了(True)。

  • FP (False Positive ):算法预测为正例(P),实际上是负例(N)的个数,即算法预测错了(False)

    这里指的是:实际为负例但被分类器划分为正例的实例数。

  • FN (False Negative ):算法预测为负例(N),实际上是正例(P)的个数,即算法预测错了(False)

    这里指的是:即实际为正例但被分类器划分为负例的实例数。

  • TP (True Positive ):算法预测为正例(P),实际上也是正例(P)的个数,即算法预测对了(True)。

宋江道:如此说来,“与鲁智深有关联人” 就是 TP + FP了。

蒋敬说:哥哥误会了,实际为正例的样本数应该是 TP + FN。

这里有个记忆诀窍听小弟道来。

记忆诀窍是 :这 4 个定义由两个字母组成:

  • 第 1 个字母表示算法预测正确或者错误,即 True、False 描述的是这个分类器是否判断正确。
  • 第 2 个字母表示算法预测的结果,即 Positive、Negative 是这个分类器的分类结果。

所以再次澄清:

  • TP :预测为正样本,实际也是正样本。
  • FP :预测为正样本,实际是负样本。
  • FN :预测为负样本,实际是正样本。
  • TN:预测为负样本,实际也是负样本。
  • P = TP + FN :所有 "实际为正例" 的样本数
  • N = FP + TN :所有 "实际 为负例" 的样本数
  • P~ = TP + FP :所有 "预测为正例" 的样本数
  • N~ = TN + FN :所有 "预测为负例" 的样本数

3.2 混淆矩阵

混淆矩阵是把真实值和预测值相对应的样本数量列出来的一张交叉表。这样,所有正确的预测结果都在其对角线上,所以从混淆矩阵中可以很直观地看出哪里有错误。

矩阵的每一行是样本的预测分类,每一列是样本的真实分类(反过来也可以)。


预测值 0 (与鲁智深无关联) 预测值 1 (与鲁智深有关联)
真实值 0 (与鲁智深无关联) TN FP
真实值 1 (与鲁智深有关联) FN TP

记忆方法:真实值更重要,所以真实值处在第一个维度,就是行。

0x04 准确率 Accuracy

蒋敬说:小弟介绍的第二个概念是准确率 Accuracy。这 Accuracy 指的是预测正确的样本数量占总量的百分比。

4.1 公式


\[Accuray = \frac {TP + TN}{TP + TN + FP + FN} = \frac {TP + TN}{P + N} \]


按照我们上文的定义:第 1 个字母表示算法预测正确或者错误,第 2 个字母表示算法预测的结果。

所以分母是全部四种数据;分子中第一个字母是 T 表示 "算法预测正确了"。

4.2 特点

准确率有一个缺点,就是数据的样本不均衡,这个指标是不能评价模型的性能优劣的。

假如一个测试集有正样本99个,负样本1个。我们设计的模型是个无脑模型,即把所有的样本都预测为正样本,那么模型的Accuracy为99%,看评价指标,模型的效果很好,但实际上模型没有任何预测能力。

0x05 精准率 Precision

蒋敬说:小弟介绍的第三个概念是精准率,又称为查准率,就是 “预测为正例" 的那些数据里 "预测正确" 的数据个数。即在模型预测为正样本的结果中,真正是正样本所占的百分比。或者说是 在预测为正样本的结果中,有多少是准确的。

5.1 公式


\[Precision = \frac {TP}{TP + FP} \]


按照我们上文的定义:第 1 个字母表示算法预测正确或者错误,第 2 个字母表示算法预测的结果。

所以分母中,  TP表示 : 算法预测正确 & 预测的是正例,FP表示 : 算法预测错误 & 预测的是正例(实际是负例)

5.2 特点

这个指标比较谨慎,分类阈值较高。

5.3 应用场景

需要尽可能地把所需的类别检测准确,而不在乎这些类别是否都被检测出来。比如对于罪犯的预测,我们希望预测结果是非常准确的,即使放过了一些真正的罪犯,也不能错怪一个好人。

0x06 准确率 VS 精准率

宋江说,贤弟这两个中文词长得也太像太坑爹了,哥哥我很难区别。

蒋敬说:哥哥,这两个词是从英文翻译过来的,咱慢慢推敲。

让我们看看其英文原意。

  • Accuracy在词典中的定义是:the quality or state of being correct or precise
  • Precision在词典中的定义是:the quality, condition, or fact of being exact and accurate

Accuracy首先是correct(正确),而precision首先是exact(精确,或者说确切)。首先准确,然后才谈得上精确。一个结果必须要同时符合准确与精密这两个条件,才可算是精准。

这两个词也  有点类似 偏差(bias)与方差(variance)

  • 偏差(bias)反映了模型在样本上的期望输出与真实标记之间的差距,即模型本身的精准度,反映的是模型本身的拟合能力。这就很像 Precision。
  • 方差(variance)反映了模型在不同训练数据集下学得的函数的输出与期望输出之间的误差,即模型的稳定性,反应的是模型的波动情况。这有点像 Accuracy。

宋江说,贤弟你这偏差,方差的,哥哥也听着像天书。

蒋敬说:待小弟给哥哥找一个合适的例子。

比如大概可以类比成咱射箭,准确率要看你射中靶心的概率;精准率要看你射中的是靶心区域的哪个位置。

0x07 召回率 Recall

这是针对原始样本而言的一个评价指标。召回率又称为查全率,就是在实际为正样本中,被预测为正样本所占的百分比。 即所有正例中,有多少被正确地判定为正。

7.1 公式


\[recall= \frac {????????}{TP+FN} = \frac {????????}{All\,Real\,Positive} \]


按照我们上文的定义:第 1 个字母表示算法预测正确或者错误,第 2 个字母表示算法预测的结果。

所以分母中 TP+FN ,表示 “预测正确且预测为正样本“ + “预测错误且预测为负样本(实际是真实正例)“。即 所有 "实际为正例" 的样本数

分子是:预测正确 且 被预测为正样本。

7.2 特点

召回率分类阈值较低。尽量检测数据,不遗漏数据,所谓的宁肯错杀一千,不肯放过一个。

我们看看英文解释,Recall : to remember sth; to make sb think of sth; to order sb to return; to ask for sth to be returned, often because there is sth wrong with it。

因为Recall有记忆的意思,所以可以试着把 Recall 理解为“记忆率”。就是记忆一个事件需要多少细节,这个细节就是当我们问检索系统某一件事的所有细节时(输入检索query),检索系统能“Recall 回忆”起那些事的多少细节,通俗来讲就是“回忆的能力”。能回忆起来的细节数 除以 系统知道这件事的所有细节,就是“记忆率”,也就是recall——召回率。

7.3 应用场景

召回率的应用场景是:需要尽可能地把所需的类别检测出来,而不在乎结果是否准确。

比如对于地震的预测,我们希望每次地震都能被预测出来,这个时候可以牺牲precision。假如一共发生了10次地震,我们情愿发出1000次警报,这样能把这10次地震都涵盖进去(此时recall是100%,precision是1%),也不要发出100次警报,其中有8次地震给预测到了,但漏了2次(此时recall是80%,precision是8%)。

7.4 Sensitivity

sensitive = TP / P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力;可以看到,sensitive和Recall是一样的。


\[Sensitivity=\dfrac{TP}{TP+FN} \]


0x08 精准率  VS 召回率

宋江说,贤弟你给哥哥好好解释下精准率 和 召回率这两个概念

蒋敬说:待小弟慢慢道来。

8.1 概念区别

首先,用一个图例来看看概念区别,图中椭圆就是 “预测为正类” 的样本。也能看出两个概念的定义。

[白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall)和F值(F-Measure)

8.2 关注点不同

召回率是覆盖面的度量,度量有多个真实正例被预测为正例。精度是精确性的度量,表示被预测为正例的示例中实际为正例的比例。

在不同的应用场景下,我们的关注点不同,例如:

  • 在预测股票的时候,我们更关心精准率,即我们预测升的那些股票里,真的升了有多少,因为那些我们预测升的股票都是我们投钱的。
  • 而在预测病患的场景下,我们更关注召回率,即真的患病的那些人里我们预测错了情况应该越少越好,因为真的患病如果没有检测出来,结果其实是很严重的,之前那个无脑的算法,召回率就是 0。

在信息检索中,准确率和召回率是互相影响的,虽然两者都高是一种期望的理想情况,然而实际中常常是如果阈值较高,那么精准率会高,但是会漏掉很多数据;如果阈值较低,召回率高,但是预测的会很不准确。所以在实际中常常需要根据具体情况做出取舍,例如:

  • 对一般搜索的情况是在保证召回率的情况下提升准确率,
  • 而如果是疾病监测、反垃圾邮件等,则是在保证准确率的条件下,提升召回率。
  • 有时候,需要兼顾两者,那么就可以用F-score指标。

8.3 为什么准确率和召回率是互相影响

宋江说,看到这里,我就有一个疑问了,为什么准确率和召回率是互相影响的?

蒋敬说:这个问题比较复杂

首先说大致原理。

  • recall和precision是相互矛盾的。如果想要更高的recall,那么就要让模型的预测能覆盖到更多的样本,但是这样模型就更有可能犯错,也就是说precision会比较低。如果模型很保守,只能检测出它很确定的样本,那么其precision会很高,但是recall会相对低。
  • recall(TPR)的分母是样本中正类的个数,因此样本一旦确定,其分母即为定值,也就是说recall的变化随分子增加而单调递增;precision的分母是样本中预测为正类的个数,其会随着分类阈值的变化而变化,因此Precision的变化受TP和FP的综合影响,不单调,变化情况不可预测。

8.3 实例说明

蒋敬说:具体用真实数据说明最好,咱就真实操作下。

8.3.1 混淆矩阵

样本全体:林冲,武松,史进,杨志,张青,孙二娘,呼延灼,关胜,石秀,杨雄。

这些好汉将会被分成四类:

  • TP:查找到的,相关的 (搜到的也想要的)
  • FP:查找到的,但是不相关的 (搜到的但没用的)
  • FN:未查找到的,但却是相关的 (没搜到,然而实际上想要的)
  • TN:未查找到的,也不相关的 (没搜到也没用的)

我们再次看看混淆矩阵:


预测值 0 (与鲁智深无关联) 预测值 1 (与鲁智深有关联)
真实值 0 (与鲁智深无关联) TN FP
真实值 1 (与鲁智深有关联) FN TP

8.3.2 为什么要有召回率

首先我们看,为什么要有召回率这个指标?

在梁山好汉中查找和鲁智深有关联的人。比如有18人和鲁智深有关联,90人和鲁智深没关联。

我们做个算法做预测:就是所有好汉都预测为没联系。这样,90个肯定预测对了,看着准确率很高。

但是这个算法对于“和鲁智深有关联的人”的预测准确率是0,所以这个算法是没有任何意义的。

所以就要引入Recall。Recall就是在这18个中能找出来的,比如找出12个,则recall = 66%。

8.3.3 分析

下面我们回顾下定义:

  • 精准率(查准率)Precision = TP / (TP+FP) :查找到的相关好汉 / 所有被查找到的好汉。追求 精准率(查准率)意味着查找到的好汉中,相关的越多越好,不相关的越少越好。
  • 召回率(查全率)Recall = TP / (TP+FN) :查找到的相关好汉 / 全体样本中所有的相关好汉。追求 召回率(查全率)意味着样本中的相关好汉,被查找到越多越好。

为什么相互制约?

  • 由于“查找策略”并不完美,希望更多相关的好汉被检索到时,放宽“查找策略”时,往往也会伴随出现一些不相关的结果,从而使准确率受到影响。
  • 而希望去除查找结果中的不相关好汉时,务必要将“查找策略”定的更加严格,这样也会使有一些相关的好汉不再能被查找到,从而使召回率受到影响。

8.3.4 原始“查找策略”

蒋敬首先定的 "查找策略"是:桃花山 + 军官。这个容易理解,鲁智深是在桃花山落草,且本身是提辖,可能和宋军将领有私交。

得到如下混淆矩阵


预测值 0 (与鲁智深无关联) 预测值 1 (与鲁智深有关联)
真实值 0 (与鲁智深无关联) TN 石秀,杨雄,裴宣,汤隆,刘唐,陶宗旺 FP 关胜,呼延灼
真实值 1 (与鲁智深有关联) FN 史进,杨春,陈达,周通 TP 武松,杨志,张青,孙二娘

于是推算出:

Precision = TP / (TP + FP) = 4 / (4 + 2) = 2/3

Recall = TP / (TP + FN)  = 4 / (4 + 4) = 1/2

8.3.5 追求召回率 / 放宽“查找策略”

宋江道:找到的相关人太少,我们得提高召回率(查全率)。

追求 召回率(查全率)意味着样本中所有相关的好汉,被查找到的越多越好,那就应该放宽“查找策略”。放宽“查找策略”时,往往也会伴随出现一些不相关的结果,从而使准确率受到影响。

于是公明哥哥需要放宽“查找策略” :少华山史大郎和鲁智深以前结拜过;鲁智深以前在"老种经略相公"麾下,种师道统帅陕西,所以鲁智深可能和西北人有交往。

放宽后的  "查找策略" 是:桃花山 + 少华山 + 军官 + 西北人(裴宣,汤隆,刘唐,陶宗旺)

于是得到混淆矩阵是:


预测值 0 (与鲁智深无关联) 预测值 1 (与鲁智深有关联)
真实值 0 (与鲁智深无关联) TN 石秀,杨雄 FP 关胜,呼延灼,裴宣,汤隆,刘唐,陶宗旺
真实值 1 (与鲁智深有关联) FN 周通 TP 武松,杨志,张青,孙二娘,史进,杨春,陈达

所以得到

Precision = TP / (TP + FP) = 7 / (7 + 6) = 7/13   ---- 降低

Recall = TP / (TP + FN)  = 7 / (7 + 1) = 7/8 ---- 提高

可以看出来,希望提高TP,降低FN,所以放宽“查找策略”,导致FP也增加了。

8.3.6 追求精准率 / 加强“查找策略”

宋江道:找到的相关人太多了,我们得提高精准率。

希望 去除查找结果中的不相关好汉 。这时务必要将“查找策略”定的更加严格,这样也会使有一些相关的好汉不再能被查找到,从而使召回率受到影响。

所以要加强  "查找策略",新的 "查找策略"是:桃花山好汉中,男的。

于是得到混淆矩阵是:


预测值 0 (与鲁智深无关联) 预测值 1 (与鲁智深有关联)
真实值 0 (与鲁智深无关联) TN 石秀,杨雄,裴宣,汤隆,刘唐,陶宗旺, 关胜,呼延灼 FP
真实值 1 (与鲁智深有关联) FN 周通,孙二娘,史进,杨春,陈达 TP 武松,杨志,张青

所以得到

Precision = TP / (TP + FP) = 3 / (3 + 0) = 3/3 ---- 提高

Recall = TP / (TP + FN)  = 3 / (3 + 5) = 3/8 ---  降低

可以看出来,希望提高TP,降低FP,所以加强“查找策略”,导致FN也增加了。

0x09 F-Measure / F1 Score

宋江道:精准率和召回率看来是此消彼长的,这便如何是好?

蒋敬说:我们有其他指标可以考虑,比如 F1 Score

在一些场景下要兼顾精准率和召回率,就有 F1 score。F1值就是精确值和召回率的调和均值。

9.1 公式


\[F1=\dfrac{2TP}{2TP+FP+FN}=\dfrac{2\cdot Precision \cdot Recall}{Precision+Recall} \]


9.2 特点

precision一定情况下反映了模型控制假阳 FP 个数的能力,Recall 值反映了正样本的检出率,F1 值综合了两方面。

其实 F1 score 是精准率和召回率的调和平均数,调和平均数的性质就是,只有当精准率和召回率二者都非常高的时候,它们的调和平均才会高。如果其中之一很低,调和平均就会被拉得接近于那个很低的数。

为什么?因为调和平均值上面是一个乘积,所以其更接近较小值,这样查准率或查全率中哪个值较小,调和平均值就更接近这个值,这样的测量指标更严格。

记忆方法:金龙鱼调和油。

9.3 应用场景

在precision和recall两者要求同样高的情况下,可以用F1来衡量。

0x10 TPR,FPR,TNR,FNR

最后介绍个四胞胎,他们长得特别容易混淆。

真正率 True Positive Rate,TPR = TP / (TP+FN);

刻画的是被分类器正确分类的正实例占所有正实例的比例。即所有正例中,有多少被正确地判定为正。我们能看到 TPR 就等于sensitivity

假阳性率 / 假正率 False Positive Rate,FPR = FP / (TN+FP);

刻画的是在所有实际为负类的样本中,预测错误的比例,即所有负例中,有多少被错误地判定为正。在医学上又称误诊率(没有病的人被检测出有病),等于 1 - 特异性(Specificity)

真负率 True Negative Rate, TNR= TN / N = 1 - FPR;

刻画的是被分类器正确分类的负实例占所有负实例的比例,也称为特异度(specificity)。衡量了分类器对负例的识别能力。

假阴性率 False Negative Rate,FNR = FN / (TP + FN);

这是在所有实际为正类的样本中,预测错误的比例,在医学上又称漏诊率(有病的人没有被检测出来),等于 1 - 灵敏性(Sensitivity)

让我们通过一张表格来总结下

缩写 中文名称 等同 医学意义
TPR 真正率 Sensitivity 越大越好,如果为1意味着医生医术高明,诊断全对
FPR 假阳性率 1 - Specificity 误诊率(没有病的人被检测出有病)。越小越好
TNR 真负率 Specificity
FNR 假阴性率 1 - Sensitivity 漏诊率(有病的人没有被检测出来)

这里再介绍一个记忆诀窍

  • Sensitivity 这个词有"过敏"的意思,和患病对应,这样关联起来比较好记。
  • Specificity 这个词有"免疫"的意思,能和未患病相关联,所以也很好记。

0x11 TPR vs FPR

TPR越大越好,FPR越小越好,但这两个指标通常是矛盾的。为了增大TPR,可以预测更多的样本为正例,与此同时也增加了更多负例被误判为正例的情况。

放在具体领域来理解上述两个指标。如在医学诊断中,判断有病的样本。

那么尽量把有病的揪出来是主要任务,也就是第一个指标TPR,要越高越好。

而把没病的样本误诊为有病的,也就是第二个指标FPR,要越低越好。

不难发现,这两个指标之间是相互制约的。如果某个医生对于有病的症状比较敏感,稍微的小症状都判断为有病,那么他的第一个指标应该会很高,但是第二个指标也就相应地变高。最极端的情况下,他把所有的样本都看做有病,那么第一个指标达到1,第二个指标也为1。

  • (TPR=1,FPR=0),为完美分类,也就是这个医生医术高明,诊断全对。

  • (TPR > FPR),医生的判断大体是正确的。

  • (TPR = FPR), 中线上的点,也就是医生全都是蒙的,蒙对一半,蒙错一半;

  • (TPR < FPR),这个医生说你有病,那么你很可能没有病,医生的话我们要反着听,为真庸医。

与recall和precision相互矛盾不同,TPR和FPR呈正相关关系,也就是说TPR增大,FPR也会变大。我们希望TPR能够越大越好(为1),FPR越小越好(为0),但这通常是不可能发生的。

0x12 参考

二分类算法的评价指标:准确率、精准率、召回率、混淆矩阵、AUC

分类算法评价指标详解

召回率与准确率(Precision and Recall)

查全率(Recall),查准率(Precision),灵敏性(Sensitivity),特异性(Specificity),F1,PR曲线,ROC,AUC的应用场景

二分类评估指标F1 & AUC & LogLoss

ROC曲线与AUC

ROC曲线 vs Precision-Recall曲线

ROC曲线与AUC以及LIFT

机器学习中多分类模型的评估方法之--kappa系数

ROC、K-S 曲线、Lift 曲线、PR 曲线

二分类评估,从混淆矩阵说起

检验方法、混淆矩阵、模型评估

上一篇:RecyclerView 性能优化 | 把加载表项耗时减半 (一)


下一篇:skimage函数记录之measure.label和measure.regionprops