1. 程式人生 > >ROC受試曲線AUC

ROC受試曲線AUC

概念

ROC和AUC定義

      ROC全稱是“受試者工作特徵”(Receiver Operating Characteristic)。ROC曲線的面積就是AUC(Area Under the Curve)。AUC用於衡量“二分類問題”機器學習演算法效能(泛化能力)。

計算ROC需要知道的關鍵概念 

       首先,解釋幾個二分類問題中常用的概念:True Positive, False Positive, True Negative, False Negative。它們是根據真實類別與預測類別的組合來區分的。

       假設有一批test樣本,這些樣本只有兩種類別:正例和反例。機器學習演算法預測類別如下圖(左半部分預測類別為正例,右半部分預測類別為反例),而樣本中真實的正例類別在上半部分,下半部分為真實的反例。

  • 預測值為正例,記為P(Positive)
  • 預測值為反例,記為N(Negative)
  • 預測值與真實值相同,記為T(True)
  • 預測值與真實值相反,記為F(False)

  • TP:預測類別是P(正例),真實類別也是P
  • FP:預測類別是P,真實類別是N(反例)
  • TN:預測類別是N,真實類別也是N
  • FN:預測類別是N,真實類別是P

       樣本中的真實正例類別總數即TP+FN。TPR即True Positive Rate,TPR = TP/(TP+FN)。  同理,樣本中的真實反例類別總數為FP+TN。FPR即False Positive Rate,FPR=FP/(TN+FP)。

       還有一個概念叫”截斷點”。機器學習演算法對test樣本進行預測後,可以輸出各test樣本對某個類別的相似度概率。比如t1是P類別的概率為0.3,一般我們認為概率低於0.5,t1就屬於類別N。這裡的0.5,就是”截斷點”。  總結一下,對於計算ROC,最重要的三個概念就是TPR, FPR, 截斷點。

       截斷點取不同的值,TPR和FPR的計算結果也不同。將截斷點不同取值下對應的TPR和FPR結果畫於二維座標系中得到的曲線,就是ROC曲線。橫軸用FPR表示。 

sklearn計算ROC 

      klearn給出了一個計算ROC的例子[1] 

y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)

      通過計算,得到的結果(TPR, FPR, 截斷點)為

fpr = array([ 0. ,  0.5,  0.5,  1. ])
tpr = array([ 0.5,  0.5,  1. ,  1. ])
thresholds = array([ 0.8 ,  0.4 ,  0.35,  0.1 ])#截斷點

      將結果中的FPR與TPR畫到二維座標中,得到的ROC曲線如下(藍色線條表示),ROC曲線的面積用AUC表示(淡黃色陰影部分)。

心得

      用下面描述表示TPR和FPR的計算過程,更容易記住 TPR:真實的正例中,被預測正確的比例 FPR:真實的反例中,被預測正確的比例 最理想的分類器,就是對樣本分類完全正確,即FP=0,FN=0。所以理想分類器TPR=1,FPR=0。

舉栗子

'''例如,資料集一共有5個樣本,真實類別為(1,0,0,1,0);
二分類機器學習模型,得到的預測結果為(0.5,0.6,0.4,0.7,0.3)'''
import numpy as np
y_proba_ = np.array([0.5,0.6,0.4,0.7,0.3])

# 閾值 >=0.5 類別1
y_ = np.array([1,1,0,1,0]) # ——> 對了4個,4/5= 0.8

# 閾值 >=0.6 類別1
y_ = np.array([0,1,0,1,0]) # ——> 對了3個,3/5= 0.6

# 閾值 >=0.4 類別
y_ = np.array([1,1,1,1,0])  # ——> 對了3個,3/5= 0.6

導包

import numpy as np

import matplotlib.pyplot as plt
%matplotlib inline

from sklearn.svm import SVC

import sklearn.datasets as datasets

# 對資料進行分類
# StratifiedKFold 對資料進行分類,並且標準:按照正負樣本的比例進行劃分
from sklearn.model_selection import StratifiedKFold,KFold

# 線性插值
from scipy import interp

線性差值的舉例說明

x = np.linspace(0,2*np.pi,10)
y = np.sin(x)

# 定義40個數據,#為橫座標連續資料
xinterp = np.linspace(0,2*np.pi,40)
''' yinterp ???'''

# 線性插值
# 40個數據
'''interp(x, xp, fp, left=None, right=None, period=None)'''
yinterp = interp(xinterp,x,y)

plt.scatter(x,y,color = 'red')
plt.plot(xinterp,yinterp,marker = 'o',color = 'green')