机器学习(ML), 自然语言处理(NLP), 信息检索(IR)等领域, 评估(Evaluation)是一个必要的工作, 而其评价指标往往有如下几点: 准确率(Accuracy), 精确率(Precision), 召回率(Recall) 和 F1-Measure.(注:相对来说,IR 的 ground truth 很多时候是一个 Ordered List, 而不是一个 Bool 类型的 Unordered Collection,在都找到的情况下,排在第三名还是第四名损失并不是很大,而排在第一名和第一百名,虽然都是“找到了”,但是意义是不一样的,因此更多可能适用于 MAP 之类评估指标.)

本文将简单介绍其中几个概念. 中文中这几个评价指标翻译各有不同, 所以一般情况下推荐使用英文.

题外话, 特意问过几个外行的语言老师, accuracy 和 precision 有啥区别啊? 结果被老师盯着看, "你是在耍我么? 考我么? 这什么鬼问题?" 所以还请不要纠结, 我们就原文就好.

现在我先假定一个具体场景作为例子.

假如某个班级有男生 80 人, 女生20人, 共计 100 人. 目标是找出所有女生. 现在某人挑选出 50 个人, 其中 20 人是女生, 另外还错误的把 30 个男生也当作女生挑选出来了. 作为评估者的你需要来评估(evaluation)下他的工作

首先我们可以计算准确率(accuracy), 其定义是: 对于给定的测试数据集,分类器正确分类的样本数与总样本数之比. 也就是损失函数是0-1损失时测试数据集上的准确率[1].

这样说听起来有点抽象,简单说就是,前面的场景中,实际情况是那个班级有男的和女的两类,某人(也就是定义中所说的分类器)他又把班级中的人分为男女两类. accuracy 需要得到的是此君分正确的人总人数的比例. 很容易,我们可以得到:他把其中70(20女+50男)人判定正确了, 而总人数是100人,所以它的 accuracy 就是70 %(70 / 100).

由准确率,我们的确可以在一些场合,从某种意义上得到一个分类器是否有效,但它并不总是能有效的评价一个分类器的工作. 举个例子, google 抓取了 argcv 100个页面,而它索引中共有10,000,000个页面, 随机抽一个页面,分类下, 这是不是 argcv 的页面呢?如果以 accuracy 来判断我的工作,那我会把所有的页面都判断为"不是 argcv 的页面", 因为我这样效率非常高(return false, 一句话), 而 accuracy 已经到了99.999%(9,999,900/10,000,000), 完爆其它很多分类器辛辛苦苦算的值, 而我这个算法显然不是需求期待的, 那怎么解决呢?这就是 precision, recall 和 f1-measure 出场的时间了.

在说 precision, recall 和 f1-measure 之前, 我们需要先需要定义 TP, FN, FP, TN 四种分类情况.

按照前面例子, 我们需要从一个班级中的人中寻找所有女生, 如果把这个任务当成一个分类器的话, 那么女生就是我们需要的, 而男生不是, 所以我们称女生为"正类(positive)"或者"正例(positive case)", 而男生为"负类(negative)"或者"负例(negative case)".

关于性别可能会有一些人表示,欸,为啥就 negative 了呢?是因为我们需要筛选或者测试的是“我们要找的”。比如在一些分类器去寻找垃圾邮件,那么是垃圾邮件即为 positive。它 positive 在 relevant, 在“我们在找它”。

实际上是相关的(Relevant) 实际上是无关(NonRelevant)
被检索到(Retrieved),
被判定是的
TP: True Positives
正确(true)判定正例(positive)
例子中就是正确的判定"这位是女生"
FP: False Positives
错误(false)判定负例(negative),"存伪"
例子中就是分明是男生却判断为女生, 当下伪娘横行, 这个错常有人犯
未被检索到(Not Retrieved),
被判定不是的
FN: False Negatives
错误(false)判定负例(negative),"去真"
代入例子即为, 分明是女生, 这哥们却判断为男生
梁山伯同学表示承让承让
TN: True Negatives
正确(true)判定负例(negative)
也就是一个男生被判断为男生, 像我这样的纯爷们一准儿就会在此处

可以很容易看出, 所谓 TRUE/FALSE 表示从结果的对错, Positive/Negative 表示我们认为的是"是"还是"不是".

代入这张表, 我们可以很容易得到这几个值:

Relevant NonRelevant
Retrieved TP=20 FP=30
Not Retrieved FN=0 TN=50

然后我们可以简单计算:

精确率(precision)的公式是P = \frac{TP}{TP+FP}, 它计算的是所有"正确被检索的结果(TP)"占所有"实际被检索到的(TP+FP)"的比例.

在例子中就是希望知道此君得到的所有人中, 正确的人(也就是女生)占有的比例. 所以其 precision 也就是40%(20女生/(20女生+30误判为女生的男生)).

召回率(recall)的公式是R = \frac{TP}{TP+FN}, 它计算的是所有"正确被检索的结果(TP)"占所有"应该检索到的结果(TP+FN)"的比例.

