[白話解析] 通過例項來梳理概念 :準確率 (Accuracy)、精準率(Precision)、召回率(Recall)和F值(F-Measure)

羅西的思考發表於2020-06-20

[白話解析] 通過例項來梳理概念 :準確率 (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 概念區別

首先,用一個圖例來看看概念區別,圖中橢圓就是 “預測為正類” 的樣本。也能看出兩個概念的定義。

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 曲線

二分類評估,從混淆矩陣說起

檢驗方法、混淆矩陣、模型評估

相關文章