ROC曲線的計算


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)點。

 


免責聲明!

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



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