ROC評價指標最全攻略及Python實現

2021-02-17 小白CV

微信公眾號:小白CV
關注可了解更多CV,ML,DL領域基礎/最新知識;
如果你覺得小白CV對您有幫助,歡迎點讚/收藏/轉發

在機器學習領域中,用於評價一個模型的性能有多種指標,其中最常用的幾項有FP、FN、TP、TN、精確率(Precision)、召回率(Recall)、準確率(Accuracy)。

在上一篇原創文章FP、FN、TP、TN、精確率(Precision)、召回率(Recall)、準確率(Accuracy)評價指標詳述中,詳細的介紹了FP、FN、TP、TN、精確率(Precision)、召回率(Recall)、準確率(Accuracy)評價指標的概念和採用python的實現方式。

與上述評價指標還有一個孿生兄弟,就是ROC曲線和AUC值。接下來我們就針對這個孿生兄弟進行詳細的學習。

ROC曲線:全稱是「受試者工作特性」曲線(Receiver Operating Characteristic),源於二戰中用於敵機檢測的雷達信號分析技術,是反映敏感性和特異性的綜合指標。

它通過將連續變量設定出多個不同的臨界值,從而計算出一系列敏感性和特異性,再以敏感性為縱坐標、(1-特異性)為橫坐標繪製成曲線,曲線下面積越大,判別的準確性越高。

在ROC曲線上,最靠近坐標圖左上方的點為敏感性和特異性均較高的臨界值。

在醫學統計裡,任何一個診斷指標,都有兩個最基本的特徵,即敏感性和特異性。

單獨一個指標,如果提高其診斷的敏感性,必然降低其診斷的特異性,換句話說,減少漏診必然增加誤診,反之亦然。

所以,該指標也被引用到AI領域,用於對模型測試結果進行描述,進而反應模型的性能。

針對如何繪製ROC曲線這個問題,首先需要做一下幾個步驟:

根據機器學習中分類器的預測得分對樣例進行排序

按照順序逐個把樣本作為正例進行預測,計算出FPR和TPR

分別以FPR、TPR為橫縱坐標作圖即可得到ROC曲線

所以,作ROC曲線時,需要先求出FPR和TPR。這兩個變量的定義:

FPR = TP/(TP+FN)

TPR = TP/(TP+FP)

ROC曲線示意圖如下:

綜上,此時可以發現,在繪製ROC曲線中,求出FPR和TPR是重中之重

FPR和TPR該如何計算得到呢?sklearn.metrics.roc_curve函數提供了很好的解決方案。

fpr,tpr,thresholds=sklearn.metrics.roc_curve(y_true,
                                  y_score,
                                  pos_label=None,
                                  sample_weight=None,
                                  drop_intermediate=True)

 y_true:為真值,是label

y_score:是模型的預測結果

標籤中認定為正的label個數,例如label= [1,2,3,4],如果設置pos_label = 2,則認為3,4為positive,其他均為negtive

此時以下面一個案例,查看下roc_curve函數返回的數據是什麼樣子的:得到的就是我們所需要的FPR和TPR值,是不是很開心。

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)
print("fpr:{},tpr:{},thresholds:{}".format(fpr,tpr,thresholds))

之後,我們就拿FPR和TPR數列表,來幹些事情吧

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)
print("fpr:{},tpr:{},thresholds:{}".format(fpr,tpr,thresholds))
roc_auc = metrics.auc(fpr, tpr)
print(roc_auc)

pyplot.plot(fpr, tpr, lw=1, label="TB vs nonTB, area=%0.2f)" % (roc_auc))

pyplot.xlim([0.00, 1.0])
pyplot.ylim([0.00, 1.0])
pyplot.xlabel("False Positive Rate")
pyplot.ylabel("True Positive Rate")
pyplot.title("ROC")
pyplot.legend(loc="lower right")
pyplot.savefig(r"./ROC.png")

最終的繪製結果是這樣的(有些醜,我們接著往後看)

