機器學習模型的衡量指標有哪些?

Arphetian

我們傾向於使用精度,是因為熟悉它的定義,而不是因為它是評估模型的最佳工具!準確率和召回率等指標對衡量機器學習的模型性能是非常基本的,周志華教授的「西瓜書」就特別詳細地介紹了這些概念。


GitHub 地址:https://github.com/WillKoehrsen/Data-Analysis/blob/master/recall_precision/recall_precision_example.ipynb


為分類任務選擇正確的衡量指標


倘若某人聲稱創建了一個能夠識別登上飛機的恐怖分子的模型,並且精度(accuracy)高達 99%。你相信嗎?好了,有這麼一個模型:將從美國機場起飛的所有乘客簡單地標註為非恐怖分子。已知美國全年平均有 8 億人次的乘客,並且在 2000-2017 年間共發現了 19 名恐怖分子,這個模型達到了接近完美的精度——99.9999999%。這聽起來確實令人印象深刻,但是我懷疑美國國土安全局不會在近期購買這個模型。儘管這個模型擁有接近完美的精度,但是在這個問題中精度顯然不是一個合適的度量指標。


恐怖分子檢測是一個不平衡的分類問題:我們需要鑑別的類別有兩個——恐怖分子和非恐怖分子,其中一個類別代表了極大多數的數據點。另一個不平衡分類問題出現在當疾病在公眾中的發病率很低時的疾病監測。在這兩種情況下,正例類別——疾病或恐怖分子,遠遠少於負例類別的數量。這種問題是數據科學中比較常見的例子,其中精度並不是評估模型性能的很好的衡量標準。


直觀地說,我們知道在恐怖分子檢測的問題中宣佈所有的數據點為負例(非恐怖分子)是毫無裨益的,相反,我們應該聚焦於正例(恐怖分子)的識別。直覺告訴我們,我們應該最大化的是統計學上稱為召回率或查全率(recall)的衡量指標,或者是最大化模型找到數據集中所有相關案例的能力。召回率的準確定義是:真正例除以(真正例+假反例)的和,如下圖所示。真正例(true positives)是被真確分類的正例數據點,假反例(false negatives)是被錯誤分類的負例數據點。在恐怖分子檢測的例子中,TP 是被正確識別的恐怖分子,FN 是模型誤分類為非恐怖分子的恐怖分子的數據點。召回率可以被理解為模型找到數據集中所有感興趣的數據點的能力。



你可能注意到了這個等式中的一些細節:如果我們將所有的個體都預測為恐怖分子,那麼模型的召回率就是 1.0!這樣我們就得到了一個完美的模型嗎?當然,不是!與數據科學中的絕大多數概念一樣,在我們想要最大化的指標之間存在一個權衡。在召回率的例子中,當召回率增大的時候,準確率就會減小。同樣,直覺告訴我們,一個將 100% 的乘客標記為恐怖分子的模型可能是不可用的,因為我們必須禁止每一個乘客的飛行。統計學為我們提供了表達直覺的詞彙:這個新的模型是低準確率(precision)的,或者說較低的僅識別相關數據點的能力。


準確率被定義為真正例除以(真正例+假正例)的和,如下圖所示。假正例(FP)指的是模型將實際上是反例的樣本誤判為正例的情況,或者說,在我們的例子中指的是那些被模型判斷為恐怖分子,而實際上不是恐怖分子的個體。召回率(查全率)表達的是模型找到數據集中相關實例的能力,而準確率(查準率)表達模型找到的數據點中實際相關的比例。



現在我們可以看到,第一個模型給所有的個體標上了非恐怖分子的標籤,這個模型是不能使用的。儘管它有著近乎完美的精度,但是它的準確率和召回率都是零,因為沒有 TP(真正例)!假設我們輕微地修改一下模型,然後將一個個體正確地識別為恐怖分子。現在,準確率是 1(沒有假正例,FP),但是召回率很低,因為實際上會有很多假反例(FN)。假設我們走到了另一個極端,將所有的乘客標記為恐怖分子,召回率就會是 1——我們將抓住每一個恐怖分子,但是準確率會特別低,我們最終會拘留很多無辜的人。換言之,隨著準確率的增加,召回率會降低,反之亦然。


準確率—召回率權衡


結合準確率和召回率


