机器学习(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

caixiong · December 15, 2018 at 01:48

Google Chrome 71.0.3578.80 Google Chrome 71.0.3578.80 GNU/Linux x64 GNU/Linux x64

刚才看了下评论,有童鞋给楼主指出了一些小细节错误。那么现在看到的版本应该是楼主修正过后的版本把?

    yu · December 17, 2018 at 01:21

    Google Chrome 71.0.3578.98 Google Chrome 71.0.3578.98 Mac OS X  10.14.2 Mac OS X 10.14.2

    @caixiong 对。特别感谢各位指点。

Joanna · September 19, 2018 at 01:45

Google Chrome 69.0.3497.100 Google Chrome 69.0.3497.100 Windows 10 x64 Edition Windows 10 x64 Edition

写得很清楚!最近正在看书,遇到这里不是很懂,非常感谢!

goudou · July 20, 2018 at 02:37

Google Chrome 63.0.3239.132 Google Chrome 63.0.3239.132 Windows 10 x64 Edition Windows 10 x64 Edition

Thanks a lot!

自學撚 · July 17, 2018 at 02:24

Google Chrome 67.0.3396.99 Google Chrome 67.0.3396.99 Mac OS X  10.13.2 Mac OS X 10.13.2

Thanks. 很清楚的教學。有關precision and recall,這張圖對理解都有幫助: https://www.kdnuggets.com/images/precision-recall-relevant-selected.jpg

    yu · July 20, 2018 at 20:16

    Google Chrome 67.0.3396.99 Google Chrome 67.0.3396.99 Mac OS X  10.13.6 Mac OS X 10.13.6

    @自學撚 Awesome, 这张图很清楚

    shwei · April 3, 2020 at 07:09

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

    这张图真的很清楚,感谢

花猪 · April 24, 2018 at 07:42

Google Chrome 66.0.3359.117 Google Chrome 66.0.3359.117 Windows 10 x64 Edition Windows 10 x64 Edition

那么问题来了,请问楼主在平常调模型时,是主要看查准率还是召回率?by the way,你的网页是咋晓得我学校的,嘿嘿

    yu · April 24, 2018 at 14:05

    Google Chrome 65.0.3325.181 Google Chrome 65.0.3325.181 Mac OS X  10.13.4 Mac OS X 10.13.4

    @花猪 在本篇语境下, 当然应该使用 f1 score. Precision & Recall 都只是用于指导自己向什么方向调整.

    FYI, 通过 IP 段指向一个字典获取

金小木 · February 13, 2018 at 01:34

Google Chrome 56.0.2924.87 Google Chrome 56.0.2924.87 Windows 7 x64 Edition Windows 7 x64 Edition

讲得很清楚明白,感谢!

CruiseMa · January 15, 2018 at 22:07

Google Chrome 63.0.3239.132 Google Chrome 63.0.3239.132 Windows 10 x64 Edition Windows 10 x64 Edition

浅显易懂,感谢分享

Guo · August 14, 2017 at 23:48

Google Chrome 60.0.3112.90 Google Chrome 60.0.3112.90 Windows 8.1 x64 Edition Windows 8.1 x64 Edition

最后的加权调和平均数那里,分母的a^2后面应该没有括号的吧?

    yu · August 15, 2017 at 06:28

    Google Chrome 60.0.3112.90 Google Chrome 60.0.3112.90 Mac OS X  10.12.6 Mac OS X 10.12.6

    @Guo 额… 我查了下 wikipedia, 你是对的…..

    yu · August 15, 2017 at 06:28

    Google Chrome 60.0.3112.90 Google Chrome 60.0.3112.90 Mac OS X  10.12.6 Mac OS X 10.12.6

    @Guo 多谢!

chenang · May 23, 2017 at 09:15

Google Chrome 58.0.3029.81 Google Chrome 58.0.3029.81 Windows 7 x64 Edition Windows 7 x64 Edition

请问楼主,多分类问题时,有多个类别需要分类,tp、fp、fn、tn怎么确定呢?谢谢

    yu · May 23, 2017 at 10:20

    Google Chrome 58.0.3029.110 Google Chrome 58.0.3029.110 Mac OS X  10.12.4 Mac OS X 10.12.4

    @chenang 对每个二分类. 对 alice, bob, carol. 那么在计算 alice 的时候, bob 和 carol 皆算负例

frewise · November 11, 2016 at 11:12

Google Chrome 53.0.2785.143 Google Chrome 53.0.2785.143 Windows 10 x64 Edition Windows 10 x64 Edition

谢谢作者的解释,清楚很多。
另外,请检查github链接是否有问题

    yu · November 11, 2016 at 13:03

    Google Chrome 54.0.2840.87 Google Chrome 54.0.2840.87 Mac OS X  10.12.1 Mac OS X 10.12.1

    @frewise 多谢提醒。已修链接(其实就是几行代码)。

Alexander · October 14, 2016 at 11:58

Google Chrome 52.0.2743.116 Google Chrome 52.0.2743.116 GNU/Linux x64 GNU/Linux x64

你好,你的Accuracy的例子中,“现在某人挑选出50个人,其中20人是女生,另外还错误的把30个男生也当作女生挑选出来了.”,按照这句话的意思,那么这个分类器应该是把50个人正确分类了20个女生,错误分类了30个男生。那么,“很容易,我们可以得到:他把其中70(20女+50男)人判定正确了,而总人数是100人,所以它的accuracy就是70 %(70 / 100).”,我不是很清楚这里的70是怎么来。

    yu · October 14, 2016 at 14:19

    Google Chrome 53.0.2785.143 Google Chrome 53.0.2785.143 Mac OS X  10.12.0 Mac OS X 10.12.0

    @Alexander 分对了的人数

    yu · October 14, 2016 at 14:24

    Google Chrome 53.0.2785.143 Google Chrome 53.0.2785.143 Mac OS X  10.12.0 Mac OS X 10.12.0

    @Alexander 即后文所说的 true positive 和 true negative 之和

      Alexander · October 15, 2016 at 10:45

      Google Chrome 52.0.2743.116 Google Chrome 52.0.2743.116 GNU/Linux x64 GNU/Linux x64

      @yu 对,准确率公式是:\begin{equation}
      accuracy=\frac{TP+TN}{TP+TN+FP+FN}
      \end{equation}

Keven · October 11, 2016 at 17:57

Google Chrome 53.0.2785.89 Google Chrome 53.0.2785.89 Mac OS X  10.12.0 Mac OS X 10.12.0

谢谢yu,写的很清楚。
一般评估时,P、R和F1都要看。

Jelly · July 6, 2016 at 10:15

Google Chrome 51.0.2704.103 Google Chrome 51.0.2704.103 Windows 10 x64 Edition Windows 10 x64 Edition

第一句前两个缩写颠倒了

    yu · July 6, 2016 at 22:46

    Google Chrome 51.0.2704.103 Google Chrome 51.0.2704.103 Mac OS X  10.11.5 Mac OS X 10.11.5

    @Jelly 啊…. 尴尬
    多谢指出

Choey · April 22, 2016 at 00:10

Google Chrome 49.0.2623.112 Google Chrome 49.0.2623.112 Mac OS X  10.11.4 Mac OS X 10.11.4

楼主好,请问如果在这个情境下,只能抽取10个女生,那这样算recall是用找到的(女生数/10)吗?那这时候precision是不是也是(女生数/10)?这样他们的区别在哪里呢?

谢谢楼主讲解的这么清楚易懂!

    yu · April 22, 2016 at 06:25

    Google Chrome 49.0.2623.112 Google Chrome 49.0.2623.112 Mac OS X  10.11.4 Mac OS X 10.11.4

    @Choey 这个“只能抽取10个”的假设有问题。
    做 evaluation 的前提是对每一个候选内容做 true/false 的价值判断。你 predict 的时候或许可以做个 global 的 threshold,说最多找 10 个。那么计算的时候,precision 的确是 找到女生数/10, 这个10 是你找到的个数。 而 recall 应该是 找到女生数/20, 因为女生的全集数量有 20.

    此外提醒下,f-score 是对分类器的评测,是就是是,否就是否,是和否之间绝对不一样,而是和是之间没有排列关系。若你做的是 information retrieval 的话,那么可能涉及到 ranking 的问题,比如第一位和第二十位可能并不一样,而第一位和第二位在哪个位置区别不太大。这个时候你应该用 MAP.

zhuwei · April 6, 2016 at 19:15

Google Chrome 49.0.2623.75 Google Chrome 49.0.2623.75 Mac OS X  10.10.3 Mac OS X 10.10.3

你的意思是虽然抽样了50个样本,30个分类错误,而总样本数是100,也就是70个分类正确,所以准确率为70/100*100%=70%,我理解的对吗?

Kevin · April 5, 2016 at 21:44

Google Chrome 49.0.2623.87 Google Chrome 49.0.2623.87 Windows 8.1 x64 Edition Windows 8.1 x64 Edition

对我这样的小白,感觉解释还是挺清楚的。多谢!

Charlie · November 12, 2015 at 17:34

Google Chrome 46.0.2490.80 Google Chrome 46.0.2490.80 Windows 7 Windows 7

问您呀 哪些情况下侧重关注准确率,哪些情况侧重关注召回率?

    yu · November 12, 2015 at 20:27

    Google Chrome 46.0.2490.80 Google Chrome 46.0.2490.80 Mac OS X  10.11.1 Mac OS X 10.11.1

    @Charlie 我猜你是指precision,本文译为精确率,以区别于accuracy。这个翻译来自李航的统计学习方法。

    当你希望结果是宁缺毋滥的时候,precious比较高比较好,而你希望得到尽可能比较多的结果的时候,你可能会期望recall比较高。

    个人以为,precision和recall是在具体场景下的判断。比如如果我们想要验证用现代医学来寻找中药有那些有用的成分。若我们资源比较少,那么我们会寻找少量,更可能有效的药物。那么precision会比较重要。而若反之,国家投入大笔资金来做这件事,那么我们完全有精力把可能性小一些的也研究一下–说不定有用呢?recall在这时候就会更加重要。

Jermyn · September 11, 2015 at 11:13

Google Chrome 45.0.2454.85 Google Chrome 45.0.2454.85 Windows 7 x64 Edition Windows 7 x64 Edition

博主关于F1的定义:1/F1 = 1/P + 1/R 似乎有点问题。
2/F1 = 1/P + 1/R 才跟后面的公式吻合。

    yu · September 11, 2015 at 12:32

    Google Chrome 45.0.2454.85 Google Chrome 45.0.2454.85 Mac OS X  10.10.5 Mac OS X 10.10.5

    @Jermyn
    多谢指出.汗….

    这个公式我是抄的航书的,书上原文是正确的,我当时也是拿着正确的公式推了下,然后写在这儿写错了.

    所以错误完全在我.非常抱歉.

      Jermyn · September 19, 2015 at 14:12

      Google Chrome 45.0.2454.93 Google Chrome 45.0.2454.93 Windows 7 x64 Edition Windows 7 x64 Edition

      @yu
      博主辛苦了,写得非常简明易懂。作为一名初学者,觉得受益匪浅。

Sky · March 1, 2014 at 20:28

Google Chrome 33.0.1750.117 Google Chrome 33.0.1750.117 Windows 7 x64 Edition Windows 7 x64 Edition

因為我才剛入門,其實對我幫助居多啦,你的說明方式對我起了很好理解幫助,這樣活用生動的說法(祝英台、偽娘),比起生硬的教材上說法,更讓我容易懂,感謝你的分享,也希望你的分享能幫助別人更多。

Sky · March 1, 2014 at 01:35

Google Chrome 33.0.1750.117 Google Chrome 33.0.1750.117 Windows 7 x64 Edition Windows 7 x64 Edition

您的文字說明很正確,但是似乎有部分小錯:
TP=20
FP=30
FN=0
TN=50
___________________________________
表格的FN和FP位置似乎應該調換,
但是其中文字說明好像沒錯,
也就是你說明的祝英台=FN 和 偽娘=FP;
___________________________________
再麻煩你仔細確認看看我以上提的對不對,謝謝。

    yu · March 1, 2014 at 09:59

    Google Chrome 33.0.1750.117 Google Chrome 33.0.1750.117 Windows 8.1 x64 Edition Windows 8.1 x64 Edition

    @Sky 多謝您的指出,因為後台畫表格的時候犯迷糊了,把寫好的內容貼錯了位置.更詭異的是當時好像預覽了下表格效果,將錯就錯的按照表格得到了錯誤的數據。

    寫這些東西本就是將自己學到的東西向大家分享,期望能幫助誰更容易的理解這些東西,結果因為沒有嚴肅的審查自己所寫的內容,反而有誤導您之嫌 — 真是抱歉

Leave a Reply

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