分類模型性能評估——Accuracy, Precision, Recall, F-Score...
來自專欄 咣咣咣的數據分析
對於分類問題而言,一個模型訓練好了之後需要判斷模型的性能好壞,常用的評價指標有這些:Accuracy,Precision,Recall...
P.S. 在閱讀文章的時候發現對於accuracy和precision到底哪個叫做準確率,哪個叫做精確率,都有不同的叫法,為了避免混淆,下文全部使用英文辭彙,不會混淆。
那麼這些概念分別是什麼意思呢?什麼情況下使用哪個評價指標呢?作者一度感到有點糊塗,閱讀了一些文章之後算是弄清楚了,所以把自己的理解寫下來,一方面便利有困惑的人理解,一方面也是另一個理清自己思路的方法,最後一方面希望可以多和做BA/DA/DS的各位大佬交流。
先以最簡單也是最常見的二分類為例說明,之後再拓展到多分類問題。舉一個具體的例子:
假如某個班級有男生80人,女生20人,共計100人.目標是找出所有女生.現在某人挑選出50個人,其中20人是女生,另外還錯誤的把30個男生也當作女生挑選出來了.作為評估者的你需要來評估(evaluation)下他的工作
首先是accuracy,這個很簡單,就是:分類正確的樣本個數/總樣本數
在這個例子中就是,(20(正確識別為女生)+50(正確識別為男生))/ 100 =70%
這樣看起來accuracy是不是還挺合理的?對於一個分類模型來說,你判斷的準的多的話,肯定很好,但是設想下面這樣一個問題:
我要識別一個人是不是感染了某種病,這個識別可以轉換成二分類問題,即判斷:是否有病。
現在找來了1000個人進行分類,其中有1個人是有病的。假如我判斷所有的人都沒有發病,那麼accuracy是多少?99.9%!這看上去超級高,但是有意義嗎?並沒有。
另一方面,在是否有病的二分類問題中,我的目標其實是找出有病的人,但是accuracy包含了正確找出的有病的人,和正確找出的沒病的人。如果我只想要看這個分類器正確找出有病的人的能力怎麼樣怎麼辦呢?accuracy是沒辦法滿足的。
所以可以總結一下。1. accuracy實際上是不管我的分類目標的,accuracy只計算每一類分類正確的數量然後加總計算百分比。2. 對於類別極不均衡問題,就會給人以分類效果很好的錯覺,但其實分類器可能一點用也沒有。
反過來說,accuracy適合什麼樣的情況呢?1. 不需要具體篩選出來某一類的分類問題,比如我想區分紅色和綠色,我沒有特別的偏好,就是希望紅色和綠色都能分對,那就可以。而不是我就想選出全部的綠色、我只關心選出來的綠色準不準。2. 類別是均衡的,不會紅色10個點,綠色10000個點。那麼多少算均衡呢?其實這個沒有絕對的指標,我個人認為可以按照這個標準判斷:如果把所有樣本都劃為多的那一類,不超過80%(或者任何你的覺得分類器還行的心理閾值,90%,70%等等)
現在市面上的文章多強調accuracy不能滿足類別不均衡的判斷,但是很少提到分類目標的問題,我個人認為這也是很重要的。
好了,接下來說,對於那個檢測是否有病的例子(有分類目標;類別不均衡),應該用什麼指標呢?應該用Precision, Recall, F-Score。在講解這三個概念之前,需要明確下面幾個概念
對於每一個分類問題,模型訓練結束之後進行測試,會出現如下四種情況:
以FP為例,本來沒病的,一檢測是陽性,那可不就是假陽性嘛,false positive。
- Precision= TP/(TP+FP)
- Recall =TP/(TP+FN)
可以發現,precision和recall的分子都是TP,即正確識別出的目標類別。從這一點我們就可以看出,這兩個指標是用在有目標類別上的,都是圍著正確識別出的目標類別轉的。
在檢測是否有病的問題中,如果分類器簡單粗暴的說大家都沒病,那TP其實是0,那麼precision和recall都是0,這樣問題就會一下子暴露出來。
precision的分母是所有檢測出來positive的,即TP + FP, 衡量的是一個分類器挑出來的東西中,是我們要的東西的比例。在檢測是否有病的問題中,就是你挑出來了病人,但是是不是有好多不是病人也被你認為是病人?如果是的話,precision分數就會很低。
recall的分母是所有事實上是positive的,即TP + FN , 衡量的是一個分類器挑出來的我們想要的東西佔實際上所有我們想要的東西的比例。在檢測是否有病的問題中,就是你挑出來了病人,但是一共我有好多病人,是不是都給你涵蓋了,你有沒有放過好多其實是病人的人?如果是的話,recall分數就會很低。
可以發現,precison和recall壓根都沒用到TN,即實際上沒病、檢測出來也沒病的人,因為這個問題中,我們根本不關心沒病的人。從另一種程度上,這是Precision和recall對於我們部分數據的未利用和忽略,相比之下,accuracy是用到了全部的數據,其實
- accuracy= (TP+FN)/(TP+TN+FP+FN)。
下面舉一些分類器檢測性能的例子,來看不同的recall和precision。
還是之前的檢測是否有病問題,10000人里有10個人有病,
1。我的一號分類器檢測出來50個人有病,其中包含了這10個真正有病的人,那麼recall = 10/10=100%, precision = 10/50=20%。
2。 我的二號分類器檢測出來的50個人里沒有包含任何真正有病的人呢?recall =precision =0.
3。我的三號分類器檢測出來了5個人,這5個人都是有病,recall =5/10=50%, precison =5/5=100%.
4。我的四號分類器檢測出來10個人,5個人有病,5個人沒病,recall=precision=50%
我該選擇哪一個分類器呢?
具體情況具體看待,如果這是很嚴重的疾病,必須早發現早治療,並且誤檢之後再次檢測的成本也不大,那我們傾向於不放過任何一個有病的人,即recall儘可能大的情況下選擇precision最大的。同樣適用於導彈檢測、信用卡欺詐檢測和任何非常嚴重最好一次都不要發生的事情。
那如果是垃圾郵件呢?我個人認為,如果把重要郵件誤檢測為垃圾郵件的代價可能會很大,因此我寧願放過一些垃圾郵件也不願意誤把重要郵件當成垃圾郵件,因此precision要儘可能高,recall可以低一點。同樣適用於任何有漏網之魚沒那麼嚴重,但如果錯當成了魚就不好的事情,比如法律上的疑罪從無。
我們之前還提到了F-score,
- F-score= 2*precision*recall/(precision+recall)
只是precison和recall的調和平均,我個人認為參考價值有限,只是如果你懶得看precison和recall兩個指標的話,那麼可以只看f-score,如果precison和recall有任何一方特別低,那麼f-score也會低,所以f-score更強調一個模型需要兼有 減少漏網之魚(recall儘可能大)和抓上來的每條都是想要的魚(precision儘可能大)的特點。
但是我個人認為,在一個模型中,如果類別是均衡的,一般分類器都會均衡地識別兩個類。如果類別是不均衡的,分類器不然直接失靈(全部預測為一類),這時候recall和precision都是0了;不然就是過多地預測類別較少的那一類,所以這個時候多關注一下precision來進行模型調優即可。
這時候的模型調優我認為有兩種方法,1 是改動損失函數,加大對類別少的那一類分類錯誤的懲罰。2 是增加類別少的那一類的樣本數量,即自然情況下,病人/非病人=1/1000,我在訓練模型的時候,特地找來500個病人和非病人進行訓練,訓練之後放回1/1000的真實場景中測試。那麼這樣訓練出來的結果,最後模型的recall 和 precision還會低嗎?哪一個容易低呢?留給大家回答。
參考文章:
準確率(Accuracy), 精確率(Precision), 召回率(Recall)和F1-Measure推薦閱讀:
※<納甲筮法入門>7.解卦方法分類(上)
※誰知拉丁舞起源?分類?如何欣賞?
※杉桑的圖書館的【待分類】
※國標舞分類、簡介
※茶的分類方法