一文徹底搞懂ROC曲線與AUC的概念

2021-10-07 05:25:45 字數 3711 閱讀 8880

2. roc曲線如何繪製

3. roc曲線和排序有什麼關聯?

4. auc和基尼係數有什麼糾葛?

要了解roc的含義,必須先搞懂混淆矩陣的含義,以及精確率、召回率的含義。

對於乙個分類任務的測試集,其本身有正負兩類標籤,我們對於這個測試集有乙個**標籤,也是正負值。對於這些樣本,我們的**是否正確?有可能正樣本我們**成了負樣本,負樣本我們**成了正樣本,如何用我們的**結果來評價我們的模型呢?那麼就要有如下定義了:tp:真正例,樣本為正,**為正、tn:真負例,樣本為負,**為負、fp:假正例,樣本為負,**為正、fn:假負例,樣本為正,**為負。混淆矩陣如下圖所示。

即精確率的含義是:命中的正樣本數比所有的**為正的樣本數

召回率的含義是:命中的正樣本數比所有樣本集中的正樣本數

精確率衡量查得多準,召回率衡量查得多全。

這裡尤其要注意,精確率和準確率是不一樣的,準確率應該用**正確的樣本數除以樣本總數:acc

urac

y=tp

+tnt

p+tn

+fp+

fnaccuracy=\frac

accura

cy=t

p+tn

+fp+

fntp

+tn​

有了精確率和召回率,可以以精確率為橫軸,以召回率為縱軸,繪製p-r曲線,這個曲線使用不方便,因此提出了更綜合的指標,如f1分數,f1分數計算方式就是取準確率和召回率的調和平均數。

我們在做分類任務的時候,通常輸出的是樣本為正類或負類的概率值,因此我們在利用精確率和召回率兩個指標時,這兩個指標是隨著我們設定的分類的閾值變化的,具有一定的主觀性,但是我們希望有更好的指標克服這個缺點,能夠客觀描述乙個模型的質量。這就是roc曲線

roc曲線以真正例率tpr為縱軸,以假正例率fpr為橫軸,在不同的閾值下獲得座標點,並連線各個座標點,得到roc曲線。

說了這麼多,同學要急了,你講這麼多我都知道,我就是一直不知道roc曲線怎麼畫出來的!你的基礎知識你自己留著用吧,告訴我怎麼畫這個鬼玩意就行啦!!面試的時候老是考,我總是沒有說清楚。

好了,廢話不多說,直接開搞,我們假設測試集有10個樣本,其中5個正樣本,5個負樣本,然後我們的模型對每乙個樣本都有乙個**為正類的概率值,將概率值從高到低進行排序,然後我們的樣本就被排列出來了,結合我們已有的正負類的標籤,我們可以寫出乙個序列:[1,1,0,1,1,0,0,1,0,0],這個序列是啥意思呢,順序是我們**的,01是樣本本身的,我們當然希望這個序列1多多在前面,0多多在後面,因為這樣就意味著我們的模型能把正樣本排在前面,負樣本排在後面,精確率和召回率不就自然而然就高了嗎?

好了,現在你知道最好的一種**結果是什麼了,沒錯就是[1,1,1,1,1,0,0,0,0,0]了,這種情況下,5個正樣本都被**出來,排在了前面,那麼這種情況下的roc曲線怎麼畫呢,這就到了最關鍵的時刻,首先,我們要確定閾值,啥閾值?就是把**結果歸類為正樣本的閾值,這個閾值是和樣本緊密聯絡的,比如我們的**值是[0.9,0.87,0.81,0.76,0.7,0.65,0.6,0.5,0.4,0.3],那當大於等於了0.9才認為是正樣本時,我們的**結果就是[1,0,0,0,0,0,0,0,0,0],而真實的標籤是[1,1,1,1,1,0,0,0,0,0],這個時候,**的tp值是1,因此真正例率是tpr

=15tpr=\frac

tpr=51

​由於**的假正樣本是0個,假正例率是fpr

=05fpr=\frac

fpr=50

​因此我們得到了第乙個點(0,0.2)。

繼續,當閾值設為0.87時,**的結果是[1,1,0,0,0,0,0,0,0,0],因此**的tp=2,真正例率是tpr

=25tpr=\frac

tpr=52

​由於**的假正樣本是0個,假正例率是fpr

=05fpr=\frac

fpr=50

​得到第二個點(0, 0.4)

依次減少閾值,可以分別算出各自的tp和fp,計算座標點依次為(0,0.6),(0,0.8),(0,1),

當我們的閾值為0.65時,**結果是[1,1,1,1,1,1,0,0,0,0],這時候tpr=1,fpr=1/5=0.2,座標點是(0.2,1),以此類推,後面的座標點是(0.4,1)(0.6,1)(0.8,1),(1,1).

連線所有的點,可以得到roc曲線如圖:

這是一條完美的曲線,只有在理想的狀態才會出現,現實是骨感的,我們下面再舉兩個更一般的例子:

當我們的**排序為[1,1,1,1,0,1,0,0,0,0]時,用同樣的方法,可以計算出各個點,然後繪製roc曲線如圖:

總而言之,左上角的面積我們希望越小越好!這樣的roc的曲線才受人待見~

我們剛才已經講到了一部分排序的知識,那麼為什麼有些大佬說:auc值其實是乙個概率,是模型將正樣本排在負樣本前面的概率。

下面我們從概率的角度來看看,roc曲線是為什麼能體現正樣本排負樣本前面的概率,我們知道auc的值就是roc曲線圍成的面積,我們希望越大越好。

當我們的排序結果是[1,1,1,1,1,0,0,0,0,0]時,顯然,正樣本全部在負樣本前面,因此,auc=1,正樣本排負樣本前面的概率為1,沒毛病老鐵。

當排序結果是[1,1,1,1,0,1,0,0,0,0],可以根據上文的roc曲線,算出auc是0.96,那我們直接從這個排序的結果,可不可以計算出相應的auc呢,我們從概率的角度來算一下,對於這5個正樣本,每個樣本可以賦予0.2的概率值,前4個樣本都排在負樣本之前,最後乙個正樣本,它有0.8的概率值排在負樣本之前,因此可以計算整體正樣本在負樣本之前的概率值:0.2*4+0.2*0.8=0.96,完美。

再舉個例子:

[1, 1, 1, 0, 1, 0, 1, 0, 0, 0]對應的roc曲線如下:

概率值計算:0.23+0.20.8+0.2*0.6=0.88,注意圖中的面積標錯了,計算可得應為0.12。

好的,現在你終於知道auc怎麼可以表達正樣本排在負樣本前面的概率了吧。

這裡的基尼係數的概念,如下圖,是gin

i=aa

+bgini=\frac

gini=a

+ba​

顯然,auc=a+c,因此,通過簡單的數學代換,可得gini=2*auc-1。

好了,到目前為止,總算說清楚了roc和auc這件事情!你懂了嗎?不懂就再看兩遍吧,你那麼聰明。所謂基礎不牢,地動山搖,諸位在學習中也要記住,知識點無小事,不可不求甚解,不可一知半解,阿彌陀佛~~

一文帶你徹底搞懂ThreadLocal

共享變數一直是併發中的老大難問題,每個執行緒都對它有操作權,所以執行緒之間的同步很關鍵,鎖也就應運而生。這裡換乙個思路,是否可以把共享變數私有化?即每個執行緒都擁有乙份共享變數的本地副本,每個執行緒對應乙個副本,同時對共享變數的操作也改為對屬於自己的副本的操作,這樣每個執行緒處理自己的本地變數,形成...

ROC曲線與AUC計算總結

橫軸 負正類率 false postive rate,fpr 特異度,劃分例項中所有負例佔所有負例的比例 1 specificity 縱軸 真正類率 true postive rate,tpr 靈敏度,sensitivity 正類覆蓋率 1 若乙個例項是正類並且被 為正類,即為真正類 true po...

Go學習 一文徹底搞懂go mod使用

jquery中文網為您提供一文徹底搞懂go mod使用等資源,歡迎您收藏本站,我們將為您提供最新的一文徹底搞懂go mod使用資源 目錄 一 如何使用go mod 二 golang開啟mod後import報紅解決 三 go mod 怎麼匯入本地其它專案的包?四 完整 此時專案可以放在任意位置,不必非...