再回顧下上一篇文章Dog和Cat的故事:FP、FN、TP、TN、精確率(Precision)、召回率(Recall)、準確率(Accuracy)評價指標詳述

y_true = ["dog", "dog", "dog", "cat", "cat", "cat", "cat"]
y_pred = ["cat", "cat", "dog", "cat", "cat", "cat", "cat"]

dog-0,cat-1,則

y_true=[0,0,0,1,1,1,1]
y_pred=[0.3,0.6,0.5,0.8,0.86,0.73,0.85]

上述分別表示本次測試數據的標籤和結果(認為是該對應類別的置信率),由於數據太少,繪製roc曲線不明顯,此處增加三倍數據。

import seaborn as sns
from sklearn.metrics import roc_auc_score, confusion_matrix, roc_curve, auc
from matplotlib import pyplot

y_true = [0, 0, 0, 1, 1, 1, 1,0, 0, 0, 1, 1, 1, 1,0, 0, 0, 1, 1, 1, 1]
y_pred = [0.3, 0.6, 0.5, 0.8, 0.86, 0.73, 0.85,0.6,0.4,0.3,0.5,0.9,0.8,0.3,0.4,0.5,0.6,0.7,0.9,0.8,0.7]

fpr, tpr, thresholds = roc_curve(y_true, y_pred)
roc_auc = auc(fpr, tpr)
print(round(roc_auc,3))

print("fpr:{},tpr:{},thresholds:{}".format(fpr,tpr,thresholds))

pyplot.plot(fpr, tpr, lw=1, label="TB vs nonTB, area=%0.2f)" % (roc_auc))

pyplot.xlim([0.00, 1.0])
pyplot.ylim([0.00, 1.0])
pyplot.xlabel("False Positive Rate")
pyplot.ylabel("True Positive Rate")
pyplot.title("ROC")
pyplot.legend(loc="lower right")
pyplot.savefig(r"./ROC.png")

這裡是列印出來的AUC值和fpr,tpr,thresholds值

繪製的最後結果是這個樣子的,是不是有一些完美了,接著往後看,我們來寫實戰的。

這裡我們假定一個2分類的深度學習項目為例,如果你用過PyTorch就最好了,沒用過也沒關係,因為最終的形式都是要整理為規整的數據形式,之後的工作直接交給def函數來幹。

def inference():
    """
    省略一大段,包括模型的加載,實例化;
    數據的加載等等,都忽略,往後看,關注數據部分
    """
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    """
    創造標籤與預測結果的數據段,分別是GT和PD
    """
    GT = torch.FloatTensor()
    PD = torch.FloatTensor()

    for i in range(130):
        pd1 =[[0.8,0.2]]
        output_pd1 = torch.FloatTensor(pd1).to(device)
        target1 = [[1.0,0.0]]
        target1 = torch.FloatTensor(target1)  
        Target1 = torch.autograd.Variable(target1).long().to(device)
        GT = torch.cat((GT, Target1.float().cpu()), 0)   
        PD = torch.cat((PD, output_pd1.float().cpu()), 0)

    for i in range(50):
        pd1 =[[1.0,0.0]]
        output_pd1 = torch.FloatTensor(pd1).to(device)
        target1 = [[1.0,0.0]]
        target1 = torch.FloatTensor(target1)  
        Target1 = torch.autograd.Variable(target1).long().to(device)
        GT = torch.cat((GT, Target1.float().cpu()), 0)   
        PD = torch.cat((PD, output_pd1.float().cpu()), 0)
    for i in range(150):
        pd1 =[[1.0,0.0]]
        output_pd1 = torch.FloatTensor(pd1).to(device)
        target1 = [[0.0,1.0]]
        target1 = torch.FloatTensor(target1)  
        Target1 = torch.autograd.Variable(target1).long().to(device)
        GT = torch.cat((GT, Target1.float().cpu()), 0)   
        PD = torch.cat((PD, output_pd1.float().cpu()), 0)

    confusion_matrix_roc(GT, PD, "ROC", 2)