在某些情況中,我們也許需要以犧牲另一個指標為代價來最大化準確率或者召回率。例如,在之前的例子中,在對患者進行隨訪檢查的初步疾病篩查中,我們可能希望得到接近於 1 的召回率—我們想找到所有實際患病的患者。如果隨訪檢查的代價不是很高,我們可以接受較低的準確率。然而,如果我們想要找到準確率和召回率的最佳組合,我們可以使用 F1 score 來對兩者進行結合。


F1 score 是對準確率和召回率的調和平均:



我們使用調和平均而不是簡單的算術平均的原因是:調和平均可以懲罰極端情況。一個具有 1.0 的準確率,而召回率為 0 的分類器,這兩個指標的算術平均是 0.5,但是 F1 score 會是 0。F1 score 給了準確率和召回率相同的權重,它是通用 Fβ指標的一個特殊情況,在 Fβ中,β 可以用來給召回率和準確率更多或者更少的權重。(還有其他方式可以結合準確率和召回率,例如二者的幾何平均,但是 F1 score 是最常用的。) 如果我們想創建一個具有最佳的準確率—召回率平衡的模型,那麼就要嘗試將 F1 score 最大化。


可視化準確率和召回率


我已經向你拋出了幾個新術語,接下來我將通過一個例子向你展示它們在實際中是如何使用的。在使用之前,我們要簡單地談一談準確率和召回率的概念。


首先要介紹一下混淆矩陣(confusion matrix),給定一個模型的預測標籤時,它可以被用來快速計算準確率和召回率。二分類的混淆矩陣總共包含四個不同的結果:真正例(TP)、假正例(FP)、真反例(TN),以及假反例(FN)。列表示真實值,行表示預測值。行和列的交叉點指的就是這四種結果。例如,如果我們將一個數據點預測為正例,但是它實際上是反例,那麼這就是一個假正例。



用混淆矩陣計算準確率和召回率需要找到矩陣中對應的值,並應用以下的等式進行計算。



其他的用來展示分類模型性能的可視化技術是受試者特徵曲線(ROC 曲線,Receiver Operating Characteristic curve)。別被這個複雜的名詞嚇到!這個思想是相當簡單的:ROC 曲線展示了當改變在模型中識別為正例的閾值時,召回率和準確率的關係會如何變化。如果我們有一個用來識別疾病的模型,我們的模型可能會為每一種疾病輸出介於 0 到 1 之間的一個分數,為了將某個病人標記為患有某種疾病(一個正例標籤),我們為每種疾病在這個範圍內設置一個閾值,通過改變這個閾值,我們可以嘗試實現合適的準確率和召回率之間的平衡。


ROC 曲線在 Y 軸上畫出了真正例率(TPR),在 X 軸上畫出了假正例率 (FPR)。TPR 是召回率,FPR 是反例被報告為正例的概率。這兩者都可以通過混淆矩陣計算得到。



下圖是一個典型的 ROC 曲線:


ROC 曲線


黑色對角線表示隨機分類器,紅色和藍色曲線表示兩種不同的分類模型。對於給定的模型,只能對應一條曲線。但是我們可以通過調整對正例進行分類的閾值來沿著曲線移動。通常,當降低閾值時,會沿著曲線向右和向上移動。在閾值為 1.0 的情況下,我們將位於圖的左下方,因為沒有將任何數據點識別為正例,這導致沒有真正例,也沒有假正例(TPR = FPR = 0)。當降低閾值時,我們將更多的數據點識別為正例,導致更多的真正例,但也有更多的假正例 ( TPR 和 FPR 增加)。最終,在閾值 0.0 處,我們將所有數據點識別為正,並發現位於 ROC 曲線的右上角 ( TPR = FPR = 1.0 )。


最後,我們可以通過計算曲線下面積 ( AUC ) 來量化模型的 ROC 曲線,這是一個介於 0 和 1 之間的度量,數值越大,表示分類性能越好。在上圖中,藍色曲線的 AUC 將大於紅色曲線的 AUC,這意味著藍色模型在實現準確度和召回率的權衡方面更好。隨機分類器 (黑線) 實現 0.5 的 AUC。


回顧


我們已經介紹了幾個判斷模型性能的屬性,每個屬性的定義都不是很複雜,但是結合在一起就有點複雜了。讓我們通過一個例子做一個快速的回顧來鞏固一下這些思想。


對於二分類問題


  • 真正例(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)並不能對幾個關鍵問題提供有用的評估,但現在我們知道如何使用更聰明的衡量指標!


分享到:


相關文章: