二分類和多分類問題下的評價指標詳析(Precision, Recall, F1,Micro,Macro)

二分類下的評價指標

Accuracy

分類算法有很多,不同分類算法有很多不同的變種。不同的分類算法有着不同的原理和結構,同時在不同的數據集上變現的效果也不同,我們需要根據特定的任務進行算法的選擇,如何選擇分類,如何評價一個分類算法的好壞,就需要一定能量化的評價指標進行評價。這裏最比較常見和易於理解的就是Accuracy,它的公式也比較簡單:劃分正確的樣本數 / 所有的樣本數。代表的即是模型對所有樣本的分類準確率。

但是爲什麼有了Accuracy還不夠呢?因爲Accuracy這一指標在Unbalanced數據集上的表現很差。舉個例子就是,假設我們的數據集中,有990個負樣本,而只有10個正樣本,則我們的模型可以將這1000個樣本結果都預測爲負樣本,此時模型的分類準確路Accuracy仍然可以有99%,而此時該模型其實並沒有學習到數據中的特徵分佈。比如利用該模型去預測是否會發生地震,則會完全失去預警功能。

所以我們就要引入了其他幾種評價指標。剛剛提到過,上述模型無法對正樣本進行有效的預測,即使準確率高達99%。那麼爲了去衡量其在正樣本中的分類能力,就有了Precision和Recall兩個指標,Precision和Recall都是着重關注模型在正樣本中的分類能力。

在介紹接下來的內容前,首先我們先假設模型的預測結果爲pred=[0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1],標籤爲Label=[1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1]

幾個常用的術語

這裏首先介紹幾個常見的模型評價術語,現在假設我們的分類目標只有兩類,計爲正例(positive)和負例(negative)分別是:

1)True positive(TP): 被正確地劃分爲正例的個數,即實際爲正例且被分類器劃分爲正例的樣本數
2)False positive(FP):被錯誤地劃分爲正例的個數,即實際爲負例但被分類器劃分爲正例的樣本數。
3)False negative(FN):被錯誤地劃分爲負例的個數,即實際爲正例但被分類器劃分爲負例的樣本數
4)True negative(TN):被正確地劃分爲負例的個數,即實際爲負例且被分類器劃分爲負例的樣本數

如何理解True/False positive/negative呢?
就是第一個True/False表示的時候分類器的結果是否正確,而positive/negative表示的是分類器的結果。所以FP表示的是分類器的分類結果爲positive,False表示分類器的分類結果並不正確,即實際應該爲negative。所以FP表示的就是實際爲負例但被分類器劃分爲正例的樣本數。

Precision

精確率表示的是在所有預測結果爲真中的準確率。公式如下:
在這裏插入圖片描述
其中Tp表示的在預測結果中,預測爲真同時正確的樣本數,FN表示在預測結果中,預測爲真但實際爲假的樣本數。Tp+Fp所表示的實際上就是預測結果中所有的正例數。比如在上面舉例的pred和label中,pred預測結果中的正例數爲7,而通過pred和label的對比可以看出,正例中預測正確的個數爲6個(除了第5個位置上的0預測成了1)。所以,此時的precision=6/(6+1) = 6/7。

所以可以看出,precision關注的是模型在預測結果爲真中的準確率,表示的是模型在預測結果爲真時的可信度,而不關心模型能從真正的正例中識別出多少正例。比如,如果我預測結果爲3個1且都預測正確,則此時的precision=1。

Recall

Recall召回率表示的是在Label中的所有正類中被預測爲正類的比例。衡量的是模型對實際正類的提取能力。
在這裏插入圖片描述
其中FN表示的是實際上爲真,但被分類器預測爲假。因此Tp+FN表示的相當於就是Label中所有正類的個數。所以同樣可以看出Recall關注的是模型在所有真正正類中的準確率,反應了一個模型能識別出正類的能力。同樣以上面的例子爲例,Tp仍然爲6,此時FN=2(第一個位置和第八個位置)。此時Tp+FN=8,也正好等於label中的所有爲正類1的個數。而當我預測結果爲3個1且都正確時,此時的Recall=3/8。

因此以上兩個評價指標則將模型在正類中的分類能力進行了劃分。Precision衡量模型預測正類時的準確率,Recall衡量模型識別出正類的能力。

F1-score

表示的是精確率和召回率的調和平均。由上面的分析可知,Precision和Recall反應了模型兩個不同方面的能力,而F1-score相當於是表示模型在這兩方面的一個綜合水平。
在這裏插入圖片描述

從實際應用來理解Precision和Recall的區別可以是,比如寧可錯殺一千,不可放過一個,體現的就是召回率的思想,即是要求識別“罪犯”的能力很強。而在一些需要精準性比較高的領域,則要求每次的預測結果都要十分精準,就需要比較高的Precision。同時也可以發現,Precision和Recall兩者往往不能兼得。比如同樣的寧可錯殺一千,不可放過一個,就意味着要犧牲精確性。因爲此時在你識別出的“罪犯”中真正的“罪犯”佔的是少數,所以精確性就會降低。所以需要在具體的實際應用中,選擇是更看重精確性還是召回率,或者利用F1-score找到兩者比較平衡的一個點。

多分類問題下的評價指標

在二分類問題中,只有0,1兩種分類情況。而實際中我們經常會遇到多分類問題,比如NER中對每個字符判斷其所屬類別等等。在這種情況下,我們可以把每個類別單獨視爲正類,其他的類別視爲負類,因此相當於對每個類別都轉化成了一個“二分類的情況”。
Wikipedai中對Confusion Matrix的介紹
鏈接:https://en.wikipedia.org/wiki/Confusion_matrix
多分類的情況可以用一個混淆矩陣來表示,例如下面的混淆矩陣。可以看出混淆矩陣是一個n*n的矩陣,n表示多分類的類別數。

M = [
[325, 32, 9, 0, 0, 2, 236],
[57, 750, 454, 20, 0, 11, 23],
[0, 128, 157, 71, 0, 11, 0],
[8, 0, 160, 112, 0, 0, 0],
[0, 321, 39, 2, 150, 0, 0],
[0, 145, 52, 30, 0, 189, 0],
[48, 35, 0, 0, 0, 0, 237]
]
其中對角線上表示的是分類正確的樣本。通過上圖可以看出,行代表了真實的類別列代表了預測的類別。第一行中的[325, 32, 9, 0, 0, 2, 316],表示有325個類別1被預測爲類別1,有32個類別1被預測爲類別2,有9個類別1被預測爲類別3,有2個類別1被預測爲類別6,有236個類別1被預測爲7。
所以真實的正類共有325+32+9+2+236=604,其中FN=32+9+2+236=279,TP=325。

因此可以得出此類別1下的召回率爲325/604=0.538

同樣的由於列代表的是預測結果,所以計算精確率的時候要關注列的結果。
第一列[325, 57, 0, 8, 0, 0, 48]表示的是在預測結果中,有325個類別1被預測爲類別1, 有57個類別2預測成了類別1,有8個類別4預測成了類別1,有48個類別7預測成了類別1。所以此時仍然可以得出:
TP=325,FP=57+8+48=113 (FP表示分類器預測爲正類但實際爲負類的樣本數)。
因此同樣可以得出類別1下的Precision=325/438=0.742

以此類推可以對每一類別計算其對應的Precision和Recall。這裏要理解就是爲什麼Precision是計算的列和,Recall計算的是行和。因爲列代表的是預測結果,行代表的是真實結果。

多分類問題下的micro-F1(微平均)和macro-F1(宏平均)

在n個二分類混淆矩陣上要綜合考察評價指標的時候就會用到宏平均和微平均。也就是在計算多分類問題時的F1-score的兩種策略。

micro-F1(微平均):Calculate metrics globally by counting the total true positives, false negatives and false positives.

macro-F1(宏平均):Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.

通過上面的定義可以發現,micro的意思就是對所有類別求出總體的TP、FN、FP,然後再計算出總體的Precison、Recall最後再利用F1=2*P*R/(P+R)來計算出F1-score。而macro的意思就是先對每個類別求出對應的Precision、Recall、F1這些指標,然後進行平均來求出總體的F1-score。

看下面的例子:

y_label = [1, 1, 3, 0, 2, 2, 1, 3, 0]
y_pred = [1, 1, 2, 0, 0, 2, 3, 3, ,0]

假設有這個簡單的模型輸出結果,y_pred利用argmax取出每個softmax之後的最大位置的值。可以看出總共有4類。

micro微平均

對於類別0,分析時可以將其他類看作負類,則上式可以轉化爲:

y_pred=[0, 0, 0 ,1, 0, 0, 0, 0, 1]
y_label=[0, 0, 0, 1, 1, 0, 0, 0, 1]

可以看出此時的TP=2, FP=0,FN=1。

對於類別1,同樣進行轉化爲:

y_pred=[1, 1, 0, 0, 0, 0, 1, 0, 0]
y_label=[1, 1, 0, 0, 0, 0, 0, 0, 0]

可以看出此時的TP=2, FP=1,FN=0

對於類別2,同樣進行轉化爲:

y_pred=[0, 0, 1, 0, 0, 1, 0, 0, 0]
y_label=[0, 0, 0, 0, 1, 1, 0, 0, 0]

可以看出此時的TP=1,FP=1,FN=1

對於類別3,同樣進行轉化Wie:

y_pred=[0, 0, 0, 0, 0, 0, 1, 1, 0]
y_label=[0, 0, 1, 0, 0, 0, 0, 1, 0]

可以看出此時的TP=1,FP=1,FN=1

所以綜上可以得出:

TP=2+2+1+1=6,FP=0+1+1+1=3,FN=1+0+1+1=3

所以可以得出:

micro-P=6/(6+3)=0.667
micro-P=6/(6+3)=0.667
micro-F1=2*P*R/(P+R)=0.667

macro-宏平均

按照上述的做法:
類別0時:

macro-P=2/2=1
macro-R=2/(2+1)=2/3
macro-F1=2*P*R/(P+R)=4/5

類別1時:

macro-P=2/(2+1)=2/3
macro-R=2/(2+0)=1
macro-F1=2*P*R/(P+R)=4/5

類別2時:

macro-P=1/(1+1)=1/2
macro-R=1/(1+1)=1/2
macro-F1=2*P*R/(P+R)=1/2

類別3時:

macro-P=1/(1+1)=1/2
macro-R=1/(1+1)=1/2
macro-F1=2*P*R/(P+R)=1/2

所以此時,最終的macro結果爲:

macro-P=(1+2/3+1/2+1/2) / 4 = 2/3
macro-R=(2/3+1+1/2+1/2) / 4 = 2/3
macro-F1=(4/5+4/5+1/2+1/2) / 4= 13/20

以上就是在micro微平均和macro宏平均上的計算過程。便於理解兩者之間的原理和差異。宏平均比微平均更合理,但也不是說微平均一無是處,具體使用哪種評測機制,還是要取決於數據集中樣本分佈。類別極度不均衡的時候也需要考慮用 weighted進行處理,用 Macro 一般情況會拉低(因爲小數量的類別一般情況下預測不好,但最後又是 mean)。

其他資料:
詳解多分類模型的Macro-F1/Precision/Recall計算過程
sklearn中 F1-micro 與 F1-macro區別和計算原理
多分類問題中的精確率與召回率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章