機器學習:基於sklearn的AUC的計算原理

2021-01-18 深度學習科研平臺

AUC原理

一、AUC起源

AUC是一種用來度量分類模型好壞的一個標準。這樣的標準其實有很多,例如:大約10年前在 machine learning文獻中一統天下的標準:分類精度;在信息檢索(IR)領域中常用的recall和precision,等等。其實,度量反應了人們對」 好」的分類結果的追求,同一時期的不同的度量反映了人們對什麼是」好」這個最根本問題的不同認識,而不同時期流行的度量則反映了人們認識事物的深度的變 化。近年來,隨著machine learning的相關技術從實驗室走向實際應用,一些實際的問題對度量標準提出了新的需求。特別的,現實中樣本在不同類別上的不均衡分布(class distribution imbalance problem)。使得accuracy這樣的傳統的度量標準不能恰當的反應分類器的performance。

舉個例子:測試樣本中有A類樣本90個,B 類樣本10個。分類器C1把所有的測試樣本都分成了A類,分類器C2把A類的90個樣本分對了70個,B類的10個樣本分對了5個。則C1的分類精度為 90%,C2的分類精度為75%。但是,顯然C2更有用些。

另外,在一些分類問題中犯不同的錯誤代價是不同的(cost sensitive learning)。這樣,默認0.5為分類閾值的傳統做法也顯得不恰當了。 

為了解決上述問題,人們從醫療分析領域引入了一種新的分類模型performance評判方法——ROC分析。

ROC分析本身就是一個很豐富的內容,有興趣的讀者可以自行Google。

二、ROC曲線

roc曲線:接收者操作特徵(receiveroperating characteristic),roc曲線上每個點反映著對同一信號刺激的感受性。

橫軸:負正類率(false postive rate FPR)特異度,劃分實例中所有負例佔所有負例的比例;(1-Specificity)

縱軸:真正類率(true postive rate TPR)靈敏度,Sensitivity(正類覆蓋率)

2針對一個二分類問題,將實例分成正類(postive)或者負類(negative)。但是實際中分類時,會出現四種情況.

(1)若一個實例是正類並且被預測為正類,即為真正類(True Postive TP)

(2)若一個實例是正類,但是被預測成為負類,即為假負類(False Negative FN)

(3)若一個實例是負類,但是被預測成為正類,即為假正類(False Postive FP)

(4)若一個實例是負類,但是被預測成為負類,即為真負類(True Negative TN)

TP:正確的肯定數目

FN:漏報,沒有找到正確匹配的數目

FP:誤報,沒有的匹配不正確

TN:正確拒絕的非匹配數目

列聯表如下:

由上表可得出橫,縱軸的計算公式:

(1)真正類率(True Postive Rate)TPR: TP/(TP+FN),代表分類器預測的正類中實際正實例佔所有正實例的比例。Sensitivity

(2)負正類率(False Postive Rate)FPR: FP/(FP+TN),代表分類器預測的正類中實際負實例佔所有負實例的比例。1-Specificity

(3)真負類率(True Negative Rate)TNR: TN/(FP+TN),代表分類器預測的負類中實際負實例佔所有負實例的比例,TNR=1-FPR。Specificity

假設採用邏輯回歸分類器,其給出針對每個實例為正類的概率,那麼通過設定一個閾值如0.6,概率大於等於0.6的為正類,小於0.6的為負類。對應的就可以算出一組(FPR,TPR),在平面中得到對應坐標點。隨著閾值的逐漸減小,越來越多的實例被劃分為正類,但是這些正類中同樣也摻雜著真正的負實例,即TPR和FPR會同時增大。閾值最大時,對應坐標點為(0,0),閾值最小時,對應坐標點(1,1)。

如下圖中實線為ROC曲線,線上每個點對應一個閾值。

橫軸FPR:1-TNR,1-Specificity,FPR越大,預測正類中實際負類越多。

縱軸TPR:Sensitivity(正類覆蓋率),TPR越大,預測正類中實際正類越多。

理想目標:TPR=1,FPR=0,即圖中(0,1)點,故ROC曲線越靠攏(0,1)點,越偏離45度對角線越好,Sensitivity、Specificity越大效果越好。

三、繪製ROC曲線

假設已經得出一系列樣本被劃分為正類的概率,然後按照大小排序,下圖是一個示例,圖中共有20個測試樣本,「Class」一欄表示每個測試樣本真正的標籤(p表示正樣本,n表示負樣本),「Score」表示每個測試樣本屬於正樣本的概率。