上面的數據部分是自己創造了,我很難的好吧,為了精簡的關注與ROC曲線的繪製,又要刪繁就簡,不能拖沓,我就自己創建一批數據吧,那就就for循環來創建吧。

測試數據330個,其中前130label是[1,0],預測pd是置信率[0.8,0.2]

中間50個,label是[1,0],預測pd是置信率[1.0,0.0]

後150個,label是[0,1],預測pd是置信率[1,0]

將他們通過cat按行堆疊在一起,這樣就把def定義的函數

confusion_matrix_roc()

所需要的數據給準備好啦。

此時,是不是在想confusion_matrix_roc是什麼?

在這裡定義的,即可就亮出真身,如下:

import torch
import numpy as np
from matplotlib import pyplot
from sklearn.metrics import roc_auc_score, confusion_matrix, roc_curve, auc

def confusion_matrix_roc(GT, PD, experiment, n_class):
    GT = GT.numpy()
    PD = PD.numpy()

    y_gt = np.argmax(GT, 1)
    y_gt = np.reshape(y_gt, [-1])
    y_pd = np.argmax(PD, 1) 
    y_pd = np.reshape(y_pd, [-1])

    
    if n_class > 2:
        c_matrix = confusion_matrix(y_gt, y_pd)  
        print("Confussion Matrix:\n", c_matrix)
        list_cfs_mtrx = c_matrix.tolist()
        print("List", type(list_cfs_mtrx[0]))

        

        path_confusion = r"./confusion_matrix.txt"
        
        np.savetxt(path_confusion, np.reshape(list_cfs_mtrx, -1), delimiter=',', fmt='%5s')

    if n_class == 2:
        list_cfs_mtrx = []
        tn, fp, fn, tp = confusion_matrix(y_gt, y_pd).ravel()

        list_cfs_mtrx.append("TN: " + str(tn))
        list_cfs_mtrx.append("FP: " + str(fp))
        list_cfs_mtrx.append("FN: " + str(fn))
        list_cfs_mtrx.append("TP: " + str(tp))
        list_cfs_mtrx.append(" ")
        list_cfs_mtrx.append("Accuracy: " + str(round((tp + tn) / (tp + fp + fn + tn), 3)))
        list_cfs_mtrx.append("Sensitivity: " + str(round(tp / (tp + fn + 0.01), 3)))
        list_cfs_mtrx.append("Specificity: " + str(round(1 - (fp / (fp + tn + 0.01)), 3)))
        list_cfs_mtrx.append("False positive rate: " + str(round(fp / (fp + tn + 0.01), 3)))
        list_cfs_mtrx.append("Positive predictive value: " + str(round(tp / (tp + fp + 0.01), 3)))
        list_cfs_mtrx.append("Negative predictive value: " + str(round(tn / (fn + tn + 0.01), 3)))

        path_confusion = r"./confusion_matrix.txt"
        np.savetxt(path_confusion, np.reshape(list_cfs_mtrx, -1), delimiter=',', fmt='%5s')

    
    pyplot.figure(1)
    pyplot.figure(figsize=(6, 6))
    print(PD)
    fpr, tpr, thresholds = roc_curve(GT[:, 1],PD[:, 1])  
    roc_auc = auc(fpr, tpr)
    print(PD[:, 1])

    pyplot.plot(fpr, tpr, lw=1, label="TB vs nonTB, area=%0.2f)" % (roc_auc))
    pyplot.plot(thresholds, tpr, lw=1, label='Thr%d area=%0.2f)' % (1, roc_auc))
    pyplot.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck')

    pyplot.xlim([0.00, 1.0])
    pyplot.ylim([0.00, 1.0])
    pyplot.xlabel("False Positive Rate")
    pyplot.ylabel("True Positive Rate")
    pyplot.title("ROC")
    pyplot.legend(loc="lower right")
    pyplot.savefig(r"./ROC.png")

認真看到這裡你就會發現,其實就是我們在上一篇文章裡面介紹的內容和本節中說到內容的集合,到這裡,就一網打盡啦。

