ROC與AUC曲線繪制


由於ROC曲線面積比較難求得,所以判斷模型好壞一般使用AUC曲線

 

關於AUC曲線的繪制,西瓜書上寫得比較學術,不太能理解,假設有這么一個樣本集:

假設預測樣本為20個,預測為正類的概率已經進行了排序,得分遞減,畫圖步驟為:

(1) 在所排序的樣本最左邊,畫一條線即  無 | 1 2 3 4 5 …,線左邊的認為是正類,右邊認為是負類,可以算出,TP(實際為正,預測為正)=0,FN(實際為正,預測為負)=10,TN(實際為負,預測為負)=10,FP(實際為負,預測為正)=0,故而TPR=0,FPR=0

(2) 在第一個樣本后面,畫一條線即 1 | 2 3 4 …,線左邊的認為是正類,右邊認為是負類,可以算出,TP(實際為正,預測為正)=1,FN(實際為正,預測為負)=9,TN(實際為負,預測為負)=10,FP(實際為負,預測為正)=0,故而TPR=0.1,FPR=0

(3) 在第二個樣本后面,畫一條線即 1 2| 3 4 …,線左邊的認為是正類,右邊認為是負類,可以算出,TP(實際為正,預測為正)=2,FN(實際為正,預測為負)=8,TN(實際為負,預測為負)=10,FP(實際為負,預測為正)=0,故而TPR=0.2,FPR=0

(4) 在第三個樣本后面,畫一條線即 1 2 3| 4 5…,線左邊的認為是正類,右邊認為是負類,可以算出,TP(實際為正,預測為正)=2,FN(實際為正,預測為負)=8,TN(實際為負,預測為負)=10,FP(實際為負,預測為正)=1,故而TPR=0.2,FPR=0.1

... ...

依次例推:起點一定為(0,0),終點一定為(1,1),由此即可畫出AUC曲線

但這樣做比較繁瑣,可以總結規律為:

按照預測為正類的概率值由大到小排序,首先起點一定是(0,0),然后使用上述划線法進行計算,每次碰到一個預測為正的樣本,則在Y方向加一個Y步長,否則在X方向加一個X步長,其中X和Y的步長,計算方法為X: 負類樣本個數分之1,Y:正類樣本個數分之1,如果是降序排列,則是減一個對應方向的步長即可

代碼部分:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

def plotROC(predStrengths,classLabels):
    font = FontProperties(fname = r"c:\windows\fonts\simsun.ttc",size=14)
    cur=(1.0,1.0)             #繪制光標位置
    ySum=0.0                  #用於計算AUC
    numPosClas=np.sum(np.array(classLabels)==1.0)  #正類樣本的個數
    yStep = 1/float(numPosClas)                    #Y軸步長
    xStep = 1/float(len(classLabels)-numPosClas)   #X軸步長

    sortedIndicies = predStrengths.argsort()
    fig =plt.figure()
    fig().clf()
    ax=plt.figure()
    for inddex in sortedIndicies.tolist()[0]:
        if classLabels[index]==1.0
            delX=0; delY = yStep   #碰到一個正類,Y的步長減 1
        else:
            delX = xStep; delY=0   #碰到一個負類,X的步長減1
            ySum += cur[1]         #每次cur[1]都可能變化了       #高度累加
        ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY],c = 'b')   #繪制ROC
        cur = (cur[0]-delX,cur[1]-delY)                         #更新繪制光標的位置
    ax.plot([0,1],[0,1],'b--')
    plt.title('ROC曲線',FontProperties =font)
    plt.xlabel('假正例率',FontProperties = font)
    plt.ylabel(('真正例率',FontProperties = font))
    ax.axis([0,1,0,1])
    print('AUC面積:',ySum*xStep)                         #計算AUC
    plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM