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')