Precision、Recall、F-measure、ROC曲線、AUC理解

首先,在試圖弄懂AUC和ROC曲線之前,一定,一定要徹底理解混淆矩陣的定義!!!

混淆矩陣中有着Positive、Negative、True、False的概念,其意義如下:

  • 稱預測類別爲1的爲Positive(陽性),預測類別爲0的爲Negative(陰性)。
  • 預測正確的爲True(真),預測錯誤的爲False(僞)。

對上述概念進行組合,就產生了如下的混淆矩陣:

然後,由此引出True Positive Rate(真陽率)、False Positive(僞陽率)兩個概念:

  • TPRate=\frac{TP}{TP+FN}
  • FPRate=\frac{FP}{FP+TN}
  • Precision = TP/TP+FP,預測爲真的當中,實際爲真的比例(越大越好,1爲理想狀態)
  • Recall = TPRate,所有真實類別爲1的樣本中,預測類別爲1的比例,即召回率(召回了多少正樣本比例);

仔細看這兩個公式,發現其實TPRate就是TP除以TP所在的列,FPRate就是FP除以FP所在的列,二者意義如下:

  • TPRate的意義是所有真實類別爲1的樣本中,預測類別爲1的比例。
  • FPRate的意義是所有真是類別爲0的樣本中,預測類別爲1的比例。
  • precision的含義是:

如果上述概念都弄懂了,那麼ROC曲線和AUC就so easy了:

按照定義,AUC即ROC曲線下的面積,而ROC曲線的橫軸是FPRate,縱軸是TPRate,當二者相等時,即y=x,如下圖,表示的意義是:

對於不論真實類別是1還是0的樣本,分類器預測爲1的概率是相等的。換句話說,和拋硬幣並沒有什麼區別,一個拋硬幣的分類器是我們能想象的最差的情況,因此一般來說我們認爲AUC的最小值爲0.5(當然也存在預測相反這種極端的情況,AUC小於0.5)。而我們希望分類器達到的效果是:對於真實類別爲1的樣本,分類器預測爲1的概率(即TPRate),要大於真實類別爲0而預測類別爲1的概率(即FPRate),這樣的ROC曲線是在y=x之上的,因此大部分的ROC曲線長成下面這個樣子:

最理想的情況下,沒有真實類別爲1而錯分爲0的樣本,TPRate一直爲1,於是AUC爲1,這便是AUC的極大值。


說了這麼多還是不夠直觀,不妨舉個簡單的例子。

首先對於硬分類器(例如SVM,NB),預測類別爲離散標籤,對於8個樣本的預測情況如下:

得到混淆矩陣如下:

進而算得TPRate=3/4,FPRate=2/4,得到ROC曲線:

最終得到AUC爲0.625。

對於LR等預測類別爲概率的分類器,依然用上述例子,假設預測結果如下:

這時,需要設置閾值來得到混淆矩陣,不同的閾值會影響得到的TPRate,FPRate,如果閾值取0.5,小於0.5的爲0,否則爲1,那麼我們就得到了與之前一樣的混淆矩陣。其他的閾值就不再囉嗦了。依次使用所有預測值作爲閾值,得到一系列TPRate,FPRate,描點,求面積,即可得到AUC。


最後說說AUC的優勢,AUC的計算方法同時考慮了分類器對於正例和負例的分類能力,在樣本不平衡的情況下,依然能夠對分類器作出合理的評價。

例如在反欺詐場景,設非欺詐類樣本爲正例,負例佔比很少(假設0.1%),如果使用準確率評估,把所有的樣本預測爲正例便可以獲得99.9%的準確率

但是如果使用AUC,把所有樣本預測爲正例,TPRate和FPRate同時爲1,AUC僅爲0.5,成功規避了樣本不均勻帶來的問題。


ROC曲線的Python實現實例

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

import numpy as np
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt

y = np.array([0,0,1,1])
pred = np.array([0.1,0.4,0.35,0.8])
fpr, tpr, thresholds = roc_curve(y, pred, pos_label=1)
print "fpr:",fpr
print "tpr:",tpr
print "thresholds:",thresholds

#畫對角線
plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck')
#畫ROC曲線
plt.plot(fpr,tpr,lw=1,label = "ROC curve")
plt.show()

from sklearn.metrics import auc
print "auc:",auc(fpr, tpr)

#result
fpr: [ 0.   0.5  0.5  1. ]
tpr: [ 0.5  0.5  1.   1. ]
thresholds: [ 0.8   0.4   0.35  0.1 ]
auc: 0.75

計算過程解析:

測試樣本有真實標籤和預測概率:

真實標籤label 0 0 1 1
預測概率p 0.1 0.4 0.35 0.8

按預測概率從小到大或從大到小排序,依次選取概率值爲閾值。

真實標籤label 1 0 1 0
預測概率p 0.8 0.4 0.35 0.1

 

sklearn是按照概率值從大到小排序來計算FTPR和TPR的,本文下面也按照這種排序方式,以便於理解。

當選擇0.8爲分隔閾值時,當p>=0.8時,認爲該樣本爲正樣本,否則爲負樣本,結果如下:

真實標籤label 1 0 1 0
預測標籤: 1 0 0 0
預測概率p 0.8 0.4 0.35 0.1

根據混淆矩陣得到

則TP = 1,FN = 1, FP = 0,TN = 2;則計算得到FPR =FP/FP+TN= 0/0+2=0,TPR = TP/TP+FN=1/1+1=0.5.

當選擇0.4爲分隔閾值時,當p>=0.4時,認爲該樣本爲正樣本,否則爲負樣本,結果如下:

真實標籤label 1 0 1 0
預測標籤: 1 1 0 0
預測概率p 0.8 0.4 0.35 0.1

則TP = 1,FN = 1, FP = 1,TN = 1;則計算得到FPR =FP/FP+TN= 1/1+1=0.5,TPR = TP/TP+FN=1/1+1=0.5.

當選擇0.35爲分隔閾值時,當p>=0.35時,認爲該樣本爲正樣本,否則爲負樣本,結果如下:

真實標籤label 1 0 1 0
預測標籤: 1 1 1 0
預測概率p 0.8 0.4 0.35 0.1

則TP = 2,FN = 0, FP = 1,TN = 1;則計算得到FPR =FP/FP+TN= 1/1+1=0.5,TPR = TP/TP+FN=2/2+0=1.

當選擇0.1爲分隔閾值時,當p>=0.1時,認爲該樣本爲正樣本,否則爲負樣本,結果如下:

真實標籤label 1 0 1 0
預測標籤: 1 1 1 1
預測概率p 0.8 0.4 0.35 0.1

則TP = 2,FN = 0, FP = 2,TN = 0;則計算得到FPR =FP/FP+TN= 2/2+0=1,TPR = TP/TP+FN=2/2+0=1.

參考:https://www.zhihu.com/question/39840928/answer/241440370

https://www.cnblogs.com/haoguoeveryone/p/haoguo_5.html

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