機器學習之ROC和AUC(python代碼)


1.什么是ROC:

    ROC曲線:接收者操作特征曲線(receiver operating characteristic curve)是反映敏感性和特異性連續變量的綜合指標roc曲線上每個點反映着對同一信號刺激的感受性。

2.如果學習ROC首先必須知道什么:

         要學習ROC曲線首先得知道什么是TPR什么是FPR。

          TPR的英文全稱為:True Positive Rate
          FPR的英文全稱為:False Positive Rate
          中文解釋為:
          TPR(真正例率):真實值是正例且預測為正例的比例
          FPR(假正例率):真實值為負例而預測為正例的比例

例如此圖:

  

 

此圖分為四部分:

    A部分:真實為正例預測為正例
    B部分:真實為正例預測為負例
    C部分:真實為負例預測為正例
    D部分:真實為負例預測為負例

 

ROC曲線就是以TPR為Y軸以FPR為X軸然后以一個對不同的預測值進行分類.
當取不同閾值時會得到不同的TPR和FPR對應於ROC曲線上的一個點。
那么ROC曲線就反映了FPR與TPR之間動態關系的情況。
通俗地來說即在TPR隨着FPR遞增的情況下誰增長得更快快多少的問題。
TPR增長得越快曲線越往上曲反映了模型的分類性能就越好。
當正負樣本不平衡時這種模型評價方式比起一般的精確度評價方式 的好處尤其顯著。

說完ROC,說一下AUC。

         AUC (Area Under Curve) 被定義為ROC曲線下的面積顯然這個面積的數值不會大於1。

         又由於ROC曲線一般都處於y=x這條直線的上方所以AUC的取值范圍一般在0.5和1之間。

         使用AUC值作為評價標准是因為很多時候ROC曲線並不能清晰的說明哪個分類器的效果更好而作為一個數值對應AUC更大的分類器效果更好。

 

從AUC判斷分類器(預測模型)優劣的標准:

  • AUC = 1是完美分類器采用這個預測模型時存在至少一個閾值能得出完美預測。絕大多數預測的場合不存在完美分類器。
  • 0.5 < AUC < 1優於隨機猜測。這個分類器(模型)妥善設定閾值的話能有預測價值。
  • AUC = 0.5跟隨機猜測一樣(例:丟銅板)模型沒有預測價值。
  • AUC < 0.5比隨機猜測還差;但只要總是反預測而行就優於隨機猜測。

 

為什么使用ROC和AUC?

       既然已經這么多評價標准 為什么還要使用ROC和AUC呢?因為ROC曲線有個很好的特性:當測試集中的正負樣本的分布變化的時候 ROC曲線能夠保持不變。
     在實際的數據集中經常會出現類不平衡(class imbalance)現象 即負樣本比正樣本多很多(或者相反) 而且測試數據中的正負樣本的分布也可能隨着時間變化。
 
繪制ROC曲線代碼如下:

#繪制ROC曲線函數
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import StratifiedKFold
def drawROC(classifier,X,y):
#X:訓練集/測試集
#y:訓練集標簽/測試集標簽
print(X.shape)
print(y.shape)
# 畫平均ROC曲線的兩個參數
mean_tpr = 0.0 # 用來記錄畫平均ROC曲線的信息
mean_fpr = np.linspace(0, 1, 100)
cnt = 0
cv = StratifiedKFold(n_splits=6) #導入該模型后面將數據划分6份
for i, (train, test) in enumerate(cv.split(X,y)): #利用模型划分數據集和目標變量 為一一對應的下標
cnt +=1
probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test]) # 訓練模型后預測每條樣本得到兩種結果的概率
fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1]) # 該函數得到偽正例、真正例、閾值這里只使用前兩個

mean_tpr += np.interp(mean_fpr, fpr, tpr) # 插值函數 interp(x坐標,每次x增加距離,y坐標) 累計每次循環的總值后面求平均值
mean_tpr[0] = 0.0 # 將第一個真正例=0 以0為起點

roc_auc = auc(fpr, tpr) # 求auc面積
plt.plot(fpr, tpr, lw=1, label='ROC fold {0:.2f} (area = {1:.2f})'.format(i, roc_auc)) # 畫出當前分割數據的ROC曲線

plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck') # 畫對角線

mean_tpr /= cnt # 求數組的平均值
mean_tpr[-1] = 1.0 # 坐標最后一個點為(1,1) 以1為終點
mean_auc = auc(mean_fpr, mean_tpr)

plt.plot(mean_fpr, mean_tpr, 'k--',label='Mean ROC (area = {0:.2f})'.format(mean_auc), lw=2)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate') # 可以使用中文但需要導入一些庫即字體
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
#調用
train_Y[train_Y == 2] = 0
print(train_Y)
drawROC(clf,train_X[:,:],train_Y[:])

繪圖效果:

  


免責聲明!

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



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