二分類和多分類的性能評價指標及python計算

一、二分類

real\predict Positive Negative
True TP FN
False FP TN

(注意:True和Negative交叉處應爲FN而非TN,因爲是錯誤地預測爲反例,False和Positive交叉處同理)

  • TP、TN、FP、FN 中的第二個字母(列標首字母)是機器學習算法或模型預測的結果(正例:P、反例:N)
  • TP、TN、FP、FN 中的第一個字母(行標首字母)是根據真實情況判斷預測結果是否正確(正確:T、錯誤:F)

即:

  • 正確地預測爲正例:TP
  • 正確地預測爲反例:TN
  • 錯誤地預測爲正例:FP
  • 錯誤地預測爲反例:FN

準確率Accuracy:被預測正確的比例
accuracy=TP+TNTP+FP+FN+TNaccuracy = \frac{TP+TN }{TP + FP + FN + TN}
精確率(查準率) Precision :"正確被預測爲正(TP)"佔所有"實際被預測爲正的(TP+FP)"的比例(混淆矩陣中除以所在的那一列之和)

precision=TPTP+FPprecision = \frac{TP }{TP + FP}

召回率(查全率) Recall:"正確被預測爲正(TP)"佔所有"應該被預測爲正(TP+FN)"的比例(混淆矩陣中除以所在的那一行之和)

recall=TPTP+FNrecall = \frac{TP }{TP + FN}

F-measure

Fmeasure=(a2+1)PRa2(P+R)F- measure = \frac{(a^2 + 1 )*P*R}{a^2(P+R)}

如果A取1,那麼F-measure實際上就是precison和recall的調和平均值, 此時的F-measure就稱爲F1值。

F1=2PRP+RF- 1 = \frac{2PR}{P+R}

二、多分類

real\predict 類1 類2 類3
類1 43 5 2
類2 2 45 3
類3 0 1 49

每一行之和爲50,表示50個樣本。
第一行說明類1的50個樣本有43個分類正確,5個錯分爲類2,2個錯分爲類3。

類似於二分類,多類分類問題中,分類結果一般有4種情況:

  • 屬於類C的樣本被正確分類到類C,記這一類樣本數爲 TP
  • 不屬於類C的樣本(可能是A也可能是B…)被錯誤分類到類C,記這一類樣本數爲 FN
  • 屬於類別C的樣本被錯誤分類到類C的其他類,記這一類樣本數爲 TN
  • 不屬於類別C的樣本被正確分類到了類別C的其他類,記這一類樣本數爲 FP

宏平均 Macro-average

Macro F1:將n分類的評價拆成n個二分類的評價,計算每個二分類的F1 score,n個F1 score的平均值即爲Macro F1。

微平均Micro-average

Micro F1:將n分類的評價拆成n個二分類的評價,將n個二分類評價的TP、FP、TN、FN對應相加,計算評價準確率和召回率,由這2個準確率和召回率計算的F1 score即爲Micro F1。
(TP + FP) / (TP + TN + FP + FN),實際上就是accuracy,分母就是輸入分類器的預測樣本個數,分子就是預測正確的樣本個數(無論類別)。

一般來講,Macro F1、Micro F1高的分類效果好。Macro F1受樣本數量少的類別影響大。
宏平均比微平均更合理,但也不是說微平均一無是處,具體使用哪種評測機制,還是要取決於數據集中樣本分佈。

例:

考慮現在輸入分類器的樣本有10個,他們屬於類別A B C。

假設這10個樣本的真實類標爲(有序)和分類器預測的類標分別是:

真實:A A A C B C A B B C
預測:A A C B A C A C B C

precision(A) = 3(正確預測爲A類的樣本個數爲3) / 4(預測爲A類的樣本數爲4) = 0.75 recall(A) = 3 / 4(真實A類樣本有4個) = 0.75

precision(B) = 1 / 2 = 0.5 recall(B) = 1 / 3 = 0.3333

precision(C) = 2 / 3 = 0.6667 recall(C) = 2 / 3 = 0.6667

F值計算出來之後,取算術平均就是Macro-average

Micro-average = 6(預測正確的樣本個數) / 10 = 0.6

三、ROC曲線和AUC

ROC

