1. 程式人生 > >python繪製precision-recall曲線、ROC曲線

python繪製precision-recall曲線、ROC曲線

基礎知識


TP(True Positive):指正確分類的正樣本數,即預測為正樣本,實際也是正樣本。
FP(False Positive):指被錯誤的標記為正樣本的負樣本數,即實際為負樣本而被預測為正樣本,所以是False。
TN(True Negative):指正確分類的負樣本數,即預測為負樣本,實際也是負樣本。
FN(False Negative):指被錯誤的標記為負樣本的正樣本數,即實際為正樣本而被預測為負樣本,所以是False。
TP+FP+TN+FN:樣本總數。
TP+FN:實際正樣本數。
TP+FP:預測結果為正樣本的總數,包括預測正確的和錯誤的。
FP+TN:實際負樣本數。
TN+FN:預測結果為負樣本的總數,包括預測正確的和錯誤的。


這裡面的概念有些繞,需要慢慢理解,/(ㄒoㄒ)/~~。以這四個基本指標可以衍生出多個分類器評價指標,如下圖:



在ROC曲線中,以FPR為x軸,TPR為y軸。FPR指實際負樣本中被錯誤預測為正樣本的概率。TPR指實際正樣本中被預測正確的概率。如下圖:



  在PR曲線中,以Recall(貌似翻譯為召回率或者查全率)為x軸,Precision為y軸。Recall與TPR的意思相同,而Precision指正確分類的正樣本數佔總正樣本的比例。如下圖:

  繪製ROC曲線和PR曲線都是選定不同閾值,從而得到不同的x軸和y軸的值,畫出曲線。例如,一個分類演算法,找出最優的分類效果,對應到ROC空間中的一個點。通常分類器輸出的都是score,如SVM、神經網路等,有如下預測效果:


no. True Hyp(0.5) Hyp(0.6) Score
1 p Y Y 0.99999
2 p Y Y 0.99999
3 p Y Y 0.99993
4 p Y Y 0.99986
5 p Y Y 0.99964
6 p Y Y 0.99955
7 n Y Y 0.68139
8 n Y N 0.50961
9 n N N 0.48880
10 n N N 0.44951
True表示實際樣本屬性,Hyp表示預測結果樣本屬性,第4列即是Score,Hyp的結果通常是設定一個閾值,比如上表Hyp(0.5)和Hyp(0.6)就是閾值為0.5和0.6時的結果,Score>閾值為正樣本,小於閾值為負樣本,這樣只能算出一個ROC值,

當閾值為0.5時,TPR=6/(6+0)=1,FPR=FP/(FP+TN)=2/(2+2)=0.5,得到ROC的一個座標為(0.5,1);Recall=TPR=1,Precision=6/(6+2)=0.75,得到一個PR曲線座標(1,0.75)。同理得到不同閾下的座標,即可繪製出曲線


閾值 TPR FPR Recall Precision ROC座標 PR座標
0.5 1 0.5 1 0.75 (0.5,1) (1,0.75)
0.6 1 0.25 1 0.86 (0.25,1) (1,0.86)
2.ROC曲線和PR曲線的關係

在ROC空間,ROC曲線越凸向左上方向效果越好。與ROC曲線左上凸不同的是,PR曲線是右上凸效果越好。

ROC和PR曲線都被用於評估機器學習演算法對一個給定資料集的分類效能,每個資料集都包含固定數目的正樣本和負樣本。而ROC曲線和PR曲線之間有著很深的關係。

  定理1:對於一個給定的包含正負樣本的資料集,ROC空間和PR空間存在一一對應的關係,也就是說,如果recall不等於0,二者包含完全一致的混淆矩陣。我們可以將ROC曲線轉化為PR曲線,反之亦然。

定理2:對於一個給定數目的正負樣本資料集,一條曲線在ROC空間中比另一條曲線有優勢,當且僅當第一條曲線在PR空間中也比第二條曲線有優勢。(這裡的“一條曲線比其他曲線有優勢”是指其他曲線的所有部分與這條曲線重合或在這條曲線之下。)

證明過程見文章《The Relationship Between Precision-Recall and ROC Curves》

當正負樣本差距不大的情況下,ROC和PR的趨勢是差不多的,但是當負樣本很多的時候,兩者就截然不同了,ROC效果依然看似很好,但是PR上反映效果一般。解釋起來也簡單,假設就1個正例,100個負例,那麼基本上TPR可能一直維持在100左右,然後突然降到0.如圖,(a)(b)分別為正負樣本1:1時的ROC曲線和PR曲線,二者比較接近。而(c)(d)的正負樣本比例為1:1,這時ROC曲線效果依然很好,但是PR曲線則表現的比較差。這就說明PR曲線在正負樣本比例懸殊較大時更能反映分類的效能。



3.AUC

AUC(Area Under Curve)即指曲線下面積佔總方格的比例。有時不同分類演算法的ROC曲線存在交叉,因此很多時候用AUC值作為演算法好壞的評判標準。面積越大,表示分類效能越好。

畫p-r曲線

#coding:utf-8
import matplotlib
matplotlib.use("Agg")
import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) # 建立圖表1
plt.title('Precision/Recall Curve')# give plot a title
plt.xlabel('Recall')# make axis labels
plt.ylabel('Precision')

#x、y都是列表,裡面存的分別是recall和precision
#傳參得到或讀取檔案得到無所謂
x=[]
y=[]
f=open('eval.txt','r')
lines=f.readlines()
for i in range(len(lines)/3):
    y.append(float(lines[3*i].strip().split(':')[1]))
    x.append(float(lines[3*i+1].strip().split(':')[1]))
f.close()
plt.figure(1)
plt.plot(x, y)
plt.show()
plt.savefig('p-r.png')


ROC曲線同樣的道理,換成以FPR為x軸,TPR為y軸就行了

下面是畫的一張圖


靈敏度和特異性

靈敏度=真陽性人數/(真陽性人數+假陰性人數)×100%。正確判斷病人的率。 

特異度=真陰性人數/(真陰性人數+假陽性人數)×100%。正確判斷非病人的率。 

臨床靈敏度可用來衡量某種試驗檢測出有病者的能力,靈敏度是將實際有病的人正確地判定為真陽性的比例。
臨床特異度是衡量試驗正確地判定無病者的能力,特異度是將實際無病的人正確地判定為真陰性的比例。

https://github.com/gmayday1997/PhD/blob/master/Codes