1、ROC曲線簡介
在評價分類模型時,會用到ROC(receiver operating characteristic)曲線。ROC曲線可用來評價二元分類器( binary classifier)的優劣,如下圖:
假設我們的樣本分為正(positive)、負(negative)兩類,
- x軸false positive rate(FPR)表示:將負樣本錯誤預測為正樣本的比例。計算公式:負樣本預測為正樣本的數量 除以 負樣本的總數。
- y軸true positive rate(TPR)表示:預測正確的正樣本,在所有正樣本中所占的比例,也就是正樣本的召喚率。計算公式:預測正確的正樣本數量 除以 正樣本的總數。
考慮圖中(0,0) (1,1) (0,1) (1,0) 四個點:
- (0,0)表示:FPR=0,TPR=0。沒有負樣本預測錯誤(也就是負樣本全部預測正確),正樣本全部預測錯誤。這說明把全部樣本都預測為了負樣本。
- (1,1)表示:FPR=1,TPR=1。負樣本全部預測錯誤,正樣本全部預測正確。這說明把全部樣本都預測為了正樣本。
- (0,1)表示:FPR=0,TPR=1。負樣本全部預測正確,正樣本全部預測正確。這個模型很完美。
- (1,0) 表示:FPR=1,TPR=0。負樣本全部預測錯誤,正樣本全部預測錯誤。這個模型太爛了。
也就是說,曲線越偏向於左上角,說明模型越好。但是上圖中的三條曲線(對應三個模型)相互交叉,並不容易區分哪個模型更優,於是就引出了一個新的指標:
我們將曲線與x軸、直線x=1圍成的面積,稱作AUC(Area under the curve)。AUC位於0到1之間,取值越大說明模型越好。
2、ROC的計算
2.1、求解示例
首先看一個sklearn.metrics.roc_curve求解ROC的示例:
>>> import numpy as np >>> from sklearn import metrics >>> 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) >>> 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 ])
該示例有4個樣本,參數說明如下:
- y:樣本的真值
- pos_label=2:表明取值為2的樣本是正樣本。
- scores:預測出的某樣本是正樣本的概率。
- fpr、tpr:每個(fpr[i], tpr[i])都表示ROC曲線上的一個點,一共求解出了4個點。
- thresholds:求解(fpr[i], tpr[i])時使用的閾值。
2.2、求解步驟
可以看出,閾值thresholds就是對概率scores進行了排序(倒序)。不斷改變閾值,得到ROC曲線上不同的點。步驟如下:
- threshold取0.8:也就是說預測概率大於等於0.8時,我們將樣本預測為正樣本。那么4個樣本的預測結果為[1, 1, 1, 2]。負樣本全部預測正確,正樣本全部找到了。從而得到ROC曲線上一個點(0, 0.5)
- threshold取0.4:預測概率大於等於0.4時,認為是正樣本。預測結果為[1, 2, 1, 2]。結果比上次糟糕,負樣本一個預測錯誤,正樣本一個沒有找到,從而得到ROC上面的(0.5, 0.5)點。
- threshold取0.35:預測概率大於等於0.35時,認為是正樣本。得到預測結果[1, 2, 2, 2]。負樣本一個預測錯誤,正樣本全部找出來了,從而得到(0.5, 1)
- threshold取0.1:預測大於等於0.1時,就認為是正樣本。盡管召回率很高,但預測結果再次變差,把所有樣本都預測為了正樣本,從而得到(1, 1)點。