ROC的全名叫做Receiver Operating Characteristic,即受試者工作特徵曲線。

ROC關注兩個指標:

True Positive Rate ( TPR ) = TP / [ TP + FN] ,TPR真陽性率,即判斷爲正例且實際爲正例的個數佔全部正例的比例,即precision

False Positive Rate( FPR ) = FP / [ FP + TN] ,FPR假陽性率,即判斷爲正例但實際爲負例的比例

ROC曲線只對二分類問題有效。而尤其當正負樣本不平衡時,這種評價比起準確率更有效(只要想想把垃圾郵件分類器如果把所有郵件都識別爲不是垃圾郵件,也可以得到90%以上的準確率,但這沒有任何意義)。

在ROC 空間中,每個點的橫座標是FPR,縱座標是TPR,這也就描繪了分類器在TP(真正的正例)和FP(錯誤的正例)間的trade-off。ROC的主要分析工具是一個畫在ROC空間的曲線——ROC curve。

我們知道,對於二值分類問題,實例的值往往是連續值,我們通過設定一個閾值,將實例分類到正類或者負類(比如大於閾值劃分爲正類)。因此我們可以變化閾值,根據不同的閾值進行分類,根據分類結果計算得到ROC空間中相應的點,連接這些點就形成ROC curve。在這裏插入圖片描述
ROC curve經過(0,0)(1,1),實際上(0, 0)和(1, 1)連線形成的ROC curve實際上代表的是一個隨機分類器。一般情況下,這個曲線都應該處於(0, 0)和(1, 1)連線的上方。
(0,1),即FPR=0, TPR=1,這意味着FN(false negative)=0,並且FP(false positive)=0。這是一個完美的分類器,它將所有的樣本都正確分類。
(1,0),即FPR=1,TPR=0,類似地分析可以發現這是一個最糟糕的分類器,因爲它成功避開了所有的正確答案。
(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以發現該分類器預測所有的樣本都爲負樣本(negative)。
(1,1),分類器實際上預測所有的樣本都爲正樣本。

對於ROC曲線,我們可以這樣理解,對於二分類問題,曲線的每一個點都代表一個閾值,分類器給每個樣本一個得分,得分大於閾值的我們認爲是正樣本,小於閾值的我們認爲是負樣本

若學習器A的ROC曲線將另外一個學習器B的曲線完全包住,則A的性能一定比B好,否則若二者曲線有交叉,則可以較爲合理的認爲ROC曲線越接近左上角,也就是AUC值越大,整個分類器的性能越好。

AUC

用ROC curve來表示分類器的performance很直觀好用。可是,人們總是希望能有一個數值來標誌分類器的好壞。

於是Area Under roc Curve(AUC) 就出現了。AUC(Area Under Curves)指的是ROC曲線下的面積,該指標能較好的概括不平衡樣本分類器的性能而成爲很多數據挖掘競賽的判定標準。

AUC的計算

由於僅有有限個樣本,無論訓練樣本還是測試樣本,因此無法獲得最精確的ROC曲線,從而無法精確計算AUC。在實際計算中,使用類似微積分的方法,用梯形面積的和去近似。通常,AUC的值介於0.5到1.0之間,較大的AUC代表了較好的Performance。
關於實際編程中的計算,知乎中有一個回答是這樣說的:
在這裏插入圖片描述

AUC的物理意義

假設分類器的輸出是樣本屬於正類的socre(置信度),則AUC的物理意義爲,任取一對(正、負)樣本,正樣本的score大於負樣本的score的概率。從而我們能夠理解對於AUC而言,並不關心具體預測的結果是標籤或者概率,也不需要卡什麼閾值,只要在預測結果之間有排序即可。

如果分別在兩份數據上計算出AUC爲AUC_1和AUC_2,問整體數據的AUC是多少?
答案其實是無法得到,因爲從局部的有序無法直接退出全局的有序,這個題目其實還是考查對於AUC這個指標的理解深度。

四、P/R曲線

P-R曲線刻畫查準率和查全率之間的關係,查準率指的是在所有預測爲正例的數據中,真正例所佔的比例,查全率是指預測爲真正例的數據佔所有正例數據的比例。
即:
查準率(Precision) P=TP/(TP + FP)
查全率(Recall) R=TP/(TP+FN)

在很多情況下,我們可以根據學習器的預測結果對樣例進行排序,排在前面的是學習器認爲最可能是正例的樣本,排在後面的是學習器認爲最不可能是正例的樣本,按此順序逐個把樣本作爲正例進行預測,則每次可計算當前的查全率和查準率,以查準率爲y軸,以查全率爲x軸,可以畫出下面的P-R曲線。平衡點(BEP)是查準率=查全率時的取值,如果這個值較大,則說明學習器的性能較好。
在這裏插入圖片描述
P/R和ROC如何選擇?

  • P/R和ROC是兩個不同的評價指標和計算方式,一般情況下,檢索用前者,分類、識別等用後者。
  • 在很多實際問題中,正負樣本數量往往很不均衡。比如,計算廣告領域經常涉及轉化率模型,正樣本的數量往往是負樣本數量的1/1000,甚至1/10000。若選擇不同的測試集,P-R曲線的變化就會非常大,而ROC曲線則能夠更加穩定地反映模型本身的好壞。所以,ROC曲線的適用場景更多,被廣泛用於排序、推薦、廣告等領域。
  • 但需要注意的是,選擇P-R曲線還是ROC曲線是因實際問題而異的,如果研究者希望更多地看到模型在特定數據集上的表現,P-R曲線則能夠更直觀地反映其性能。
  • PR曲線比ROC曲線更加關注正樣本,而ROC則兼顧了兩者。
  • AUC越大,反映出正樣本的預測結果更加靠前。(推薦的樣本更能符合用戶的喜好)
  • 當正負樣本比例失調時,比如正樣本1個,負樣本100個,則ROC曲線變化不大,此時用PR曲線更加能反映出分類器性能的好壞。這個時候指的是兩個分類器,因爲只有一個正樣本,所以在畫auc的時候變化可能不太大;但是在畫PR曲線的時候,因爲要召回這一個正樣本,看哪個分類器同時召回了更少的負樣本,差的分類器就會召回更多的負樣本,這樣precision必然大幅下降,這樣分類器性能對比就出來了。

五、mAP

mAP,即mean Average Precision,也就是平均的平均精確度(沒錯,就是兩個平均),首先是一個類別內,求平均精確度(Average Precision),然後對所有類別的平均精確度再求平均(mean Average Precision)。
mAP常用於目標檢測,多個類別物體檢測中,每一個類別都可以根據recall和precision繪製一條PR曲線,AP就是該曲線下的面積,mAP是多個類別AP的平均值。

計算不同Recall值下的Precision的平均值,就得到了所謂的Average Precision。對不同的Recall值,可以有不同的取值方法,其中PASCAL VOC 2007和PASCAL VOC 2012 中採取的是如下兩種不同的方式。

PASCAL VOC 2007的AP

對於上面的PR曲線,取(0.0, 0.1, 0.2 …… 1.0)共11個Recall值,計算Precision的平均值。考慮到在樣本有限的情況下,有可能出現如下圖這樣的抖動,即Recall值較大時,Precision反而比Recall較小時的值更大。因此,還需採取一定的平滑措施,計算方式如下。
在這裏插入圖片描述
AP=111r{0,0.1,,1.0}ρinterp(r)ρinterp(r)=maxr^:r^r(r^)\begin{aligned} A P=\frac{1}{11} \sum_{r \in\{0,0.1, \ldots, 1.0\}} & \rho_{\text {interp}}(r) \\ \rho_{\text {interp}}(r)=& \max _{\hat{r}: \hat{r} \geqslant r}(\hat{r}) \end{aligned}
實際上就是對於每個Recall值下的Precision,取所有比當前值大的Recall對應的Precision的最大值作爲當前Recall值下的Precision,對應上圖,就是取當前recall值右側的最大Precision作爲當前的Precision。平滑後,得到的就是如上面紅色虛線所示的值。
上面的計算過程,可以看成是把橫座標分成11個bin,每個bin的寬度就是111\frac{1}{11},高度就是Precision值,AP值就是這11個bin的面積和。如上圖的計算過程如下
AP=111(1+0.6666+0.4285+0.4285+0.4285+0+0+0+0+0+0)=0.2684AP = \frac{1}{11}(1 + 0.6666 + 0.4285 + 0.4285 + 0.4285 + 0 + 0 + 0 + 0 + 0 + 0) \\=0.2684

PASCAL VOC 2012 的AP

PASCAL VOC 2012 中(貌似是從VOC2010開始的),針對每一個不同的Recall值(包括0和1),選取其大於等於這些Recall值時的Precision最大值,然後計算PR曲線下面積作爲AP值。平滑的結果還是上面那個曲線,只不過計算平均值的點更多了。
這樣取均值的結果,就可以看成是計算平滑後的PR曲線(上圖紅色虛線)的AUC(Area Under Curve)。
在這裏插入圖片描述
如上圖所示,AP值實際上就等於四個方框的面積和。
AP=A1+A2+A3+A4AP=A1+A2+A3+A4
例如上圖中
A1=(0.06660)1=0.0666A2=(0.13330.0666)0.0666=0.0444A3=(0.40.1333)0.4285=0.1142A4=(0.46660.4)0.3043=0.0202AP=0.0666+0.0444+0.1142+0.0202=0.2456\begin{array}{l} A 1=(0.0666-0) * 1=0.0666 \\ A 2=(0.1333-0.0666) * 0.0666=0.0444 \\ A 3=(0.4-0.1333) * 0.4285=0.1142 \\ A 4=(0.4666-0.4) * 0.3043=0.0202 \\ A P=0.0666+0.0444+0.1142+0.0202=0.2456 \end{array}
實際計算時,可能是用兩個Recall的間隔作爲bin的寬度,以平滑後的Precision作爲高,求和後與上面的過程是一樣的。

AP衡量的是學出來的模型在給定類別上的好壞,而mAP衡量的是學出的模型在所有類別上的好壞,得到AP後mAP的計算就變得很簡單了,就是取所有AP的平均值。

六、python 計算混淆矩陣和accuracy、precision、recall、f1-score

一些機器學習庫封裝了計算評價指標的庫,pytorch只能自己計算。

confusion_matrix1 = np.array([[0 for _ in range(len(tag2idx))] for _ in range(len(tag2idx))])
n1 = len(confusion_matrix1)
       
with torch.no_grad():
    for bidx, batch in enumerate(testset_loader):
		......
        predict_tags = model(seq, mask)
        pre_tag = torch.argmax(predict_tags, dim=1)      # 預測值
        tag = tag.view(-1)                                                 # 真實值
        for i in range(len(tag)):
            confusion_matrix1[tag[i]][pre_tag[i]] += 1
        for i in range(len(punctag)):
            confusion_matrix2[punctag[i]][pre_punctag[i]] += 1
            
for i in range(n1):
    rowsum, colsum = sum(confusion_matrix1[i]), sum(confusion_matrix1[r][i] for r in range(n1))
    try:
        precision.append(confusion_matrix1[i][i] / float(colsum))
        recall.append(confusion_matrix1[i][i] / float(rowsum))
        f1score.append(
            2 * precision[i] * recall[i] / (precision[i] + recall[i]) if (precision[i] + recall[i]) > 0 else 0)
        print(
                "precision: {:.4f}  recall: {:.4f}  f1: {:.4f} ".format(precision[i], recall[i], f1score[i]))
    
    except ZeroDivisionError:
        precision.append(0)
        recall.append(0)
        f1score.append(0)
        print(
                "precision: {}  recall: {}  f1: {} ".format(0, 0, 0))
              
correct1 = [confusion_matrix1[i][i] for i in range(len(tag2idx))]
total_acc1 = sum(correct1) / sum(map(sum, confusion_matrix1))
print("total accuracy: {:.4} ".format(total_acc1))

參考網址:
多類分類(Multi-label classification)性能評價之宏平均(macro-average)與微平均(micro-average)
二分類與多分類評估(混淆矩陣,準確率,召回率,F1,mAP)
對多分類數據的模型比較選擇,應該參考什麼指標?
理解AUC的意義
P-R曲線及與ROC曲線區別
AUC的計算方法
性能指標(模型評估)之mAP
目標檢測測評指標——mAP

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