在例子中就是希望知道此君得到的女生占本班中所有女生的比例, 所以其 recall 也就是100%(20女生/(20女生+ 0 误判为男生的女生))

F1 值就是精确值和召回率的调和均值, 也就是

\frac{2}{F_1} = \frac{1}{P} + \frac{1}{R}

调整下也就是

F_1 = \frac{2PR}{P+R} = \frac{2TP}{2TP + FP + FN}

例子中 F1-measure 也就是约为 57.143%(\frac{2 * 0.4 * 1}{0.4 + 1}).

需要说明的是, 有人[3]列了这样个公式, 对非负实数\beta

F_\beta = \frac{ (\beta^2 + 1) * PR}{\beta^2*P+R}

将 F-measure 一般化.

F1-measure 认为精确率和召回率的权重是一样的, 但有些场景下, 我们可能认为精确率会更加重要, 调整参数 \beta , 使用 F_\beta-measure 可以帮助我们更好的 evaluate 结果.

References


Yu

Ideals are like the stars: we never reach them, but like the mariners of the sea, we chart our course by them.

51 Comments

Yyun · November 24, 2021 at 03:39

Google Chrome 96.0.4664.45 Google Chrome 96.0.4664.45 Windows 10 x64 Edition Windows 10 x64 Edition

谢谢!文章十分清晰!

sun · November 12, 2020 at 20:48

Firefox 82.0 Firefox 82.0 Ubuntu x64 Ubuntu x64

正类判定为负类,应该用FP表示。我说怎么看着别扭呢

    Yu · November 15, 2020 at 12:55

    Google Chrome 86.0.4240.193 Google Chrome 86.0.4240.193 Mac OS X  10.15.7 Mac OS X 10.15.7

    https://en.wikipedia.org/wiki/False_positives_and_false_negatives

    A false positive error, or false positive, is a result that indicates a given condition exists when it does not.

    A false negative error, or false negative, is a test result which wrongly indicates that a condition does not hold.

aaa · August 8, 2020 at 10:52

Google Chrome 84.0.4147.105 Google Chrome 84.0.4147.105 GNU/Linux x64 GNU/Linux x64

感谢分享

zzzz · April 28, 2020 at 02:14

Google Chrome 81.0.4044.122 Google Chrome 81.0.4044.122 Mac OS X  10.15.4 Mac OS X 10.15.4

感谢分享!

shwei · April 3, 2020 at 07:04

Google Chrome 80.0.3987.149 Google Chrome 80.0.3987.149 Mac OS X  10.14.5 Mac OS X 10.14.5

通俗易懂!

Woffee · January 15, 2020 at 21:24

Google Chrome 79.0.3945.117 Google Chrome 79.0.3945.117 Mac OS X  10.15.1 Mac OS X 10.15.1

解释的非常清楚,多谢博主

Donitz · November 20, 2019 at 04:22

Google Chrome 78.0.3904.108 Google Chrome 78.0.3904.108 Mac OS X  10.13.6 Mac OS X 10.13.6

讲的挺好的,收藏了,谢谢博主

陈泰佑 · October 12, 2019 at 11:33

Microsoft Edge 18.18362 Microsoft Edge 18.18362 Windows 10 x64 Edition Windows 10 x64 Edition

本科生小白十分感谢博主的解释,另外,这个网站也做的很好看

    Yu · October 13, 2019 at 01:28

    Google Chrome 77.0.3865.90 Google Chrome 77.0.3865.90 Mac OS X  10.15.0 Mac OS X 10.15.0

    多谢 ~

Ryan · March 12, 2019 at 22:47

Google Chrome 72.0.3626.121 Google Chrome 72.0.3626.121 Windows 7 x64 Edition Windows 7 x64 Edition

Hi YU
想提出一個問題,文中提到google 抓取了argcv 100個頁面的例子,只看accuracy是看不足的,需要引入precision, recall 和f1-measure來判斷,但我不太理解若加入這三個指標,怎麼判斷上述的例子有不佳的地方?

    Yu · March 12, 2019 at 23:09

    Google Chrome 72.0.3626.121 Google Chrome 72.0.3626.121 Mac OS X  10.14.3 Mac OS X 10.14.3

    你好,

    假如 Google 有 10,000,000 个页面,其中包括 argcv 的 100 个页面。如果我们继续使用文中提到的分类器(即所有的都无脑判断为非 argcv )。

    以 “是 argcv 的页面” 为正例。那么它的 TP 和 FP 都是 0,FN 为 100,TN 为 9999900,代入公式 Precision NaN,Recall 和 F1 结果都是 0。由此判断这个“分类器” 是不堪用的。

    这几个指标和之前的 “猜对” 相比,增加了 “猜测为正的样本有多少是正确的” 和 “有多少实际上为正的样本被找到了” 两个考虑。

      Ryan · March 13, 2019 at 03:35

      Google Chrome 72.0.3626.121 Google Chrome 72.0.3626.121 Windows 7 x64 Edition Windows 7 x64 Edition

      瞭解了,謝謝YU :)

Leave a Reply

Your email address will not be published. Required fields are marked *