接下來,我們從高到低,依次將「Score」值作為閾值threshold,當測試樣本屬於正樣本的概率大於或等於這個threshold時,我們認為它為正樣本(預測標籤),否則為負樣本(預測標籤)。

舉例來說,對於圖中的第4個樣本,其「Score」值為0.6,那麼樣本1,2,3,4都被認為是正樣本(預測標籤),因為它們的「Score」值都大於等於0.6,而其他樣本則都認為是負樣本(預測標籤)。每次選取一個不同的threshold,我們就可以得到一組FPR和TPR,即ROC曲線上的一點。這樣一來,我們一共得到了20組FPR和TPR的值,將它們畫在ROC曲線的結果如下圖:

AUC(Area under Curve):Roc曲線下的面積,介於0.1和1之間。Auc作為數值可以直觀的評價分類器的好壞,值越大越好。

首先AUC值是一個概率值,當你隨機挑選一個正樣本以及負樣本,當前的分類算法根據計算得到的Score值將這個正樣本排在負樣本前面的概率就是AUC值,AUC值越大,當前分類算法越有可能將正樣本排在負樣本前面,從而能夠更好地分類。

接下來,我們來具體一個實現的列子:

sklearn給出了一個計算roc的例子:

通過計算,得到的結果(TPR, FPR, 截斷點)為

 (1). 分析數據

y是一個一維數組(樣本的真實分類)。數組值表示類別(一共有兩類,1和2)。我們假設y中的1表示反例,2表示正例。即將y重寫為:

score即各個樣本屬於正例的概率。

(2). 針對score,將數據排序

(3). 將截斷點依次取值為score值

將截斷點依次取值為0.1, 0.35, 0.4, 0.8時,計算TPR和FPR的結果。

 3.1. 截斷點為.01

說明只要score>=0.1,它的預測類別就是正例。 
此時,因為4個樣本的score都大於等於0.1,所以,所有樣本的預測類別都為P。

TPR = TP/(TP+FN) = 1 

FPR = FP/(TN+FP) = 1

3.2. 截斷點為0.35

說明只要score>=0.35,它的預測類別就是P。 
此時,因為4個樣本的score有3個大於等於0.35。所以,所有樣本的預測類有3個為P(2個預測正確,1一個預測錯誤);1個樣本被預測為N(預測正確)。

TPR = TP/(TP+FN) = 1 
FPR = FP/(TN+FP) = 0.5

3.3. 截斷點為0.4

說明只要score>=0.4,它的預測類別就是P。 
此時,因為4個樣本的score有2個大於等於0.4。所以,所有樣本的預測類有2個為P(1個預測正確,1一個預測錯誤);2個樣本被預測為N(1個預測正確,1一個預測錯誤)。

 TPR = TP/(TP+FN) = 0.5 

FPR = FP/(TN+FP) = 0.5

 3.4. 截斷點為0.8

說明只要score>=0.8,它的預測類別就是P。所以,所有樣本的預測類有1個為P(1個預測正確);3個樣本被預測為N(2個預測正確,1一個預測錯誤)。

四、AUC的計算

   1.  最直觀的,根據AUC這個名稱,我們知道,計算出ROC曲線下面的面積,就是AUC的值。事實上,這也是在早期 Machine Learning文獻中常見的AUC計算方法。由於我們的測試樣本是有限的。我們得到的AUC曲線必然是一個階梯狀的。因此,計算的AUC也就是這些階梯 下面的面積之和。這樣,我們先把score排序(假設score越大,此樣本屬於正類的概率越大),然後一邊掃描就可以得到我們想要的AUC。但是,這麼做有個缺點,就是當多個測試樣本的score相等的時候,我們調整一下閾值,得到的不是曲線一個階梯往上或者往右的延展,而是斜著向上形成一個梯形。此時,我們就需要計算這個梯形的面積。由此,我們可以看到,用這種方法計算AUC實際上是比較麻煩的。 

   2. 一個關於AUC的很有趣的性質是,它和Wilcoxon-Mann-Witney Test是等價的。而Wilcoxon-Mann-Witney Test就是測試任意給一個正類樣本和一個負類樣本,正類樣本的score有多大的概率大於負類樣本的score(在實際預測過程中,分類器總是分別給正負樣本一個概率(score)值,並根據設定的閾值,將樣本預測為正或負樣本標籤)。有了這個定義,我們就得到了另外一中計算AUC的辦法:得到這個概率。我們知道,在有限樣本中我們常用的得到概率的辦法就是通過頻率來估計之。這種估計隨著樣本規模的擴大而逐漸逼近真實值。這和上面的方法中,樣本數越多,計算的AUC越準確類似,也和計算積分的時候,小區間劃分的越細,計算的越準確是同樣的道理。具體來說就是統計一下所有的 M×N(M為正類樣本的數目,N為負類樣本的數目)個正負樣本對中,有多少個組中的正樣本的score大於負樣本的score。當二元組中正負樣本的 score相等的時候,按照0.5計算。然後除以MN。實現這個方法的複雜度為O(n^2)。n為樣本數(即n=M+N) 
   3.  第三種方法實際上和上述第二種方法是一樣的,但是複雜度減小了。它也是首先對score(預測為正標籤的概率值或得分)從大到小排序,然後令最大score對應的sample的rank為n=M+N,第二大score對應sample的rank為n-1,以此類推。然後把所有的正類樣本的rank相加,再減去M-1種兩個正樣本組合的情況。得到的就是所有的樣本中有多少對正類樣本的score大於負類樣本的score。然後再除以M×N。即 

特別需要注意的是,再存在score相等的情況時,對相等score的樣本,需要 賦予相同的rank(無論這個相等的score是出現在同類樣本還是不同類的樣本之間,都需要這樣處理)。具體操作就是再把所有這些score相等的樣本 的rank取平均。然後再使用上述公式。

相關焦點

  • 機器學習備忘錄 | AUC值的含義與計算方法
    通常很多的機器學習工具都封裝了模型指標的計算,當然也包括 AUC 值。可以看出,使用 scikit-learn 工具提供的 roc_auc_score 函數計算 AUC 值相當簡單,只需要提供樣本的實際標籤和預測值這兩個變量即可,大大方便了我們的使用,真心感謝這些開源軟體的作者們!
  • 機器學習之sklearn基礎教程!
    公眾號關注 「Python遇見機器學習」設為「星標」,第一時間知曉最新乾貨~本次分享是基於scikit-learn工具包的基本分類方法,包括常見的Logisitic Regression、支持向量機、決策樹、隨機森林以及K近鄰方法KNN。
  • 機器學習中的AUC-ROC曲線
    AUC-ROC曲線你已經建立了你的機器學習模型-那麼接下來呢?你需要對它進行評估,並驗證它有多好(或有多壞),這樣你就可以決定是否實現它。這時就可以引入AUC-ROC曲線了。這個名字可能有點誇張,但它只是說我們正在計算「Receiver Characteristic Operator」(ROC)的「Area Under the Curve」(AUC)。別擔心,我們會詳細了解這些術語的含義,一切都將是小菜一碟!現在,只需知道AUC-ROC曲線可以幫助我們可視化機器學習分類器的性能。
  • AUC的一般計算和近似計算方式
    import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.metrics import roc_curve, auc# Calculate 'True Positive Rate' and 'False Positive Rate
  • 機器學習之基於sklearn的KMeans聚類
    聚類算法,無監督學習的代表算法,又叫做「無監督分類」即在訓練的時候只需要特徵矩陣,不需要真實值標籤可以有效地幫助我們探索數據的自然分布一、KMeans算法的運行過程運行的流程如下:自動聚類時的質心點的每步驟變化如下:下圖中紅色x和藍色x即為質心點二、sklearn
  • 萬字長文總結機器學習的模型評估與調參|附代碼下載
    2.1 K折交叉驗證原理先不多說,先貼一張原理圖(以10折交叉驗證為例)。k折交叉驗證步驟:Step 1:使用不重複抽樣將原始數據隨機分為k份;Step 2:其中k-1份數據用於模型訓練,剩下的那1份數據用於測試模型;Step 3:重複Step 2 k次,得到k個模型和他的評估結果。
  • 機器學習之sklearn中的降維算法
    PCA與SVDsklearn中降維算法都被包括在模塊decomposition中,這個模塊本質是一個矩陣分解模塊。在過去的十年中,如果要討論算法進步的先鋒,矩陣分解可以說是獨樹一幟。矩陣分解可以用在降維,深度學習,聚類分析,數據預處理,低緯度特徵學習,推薦系統,大數據分析等領域。
  • 如何用sklearn創建機器學習分類器?這裡有一份上手指南
    原作:Kasper Fredenslund林鱗 編譯自 Data Science Central量子位 出品 |分類器是數據挖掘中對樣本進行分類的方法的統稱,也是入坑機器學習的一項必備技能。這篇文章中,作者簡要介紹了用Python中的機器學習工具scikit-learn(sklearn)創建機器學習分類器的步驟與注意事項。
  • AUC和線上點擊率指標不一致問題分析
    AUC和線上點擊率指標不一致問題分析 原標題:AUC和線上點擊率指標不一致問題分析蘑菇街搜索、推薦排序算法owner,大規模機器學習從業者
  • 機器學習中不平衡數據集分類示例:乳腺鉬靶微鈣化攝影數據集分類
    我們將使用roc_auc_score()函數計算的AUC來評估和比較模型效果。我們可以定義一個函數來加載數據集,並將列拆分為輸入和輸出變量。我們將類標籤重新編碼為0和1。下面的load_dataset()函數實現了這一點。
  • 特徵選擇及基於Sklearn的實現
    sklearn.feature_selection模塊被廣泛應用於樣本數據集的特徵選擇和特徵降維,以減少特徵數量,增強對特徵和特徵值之間的理解,提高預測準確性或提高在高維數據集上的性能。本文將依據官方文檔對sklearn.feature_selection模塊進行介紹。
  • 機器學習算法基礎(使用Python代碼)
    機器學習算法類型從廣義上講,有3種類型的機器學習算法。1.監督學習工作原理:該算法由一個目標/結果變量(或因變量)組成,該變量將從給定的一組預測變量(自變量)中預測。使用這些變量集,我們生成一個將輸入映射到所需輸出的函數。
  • 谷歌AutoML鼻祖新作AutoML-Zero:從零開始構建機器學習算法
    原文連結:https://arxiv.org/abs/2003.03384幾乎從零開始,跟傳統的組裝型自動機器學習區別很大我們手工構建一個典型的機器學習模型,要經過以下幾個步驟,數據預處理、模型構建、學習、預測,而 AutoML-Zero 的工作原理,可以簡單理解為將各個步驟涉及的基本數學方法放在一個籃子裡,然後隨機從籃子取出放在對應的步驟,利用進化搜索,不斷得到最優的組合
  • 算法應用|機器學習python應用,簡單機器學習項目實踐
    可以說這並不是一個正式的項目,只是用來做一個簡單的展示,用於給初次接觸機器學習的讀者快速了解機器學習的過程和結果。1 機器學習中的Hello World頂目學習編程時,往往我們的第一句代碼就是print(「Hello World」),而接下來的這個數據集,可以說得上是機器學習中的Hello World頂目,入門學習機器學習的過程中最常見的一個數據集。
  • AUC 的缺陷是什麼?
    我們不建議使用 AUC 出於五個原因:(1) 忽略了預測的概率值和模型的擬合優度;(舉個例子,假設某個模型對 「1」 類樣本輸出的概率都是 0.51,對 「0」 類樣本輸出的概率均為 0.49,此時 AUC 是 1,但是二元交叉熵非常大,因為預測結果和真實標籤之間的誤差太大);根據 auc 的公式我們可以知道 auc 對於具體的概率值不敏感,
  • 【全自動機器學習】ML 工程師屠龍利器,一鍵接收訓練好的模型
    而自動機器學習的兩大工具,Auto-weka 有可視化界面,只需輕點滑鼠就能完成訓練工作,auto-sklearn 也僅需數行代碼便可構建可用的模型。操作如此簡單,還不用擔心訓練後的模型不 work,是不是很值得上手試驗一番?
  • 為什麼是AUC值而不是GSEA來挑選轉錄因子呢
    首先批量計算AUC值如果是單細胞轉錄組數據裡面,每個單細胞都是有一個geneLists,那麼就是成千上萬個這樣的calcAUC分析,非常耗費計算資源和時間,就需要考慮並行處理,我們這裡暫時不需要,所以直接 nCores=1 即可。
  • Python機器學習sklearn模塊——決策樹
    若將該結點對應的子樹替換成葉結點能帶來決策樹泛化性能提升,則將該子樹替換成葉結點;分類DecisionTreeClassifier能夠實現多類別的分類,一個是向量x,大小為[n_samples,n_features]([樣本量,屬性量]),用來記錄訓練樣本;一個是向量y,大小為[n_samples],值為interger類型,用來記錄訓練樣本的類標籤:from sklearn.datasets