準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

 2020-06-22 00:07:26

 

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

 

本文首發於知乎
https://zhuanlan.zhihu.com/p/147663370

作者 | NaNNN

編輯 | 叢末

1

前言

衆所周知,機器學習分類模型常用評價指標有Accuracy, Precision, Recall和F1-score,而回歸模型最常用指標有MAE和RMSE。但是我們真正瞭解這些評價指標的意義嗎?

在具體場景(如不均衡多分類)中到底應該以哪種指標爲主要參考呢?多分類模型和二分類模型的評價指標有啥區別?多分類問題中,爲什麼Accuracy = micro precision = micro recall = micro F1-score? 什麼時候用macro, weighted, micro precision/ recall/ F1-score?

這幾天爲了回覆嚴謹(劃去: 刁難)的reviewer,我查閱了一些文章,總算是梳理清楚啦。在這裏分享給大家,權當做個總結。今天要講的主要分爲以下兩點:

  • 二分類模型的常見指標快速回顧
  • 多分類模型的常見指標詳細解析

在探討這些問題前,讓我們先回顧一下最常見的指標Accuracy到底有哪些不足。

Accuracy是分類問題中最常用的指標,它計算了分類正確的預測數與總預測數的比值。但是,對於不平衡數據集而言,Accuracy並不是一個好指標。爲啥?

假設我們有100張圖片,其中91張圖片是「狗」,5張是「貓」,4張是「豬」,我們希望訓練一個三分類器,能正確識別圖片裏動物的類別。其中,狗這個類別就是大多數類 (majority class)。當大多數類中樣本(狗)的數量遠超過其他類別(貓、豬)時,如果採用Accuracy來評估分類器的好壞,那麼即便模型性能很差 (如無論輸入什麼圖片,都預測爲「狗」),也可以得到較高的Accuracy Score(如91%)。此時,雖然Accuracy Score很高,但是意義不大。當數據異常不平衡時,Accuracy評估方法的缺陷尤爲顯著。

因此,我們需要引入Precision (精準度),Recall (召回率)和F1-score評估指標。考慮到二分類和多分類模型中,評估指標的計算方法略有不同,我們將其分開討論。

2

二分類模型的常見指標快速回顧

在二分類問題中,假設該樣本一共有兩種類別:Positive和Negative。當分類器預測結束,我們可以繪製出混淆矩陣(confusion matrix)。其中分類結果分爲如下幾種:

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

  • True Positive (TP): 把正樣本成功預測爲正。
  • True Negative (TN):把負樣本成功預測爲負。
  • False Positive (FP):把負樣本錯誤地預測爲正。
  • False Negative (FN):把正樣本錯誤的預測爲負。

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

在二分類模型中,Accuracy,Precision,Recall和F1 score的定義如下:

其中,Precision着重評估在預測爲Positive的所有數據中,真實Positve的數據到底佔多少?Recall着重評估:在所有的Positive數據中,到底有多少數據被成功預測爲Positive?

舉個例子,一個醫院新開發了一套癌症AI診斷系統,想評估其性能好壞。我們把病人得了癌症定義爲Positive,沒得癌症定義爲Negative。那麼, 到底該用什麼指標進行評估呢?

如用Precision對系統進行評估,那麼其回答的問題就是:

在診斷爲癌症的一堆人中,到底有多少人真得了癌症?

如用Recall對系統進行評估,那麼其回答的問題就是:

在一堆得了癌症的病人中,到底有多少人能被成功檢測出癌症?

如用Accuracy對系統進行評估,那麼其回答的問題就是:

在一堆癌症病人和正常人中,有多少人被系統給出了正確診斷結果(患癌或沒患癌)?

OK,那啥時候應該更注重Recall而不是Precision呢?

當False Negative (FN)的成本代價很高 (後果很嚴重),希望儘量避免產生FN時,應該着重考慮提高Recall指標。

在上述例子裏,False Negative是得了癌症的病人沒有被診斷出癌症,這種情況是最應該避免的。我們寧可把健康人誤診爲癌症 (FP),也不能讓真正患病的人檢測不出癌症 (FN) 而耽誤治療離世。在這裏,癌症診斷系統的目標是:儘可能提高Recall值,哪怕犧牲一部分Precision。

那啥時候應該更注重Precision而不是Recall呢?

當False Positive (FP)的成本代價很高 (後果很嚴重)時,即期望儘量避免產生FP時,應該着重考慮提高Precision指標。

以垃圾郵件屏蔽系統爲例,垃圾郵件爲Positive,正常郵件爲Negative,False Positive是把正常郵件識別爲垃圾郵件,這種情況是最應該避免的(你能容忍一封重要工作郵件直接進了垃圾箱,被不知不覺刪除嗎?)。我們寧可把垃圾郵件標記爲正常郵件 (FN),也不能讓正常郵件直接進垃圾箱 (FP)。在這裏,垃圾郵件屏蔽系統的目標是:儘可能提高Precision值,哪怕犧牲一部分recall。

而F1-score是Precision和Recall兩者的綜合。

舉個更有意思的例子(我拍腦袋想出來的,絕對原創哈),假設檢察機關想將罪犯捉拿歸案,需要對所有人羣進行分析,以判斷某人犯了罪(Positive),還是沒犯罪(Negative)。顯然,檢察機關希望不漏掉一個罪人(提高recall),也不錯怪一個好人(提高precision),所以就需要同時權衡recall和precision兩個指標。

尤其在上個世紀,中國司法體制會更偏向Recall,即「天網恢恢,疏而不漏,任何罪犯都插翅難飛」。而西方司法系統會更偏向Precision,即「絕不冤枉一個好人,但是難免有罪犯成爲漏網之魚,逍遙法外」。到底是哪種更好呢?顯然,極端並不可取。Precision和Recall都應該越高越好,也就是F1應該越高越好。

呼,二分類問題的常見指標和試用場景終於講完了。咦,說好的快速回顧呢?

3

多分類模型的常見指標解析

在多分類(大於兩個類)問題中,假設我們要開發一個動物識別系統,來區分輸入圖片是貓,狗還是豬。給定分類器一堆動物圖片,產生了如下結果混淆矩陣。

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

在混淆矩陣中,正確的分類樣本(Actual label = Predicted label)分佈在左上到右下的對角線上。其中,Accuracy的定義爲分類正確(對角線上)的樣本數與總樣本數的比值。Accuracy度量的是全局樣本預測情況。而對於Precision和Recall而言,每個類都需要單獨計算其Precision和Recall。

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

比如,對類別「豬」而言,其Precision和Recall分別爲:

也就是,

(P代表Precision)

(R代表Recall)

如果想評估該識別系統的總體功能,必須考慮貓、狗、豬三個類別的綜合預測性能。那麼,到底要怎麼綜合這三個類別的Precision呢?是簡單加起來做平均嗎?通常來說, 我們有如下幾種解決方案(也可參考scikit-learn官網):

1、Macro-average方法

該方法最簡單,直接將不同類別的評估指標(Precision/ Recall/ F1-score)加起來求平均,給所有類別相同的權重。該方法能夠平等看待每個類別,但是它的值會受稀有類別影響。

2、 Weighted-average方法

該方法給不同類別不同權重(權重根據該類別的真實分佈比例確定),每個類別乘權重後再進行相加。該方法考慮了類別不平衡情況,它的值更容易受到常見類(majority class)的影響。

(W代表權重,N代表樣本在該類別下的真實數目)

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

3、Micro-average方法

該方法把每個類別的TP, FP, FN先相加之後,在根據二分類的公式進行計算。

其中,特別有意思的是,Micro-precision和Micro-recall竟然始終相同!這是爲啥呢?

這是因爲在某一類中的False Positive樣本,一定是其他某類別的False Negative樣本。聽起來有點抽象?舉個例子,比如說系統錯把「狗」預測成「貓」,那麼對於狗而言,其錯誤類型就是False Negative,對於貓而言,其錯誤類型就是False Positive。於此同時,Micro-precision和Micro-recall的數值都等於Accuracy,因爲它們計算了對角線樣本數和總樣本數的比值,總結就是:

最後,我們運行一下代碼,檢驗手動計算結果是否和Sklearn包結果一致:

import numpy as np
import seaborn as sns
from sklearn.metrics import confusion_matrix
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score, average_precision_score,precision_score,f1_score,recall_score
# create confusion matrix
y_true = np.array([-1]*70 + [0]*160 + [1]*30)
y_pred = np.array([-1]*40 + [0]*20 + [1]*20 +
[-1]*30 + [0]*80 + [1]*30 +
[-1]*5 + [0]*15 + [1]*20)
cm = confusion_matrix(y_true, y_pred)
conf_matrix = pd.DataFrame(cm, index=['Cat','Dog','Pig'], columns=['Cat','Dog','Pig'])
# plot size setting
fig, ax = plt.subplots(figsize = (4.5,3.5))
sns.heatmap(conf_matrix, annot=True, annot_kws={"size": 19}, cmap="Blues")
plt.ylabel('True label', fontsize=18)
plt.xlabel('Predicted label', fontsize=18)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.savefig('confusion.pdf', bbox_inches='tight')
plt.show

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

print('------Weighted------')
print('Weighted precision', precision_score(y_true, y_pred, average='weighted'))
print('Weighted recall', recall_score(y_true, y_pred, average='weighted'))
print('Weighted f1-score', f1_score(y_true, y_pred, average='weighted'))
print('------Macro------')
print('Macro precision', precision_score(y_true, y_pred, average='macro'))
print('Macro recall', recall_score(y_true, y_pred, average='macro'))
print('Macro f1-score', f1_score(y_true, y_pred, average='macro'))
print('------Micro------')
print('Micro precision', precision_score(y_true, y_pred, average='micro'))
print('Micro recall', recall_score(y_true, y_pred, average='micro'))
print('Micro f1-score', f1_score(y_true, y_pred, average='micro'))

準確率、精準率、召回率、F1,我們真瞭解這些評價指標的意義嗎?

運算結果完全一致,OK,機器學習多分類模型的常見評估指標已經基本介紹完畢。

參考文章

  1. 4 Things You Need to Know about AI: Accuracy, Precision, Recall and F1 scores
  2. Multi-Class Metrics Made Simple, Part I: Precision and Recall
  3. Accuracy, Precision and Recall: Multi-class Performance Metrics for Supervised Learning
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章