最後,需要用到就收藏吧,我就不信你哪天用不到。如果您覺得好,就分享給您的小夥伴,我們一起讓知識的傳播更高效,讓技能獲取更快捷,在AI的路上沒有難題,只有遨遊。

小白CV將在第一時間發布CV/AI新動態,整理好文章

(最近會更加關注秋招,Good Luck)


相關焦點

  • roc指標選股公式 該指標的計算方法如何
    炒股的人有不少,對於股民來說肯定是要了解不同指標的的運用了,還有選股也是很重要的。ROC指標一般指變動率指標,那麼這roc指標選股公式怎麼樣?還有roc指標的計算方法如何?我們一起來看看!
  • 多分類結局的ROC分析
    但隨著機器學習及大數據的發展,針對多分類結局的預測情況越來越常見,而ROC分析是評價模型預測效果的常用方法,因此多分類結局的ROC分析著實需要。好奇的小編查閱了大量的資料後,發現通過python的sklearn包提供的micro-average (micro法) 和macro-average (macro法) 可以進行多分類結局的ROC分析。
  • roc指標最佳參數 使用技巧經驗有哪些?
    股市中不同的指標都有股民了解了,當然不同的指標有不同的含義,這roc指標是技術指標的一種了,那麼roc指標最佳參數是什麼要知道,還有roc指標使用技巧經驗有哪些呢?我們一起來了解了解!roc指標最佳參數 技術指標有很多種,有些技術指標檢測市場動向,有些技術指標檢測市場走勢,各種指標加在一起就監控了整個市場的動態
  • 變動率指標roc指標應用指南 相關原理介紹
    根據最新資料顯示得知,變動率指標(ROC),是通過計算當日股價與一定距離之前的價格變動速度的大小,來反映股價變動快慢程度的技術指標。不過變動率指標roc指標應用指南也要知道啦,因為這點是不容錯過的。
  • 最新roc指標參數設置是什麼 股民必須要知道
    一般來說,我們在留意股市的時候,都會經常看到一些指標的,因為這些指標會經常出現,也可以幫助你進行判斷股市的變化,更是可以帶你去了解股票知識等等。不過,最新roc指標參數設置是什麼呢?你了解清楚了嗎?
  • roc指標怎麼看 這個指標使用技巧介紹
    參與炒股的朋友都知道,在股市中有很多不同的指標,不同的股票,就需要使用不同的炒股指標來作為判斷方法。那麼,在股票市場上,roc指標怎麼看呢?接下來小編為大家帶來這個指標使用技巧介紹,一起來了解一下。
  • 深度學習多種模型評估指標介紹 - 附sklearn實現
    隨著閾值的逐漸減小,越來越多的實例被劃分為正類,但是這些正類中同樣也摻雜著真正的負實例,即TPR和FPR會同時增大,閾值最大時,對應坐標點為(0, 0),閾值最小時,對應坐標點為(1,1)為什麼使用ROC和AUC評價分類器既然已經這麼多標準,為什麼還要使用ROC和AUC呢?因為ROC曲線有個很好的特性:當測試集中的正負樣本的分布變換的時候,ROC曲線能夠保持不變。
  • 機器學習中分類任務的常用評估指標和python代碼實現
    有許多指標可以幫助您根據用例進行操作。在此文章中,我們將嘗試回答諸如何時使用?它是什麼?以及如何實施?混淆矩陣混淆矩陣定義為(類x類)大小的矩陣,因此對於二進位分類,它是2x2,對於3類問題,它是3x3,依此類推。為簡單起見,讓我們考慮二元分類並了解矩陣的組成部分。
  • roc指標應用買賣技巧 投資者千萬不要錯過了
    ROC又叫變動速率指標,其英文全稱是RateofChange,是一種重點研究股價變動動力大小的中短期技術分析工具,在股市當中也是經常出現的,所以我們常常都會關注這個指標,因為可以有著不少的好處。目前roc指標應用買賣技巧揭曉了,究竟有哪些呢?
  • roc指標如何解讀 散戶們要注意以下幾點
    近期,A股市場一直在波動不定,為了掌握好股票的買賣點,作為股民都需要通過相對應的股票分析指標來分析股票的走勢。這裡小編我就給大家介紹一下roc指標的相關內容,看看roc指標如何解讀?提醒散戶們要注意以下幾點分析方法。
  • 機器學習中分類問題常用評價指標總結
    在機器學習任務中,衡量一個模型的優劣,通常有很多指標,對於同一個模型在不同任務中使用的評價指標也不盡相同。
  • 使用python+sklearn實現度量和評分
    許多度量(metrics)指標沒有被命名以使得它們被用作scoring值,有時是因為它們需要額外的參數,例如fbeta_score。在這種情況下,您需要生成一個適當的評分對象,最簡單方法是調用make_scorer生成一個用於評分的可調用對象。該函數將度量(metrics)指標轉換為可用於模型評估的可調用對象。
  • R與生物專題 | 第五十講 R-ROC曲線
    → 當閾值設定為最低時,必得出ROC座標系右上角的點 (1, 1)。→ 隨著閾值切點調低,ROC點 往右上(或右/或上)移動,或不動;但絕不會往左下(或左/或下)移動。高效能的分類器的ROC會急劇上升到左上角,也就是說,它將正確地識別出很多陽性,而不會將很多陰性歸錯類為陽性。· 在我們的示例中,AUC為0.924,接近最大值(max = 1)。
  • 最全 Python 算法實現資源匯總!
    整理 | Rachel責編 | Jane出品 | Python大本營(ID:pythonnews)【導語】數據結構與算法是所有人都要學習的基礎課程數據結構在 data_structure 文件夾下,項目作者提供了大部分常用的 python 的實現代碼,包括哈希表、堆、棧、隊列等等。具體如下圖所示。
  • 機器學習中的AUC-ROC曲線
    你需要對它進行評估,並驗證它有多好(或有多壞),這樣你就可以決定是否實現它。這時就可以引入AUC-ROC曲線了。這個名字可能有點誇張,但它只是說我們正在計算「Receiver Characteristic Operator」(ROC)的「Area Under the Curve」(AUC)。
  • 機器學習系列-ROC曲線以及AUC計算
    對於分類器,或者是機器學習中的分類算法,評價指標主要有precision,recall,F1-score以及接下來我們要討論的ROC以及AUC。本文主要是對以上評價指標做一些簡單的原理介紹,然後通過python和SPSS兩種軟體來實現二分類和多分類的ROC曲線。本菜鳥之前在面試豬場數據分析崗的時候,面試官出了一道這樣的題「AUC的計算公式是什麼?」
  • 特徵工程總結:R與python的比較實現
    與R的比較實現目錄1.特徵工程概述2.特徵工程知識框架3.特徵工程的一般步驟4.特徵選擇的python與R實現比較4.1 導入數據4.2 數據預處理4.2.1 標準化4.2.2 區間放縮法  4.2.3 歸一化  4.2.4 對定量特徵二值化  4.2.5 對定性特徵啞編碼
  • 機器學習第十篇:如何評價模型效果評估
    這一篇就針對機器學習算法的效果評估指標進行介紹。這是上面圖表直觀上傳達的意思,我們接下來用不同的量化指標去評判女神的判斷效果,並用sklearn庫實現。準確率準確率(accuracy)是指所有被正確劃分類別(實際是土豪被判斷為土豪人數+實際是非土豪被判斷為非土豪的人數)的人數佔總人數(所有被判斷對象)的比值(5+1)/10=0.6。
  • ROC曲線
    關鍵詞 import matplotlib.pylab as pltfrom scipy import interpfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import roc_curve,aucfrom sklearn.model_selection
  • ROC指標是什麼意思?ROC指標概念
    ROC指標是什麼意思?ROC指標概念  ROC是由當天的股價與一定的天數之前的某一天股價比較,其變動速度的大小,來反映股票市變動的快慢程度。大多數的書籍上把ROC叫做變動速度指標或變化速率指標。從英文原文直譯應該是變化率。   1.