理解機器學習模型的指標:準確率、精度和召回率等
衡量機器學習模型的三大指標:準確率、精度和召回率。
來源:https://www.cnblogs.com/xuexuefirst/p/8858274.html
傾向於使用準確率,是因為熟悉它的定義,而不是因為它是評估模型的最佳工具! 精度(查准率)和召回率(查全率)等指標對衡量機器學習的模型性能是非常基本的,特別是在不平衡分布數據集的案例中,在周志華教授的「西瓜書」中就特別詳細地介紹了這些概念。
什麼是分布不平衡的數據集?
https://github.com/WillKoehrsen/DataAnalysis/blob/master/recall_precision/recall_precision_example.ipynb倘若某人聲稱創建了一個能夠識別登上飛機的恐怖分子的模型,並且準確率(accuracy)高達 99%。你相信嗎?好了,有這麼一個模型:將從美國機場起飛的所有乘客簡單地標註為非恐怖分子。已知美國全年平均有 8 億人次的乘客,並且在 2000-2017 年間共發現了 19 名恐怖分子,這個模型達到了接近完美的準確率——99.9999999%。儘管這個模型擁有接近完美的準確率,但是在這個問題中準確率顯然不是一個合適的度量指標。
恐怖分子檢測是一個不平衡的分類問題:我們需要鑒別的類別有兩個——恐怖分子和非恐怖分子,其中一個類別代表了極大多數的數據點。
另一個不平衡分類問題出現在當疾病在公眾中的發病率很低時的疾病監測。在這兩種情況下,正例類別——疾病或恐怖分子,遠遠少於負例類別的數量。這種問題是數據科學中比較常見的例子,其中準確率並不是評估模型性能的很好的衡量標準。
直觀地說,我們應該聚焦於正例(恐怖分子)的識別。
一、召回率
我們應該最大化的是統計學上稱為召回率或查全率(recall)的衡量指標,或者是最大化模型找到數據集中所有相關案例的能力。
召回率=真正例/(真正例+假反例)。也就是正確判為恐怖分子占實際所有恐怖分子的比例。
你可能注意到了這個等式中的一些細節:如果我們將所有的個體都預測為恐怖分子,那麼模型的召回率就是 1.0!因為預測所有人都是恐怖分子,自然包括了恐怖分子。分號上面terrorists correctly identified=全部恐怖分子數。分母terrorists incorrectly labeled as not terrorists=0。
這樣我們就得到了一個完美的模型嗎?
當然,不是!在我們想要最大化的指標之間存在一個權衡。在召回率的例子中,當召回率增大時,精度會減小。同樣,將 100% 的乘客標記為恐怖分子的模型可能是不可用的。 統計學為我們提供了表達直覺的辭彙:這個新的模型是低精度(precision)的,或者說較低的僅識別相關數據點的能力。二、精度
精度=真正例/(真正例+假正例):也就是在所有判為恐怖分子中,真正的恐怖分子的比例。
現在我們可以看到,第一個模型給所有的個體標上了非恐怖分子的標籤,這個模型是不能使用的。儘管它有著近乎完美的準確率,但是它的精度和召回率都是零,因為沒有 TP(真正例)!
假設我們輕微地修改一下模型,然後將一個個體正確地識別為恐怖分子。現在,精度是 1(沒有假正例,FP),但是召回率很低,因為實際上會有很多假反例(FN)。假設我們走到了另一個極端,將所有的乘客標記為恐怖分子,召回率就會是 1——我們將抓住每一個恐怖分子,但是精度會特別低,我們最終會拘留很多無辜的人。換言之,隨著精度的增加,召回率會降低,反之亦然。三、精度—召回率權衡
1. 結合精度和召回率
在某些情況中,我們也許需要以犧牲另一個指標為代價來最大化精度或者召回率。
例如,在之前的例子中,在對患者進行隨訪檢查的初步疾病篩查中,我們可能希望得到接近於 1 的召回率—我們想找到所有實際患病的患者。
如果隨訪檢查的代價不是很高,我們可以接受較低的精度。然而,如果我們想要找到精度和召回率的最佳組合,我們可以使用 F1 score 來對兩者進行結合。2. 可視化精度和召回率
(1)混淆矩陣(confusion matrix):給定一個模型的預測標籤時,它可以被用來快速計算精度和召回率。
二分類的混淆矩陣總共包含四個不同的結果:真正例(TP)、假正例(FP)、真反例(TN),以及假反例(FN)。
列表示真實值,行表示預測值。行和列的交叉點指的就是這四種結果。例如,如果我們將一個數據點預測為正例,但是它實際上是反例,那麼這就是一個假正例。(2)受試者特徵曲線(ROC 曲線,Receiver Operating Characteristic curve):
ROC 曲線展示了當改變在模型中識別為正例的閾值時,召回率和精度的關係會如何變化。
為了將某個病人標記為患有某種疾病(一個正例標籤),我們為每種疾病在這個範圍內設置一個閾值,通過改變這個閾值,我們可以嘗試實現合適的精度和召回率之間的平衡。如果我們有一個用來識別疾病的模型,我們的模型可能會為每一種疾病輸出介於 0 到 1 之間的一個分數,為了將某個病人標記為患有某種疾病(一個正例標籤),我們為每種疾病在這個範圍內設置一個閾值,通過改變這個閾值,我們可以嘗試實現合適的精度和召回率之間的平衡。ROC 曲線在 Y 軸上畫出了真正例率(TPR),在 X 軸上畫出了假正例率 (FPR)。TPR 是召回率,FPR 是反例被報告為正例的概率。這兩者都可以通過混淆矩陣計算得到。
1. 選擇最佳的診斷界限值。ROC曲線越靠近左上角,試驗的準確性就越高。最靠近左上角的ROC曲線的點是錯誤最少的最好閾值,其假陽性和假陰性的總數最少
2. 兩種或兩種以上不同診斷試驗對演算法性能的比較。在對同一種演算法的兩種或兩種以上診斷方法進行比較時,可將各試驗的ROC曲線繪製到同一坐標中,以直觀地鑒別優劣,靠近左上角的ROC曲線所代表的受試者工作最準確。亦可通過分別計算各個試驗的ROC曲線下的面積(AUC)進行比較,哪一種試驗的 AUC最大,則哪一種試驗的診斷價值最佳。
在閾值為 1.0 的情況下,我們將位於圖的左下方,因為沒有將任何數據點識別為正例,這導致沒有真正例,也沒有假正例(TPR = FPR = 0)。當降低閾值時,我們將更多的數據點識別為正例,導致更多的真正例,但也有更多的假正例 ( TPR 和 FPR 增加)。最終,在閾值 0.0 處,我們將所有數據點識別為正,並發現位於 ROC 曲線的右上角 ( TPR = FPR = 1.0 )。
總結:
對於二分類問題:
- 真正例(TP):實際上是正例的數據點被標記為正例
- 假正例(FP):實際上是反例的數據點被標記為正例
- 真反例(TN):實際上是反例的數據點被標記為反例
- 假反例(FN):實際上是正例的數據點被標記為反例
召回率和精度衡量指標:
- 召回率(R):分類模型識別所有相關實例的能力
- 精度(P):分類模型僅僅返回相關實例的能力
- F1 score:使用調和平均結合召回率和精度的指標
召回率和精度的可視化:
- 混淆矩陣:展示分類模型的真實和預測標籤的對應結果。
- 受試者特徵曲線(ROC 曲線):畫出真正例率(TPR)和假正例率(FPR),並將此作為模型歸類正例閾值的函數。
- 曲線下面積(AUC):基於 ROC 曲線下方的面積,計算分類模型總體性能的指標。
實例應用
我們的任務是為 100 名病人診斷一種在普通人群中患病率是 50% 的疾病。我們將假設一個黑盒模型,我們輸入關於患者的信息,並得到 0 到 1 之間的分數。我們可以改變將患者標記為正例 (有疾病) 的閾值,以最大化分類器性能。我們將以 0.1 為增量從 0.0 到 1.0 評估閾值,在每個步驟中計算 ROC 曲線上的精度、召回率、F1 score 以及在 ROC 曲線上的位置。以下是每個閾值的分類結果:
模型在每個閾值下的結果
我們將以閾值為 0.5 為例計算對應的召回率、精度、真正例率、假正例率。首先我們得到混淆矩陣:
閾值為 0.5 時的混淆矩陣
我們可以利用混淆矩陣中的數值來計算召回率、精度和 F1 score:
然後計算真正例率和假正例率來確定閾值為 0.5 時,模型在 ROC 曲線上對應的點。
為了得到整個 ROC 曲線,我們在每個閾值下都進行這個過程。你可能會想,這是相當乏味的,所以,我們用 python 語言來代替手工計算。用來做這些計算的 Juoyter Notebook 放在了 github 上,每個人都可以看到。最終的 ROC 曲線如下所示,點上面的數字是閾值。
在這裡我們可以看到,所有的概念都彙集到一起了!在閾值等於 1.0 的點,我們沒有將任何病人歸類為患病,因此模型的召回率和精度都是 0。隨著閾值的減小,召回率增加了,因為我們發現更多的患者患有該疾病。然而,隨著召回率的增加,精度會降低,因為除了增加真正例之外,還會增加假正例。在閾值為 0.0 的時候,我們的召回率是完美的——我們發現所有的患者都患有這種疾病——但是精度很低,因為有很多假正例。通過更改閾值並選擇最大化 F1 score 的閾值,我們可以沿著給定模型的曲線移動。要改變整個曲線,我們需要建立一個不同的模型。
在每個閾值下最終模型的統計量如下表:
基於 F1 score,整體最佳的模型出現在閾值為 0.5 的地方。如果我們想要在更大程度上強調精度或者召回率,我們可以選擇這些指標上最佳時對應的模型。
結論
我們傾向於使用準確率,因為每個人都知道它意味著什麼,而不是因為它是完成任務的最佳工具!雖然更適合的度量指標 (如召回率和精度) 看起來可能很陌生,但我們已經直觀地了解了為什麼它們在某些問題 (如不平衡的分類任務) 中有著更好的表現。統計學為我們提供了計算這些指標的形式化定義和方程。數據科學是關於尋找解決問題的正確工具的學科,而且在開發分類模型時,我們常常需要超越準確率(accuracy)的單一指標。了解召回率、精度、F1 score 和 ROC 曲線使我們能夠評估分類模型,並應使我們懷疑是否有人僅僅在吹捧模型的準確率,尤其是對於不平衡的問題。正如我們所看到的,準確率(accuracy)並不能對幾個關鍵問題提供有用的評估,但現在我們知道如何使用更聰明的衡量指標!
機器學習模型的衡量不止準確率:還有精度和召回率
推薦閱讀:
※Datalore初體驗:JetBrains的雲端機器學習開發環境
※你的 GAN 是不是少了什麼?
※我是如何零基礎自學人工智慧(附十問十答)
TAG:機器學習 |