由於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()