2015年6月27日 星期六

[Python] Receiver operating characteristic (ROC) Curve 實作教學

enter image description here
        ROC Curve以及AUC(Area Under Curve)常被用來衡量預測模型的效果,但是因為之前不了解演算法只會套公式,所以趁空擋簡單實作了ROC演算法.

        ROC Curve主要是要將分類模型的效果視覺化,幫助研究人員選擇模型.ROC Curve適用於輸出為機率的分類(例如svm, logistic regression),計算在不同機率條件下,對於判斷結果的影響.

        白話來說,當使用一個機率分類模型時,最後算出的結果(例如0.7)為結果為正值的機率.這時候必須思考要以多少機率為分界,將結果認定為正值還是負值,例如超過0.5都判斷為1,小於0.5都判斷為0,或大於0.7才判斷為1,那條機率界線是會變化的.

        決定threshold之後,就可以依據分類的結果畫出Confusion Matrix來計算Presicion和Recall(可參考準確率(Precision)與召回率(Recall)).接著就可以算出要畫ROC Curve的指標:TPR和FPR.
  • TPR(True Postive Rate):將正值判斷為正的機率
  • FPR(False Postive Rate):將負值判斷為負的機率
機率圖和confusion matrix如下圖
enter image description here
參考資料:[“Receiver Operating Characteristic” by kakau - Selbstgepinselt mit PowerPoint. Licensed under CC BY-SA 3.0 via Wikimedia Commons ] (https://commons.wikimedia.org/wiki/File:Receiver_Operating_Characteristic.png#/media/File:Receiver_Operating_Characteristic.png)

        橫軸是為正值的機率,紅色的區塊(TP+FN)為真正值的機率分佈,藍色的區塊(TN+FP)為真負值的機率分佈,中間那條線就是判斷為正負的threshold,每個切點都會產生一組TPR和FPR,將所有切點的組合(0,0.1,0.2,0.3…1)連結起來就成了ROC Curve(如果覺得平面的圖很難想像可以看動畫

以下用python實作:
import numpy as np
def roc(actual, pred):
    fpr=np.array([1.0])
    tpr=np.array([1.0])
    n=float(len(actual)-sum(actual))
    p=float(sum(actual))
    for i in np.arange(min(pred), max(pred), 1.0/len(pred)):
        TP=0.0
        FP=0.0
        for j in range(len(pred)):
            if (pred[j] > i) & (actual[j]==1):
                TP+=1
            if (pred[j] > i) & (actual[j]==0):
                FP+=1

        tpr = np.insert(tpr, 0, TP/p)
        fpr = np.insert(fpr, 0, FP/n)
    return fpr, tpr
這個結果和用sikit-learn的套件結果一致
enter image description here
參考資料:
- wiki
- ROC Graphs: Notes and Practical Considerations for Researchers, Tom, 2004
- ROC curves and Area Under the Curve explained (video)