ROC曲線、AUC、Precision、Recall、F-measure理解及Python實現


本文首先從整體上介紹ROC曲線、AUC、Precision、Recall以及F-measure,然后介紹上述這些評價指標的有趣特性,最后給出ROC曲線的一個Python實現示例。

 

一、ROC曲線、AUC、Precision、Recall以及F-measure

二分類問題的預測結果可能正確,也可能不正確。結果正確存在兩種可能:原本對的預測為對,原本錯的預測為錯;結果錯誤也存在兩種可能:原本對的預測為錯,原本錯的預測為對,如Fig 1左側所示。其中Positives代表預測是對的,Negatives代表預測是錯的,True代表原本為對,False代表原本為錯。如何評價兩個二分類模型的好壞呢?二分類模型的理想狀態是什么呢?

首先回答第二個問題,理想的二分類模型能將原本是對的預測為對,原本是錯的預測為錯。一般情況下,我們很難收集到完備的“原本是對的,原本是錯的”數據集,也就是說,通常情況下我們獲得是完備的“原本是對的,原本是錯的”數據集的一個子集。因此,評價二分類模型的優劣就是在該子集上進行的。我們希望在該子集上對二分類模型的評價是無偏的,也就是說,在概率上保證在該子集上對二分類模型的評價與在完備集上的評價一致。

針對第一個問題,其實很簡單,數數就行了。數數原本是對的預測為對的個數,原本是錯的預測為錯的個數,原本是對的預測為錯的比例,原本是錯的預測為對的比例(評價二分類問題的四個基本元素,后續評價指標都是在此基礎上做出的)。評價一個模型的好壞用四個參數是不是有點不太直觀哦,要是只有一個評價指標,如果一個模型的這指標比別的模型大,那這個模型就比別的模型好(或者反過來,一個模型的這指標比別的模型小,那這個模型比別的模型好),該多好哦!哈哈!

precision的含義是:預測為對的當中,原本為對的比例(越大越好,1為理想狀態)

recall的含義是:原本為對的當中,預測為對的比例(越大越好,1為理想狀態)

F-measure的含義是:用precision和recall兩個指標不直觀(任性),索性把他們合並為一個,這就是F-measure(越大越好,1為理想狀態,此時precision為1,recall為1)

accuracy的含義是:預測對的(包括原本是對預測為對,原本是錯的預測為錯兩種情形)占整個的比例(越大越好,1為理想狀態)

fp rate的含義是:原本是錯的預測為對的比例(越小越好,0為理想狀態)

tp rate的含義是:原本是對的預測為對的比例(越大越好,1為理想狀態)

ROC曲線的含義是:得到算法的一組(fp rate, tp rate)然后做出的曲線(沒辦法用大小來衡量,不開心,因此有了AUC),如Fig 2所示

AUC的含義:ROC曲線下的面積(越大越好,1為理想狀態)

Fig 2 ROC曲線示意圖

二、上述評價評價指標的有趣特性

1) 實際中應用測試數據集可能存在以下三種情況之一:原本是對的與原本是錯的比例一致,原本是對的所占比例較小,原本是對的所占比例較大。在上述三種情況下,由於(fp         rate, tp rate)基本保持不變,因此ROC曲線、AUC在一定程度上具備對數據集正負樣本比例的不變性。

2) 如果單純蒙的話會是什么結果呢(假設原本是對的預測為對的比例,原本是錯的預測為錯的比例,原本是對的預測為錯的比例,原本是錯的預測為對的比例都為0.5,其實也就        是蒙的直接結果了)?此時,precision、recall以及綜合兩者的F-measure值不能作為判斷模型好壞的標准(因為原本是錯的數量不確定,考慮原本是對的數據只有1,原本是      錯的數據有10000這種極端情況根據他們的定義即可得知precision近似為0,正負樣本比例一致則precision約為0.5),也就是說上述三個指標受數據集正負樣本比例影響。

3) (fp rate, tp rate)是如何獲得呢?對於一個數據集應該只有一組(fp rate, tp rate)吧!這里面涉及到一個問題,就是二分類模型的輸出通常是輸入為對的概率,如果我      們認為概率大於T的為對,那么如果T不同則(fp rate, tp rate)不同,因此我們獲得了一組(fp rate, tp rate)。

 

三、ROC曲線的Python實現實例

讀者可根據http://scikit-learn.org/stable/install.html提示方法安裝scikit-learn

 

import numpy as np
from sklearn.metrics import roc_curve

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

from sklearn.metrics import auc
print(auc(fpr, tpr))

 

上述代碼可以得到ROC曲線數據對(fp rate,tp rate)(因為thresholds取不同值的緣故),AUC

 

 

總結:由二分類問題的四個基本元素出發,得出ROC曲線、AUC、Precision、Recall以及F-measure的定義及特性,最后給出Python的一個簡單實現。

 

 

 


免責聲明!

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



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