演算法衡量auc 一文看懂ROC AUC

2021-10-14 13:14:58 字數 4230 閱讀 9405

評測指標是衡量乙個演算法是否出色的乙個重要部分,好的指標能讓我們這些煉丹學徒知道,練出來的丹藥是否有效果。那麼在機器學習中有哪些值得一**竟的指標呢?本文就pr圖,roc、auc、map這4個方面進行詳細**。

總的來說評價指標的核心得從二分類問題說起:乙個類,它實際值有0、1兩種取值,即負例、正例;而二分類演算法**出來的結果,也只有0、1兩種取值,即負例、正例。我們不考慮二分類演算法細節,當作黑箱子就好;我們關心的是,**的結果和實際情況匹配、偏差的情況。

從tp、fp、tn、fn講起。那麼說起這些指標,則又要需要說混淆矩陣了。

混淆矩陣是機器學習中總結分類模型**結果的情形分析表,以矩陣形式將資料集中的記錄按照真實的類別與分類模型作出的分類判斷兩個標準進行彙總。這個名字**於它可以非常容易的表明多個類別是否有混淆(正類**成負類)。

混淆矩陣

這裡,我們認為 1 為正類, 0為負類,那麼我們可以得出這樣的指標:

正類負類的差別

p (positive) 和 n(negative) 代表模型的判斷結果

t (true) 和 f(false) 評價模型的判斷結果是否正確

fp: 假正例,模型的判斷是正例 (p) ,實際上這是錯誤的(f),連起來就是假正例

fn:假負例,模型的判斷是負例(n),實際上這是錯誤的(f),連起來就是假正例

tp:真正例, 模型的判斷是正例(p),實際上它也是正例,**正確(t),連起來就是真正例

tn:真負例,模型的判斷是負例(n),實際上它也是負例,**正確(t),就是真正例

混淆矩陣的用處

細緻得說下具體說下從混淆矩陣中能活得那些有用的指標:

accuracy:準確率

準確率=**正確的樣本數/所有樣本數,即**正確的樣本比例(包括**正確的正樣本和**正確的負樣本)。

precision:查準率

用於衡量模型對某一類的**有多準。

recall:召回率(真正類率)

指的是某個類別的recall。recall表示某一類樣本,**正確的與所有ground truth的比例。

混淆矩陣算precision 和 recall

fpr:負正類率

代表分類器**的正類中實際負例項佔所有負例項的比例。fpr = 1 - tnr

tnr:真負類率

代表分類器**的負類中負例項佔所有負例項的比例,tnr=1-fpr

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

橫軸:假正類率 (false postive rate,fpr),特異度,劃分例項中所有負例佔所有負例的比例;tnr=1-fpr。

縱軸:真正類率 ==recall(true postive rate,tpr),靈敏度,sensitivity(正類覆蓋率)

假設已經得出一系列樣本被劃分為正類的概率,然後按照從大到小排序,

我們從高到低,依次將「score」值作為閾值threshold,當測試樣本屬於正樣本的概率大於這個threshold時,我們認為它為正樣本,否則為負樣本。從第乙個樣本開始,設該樣本的score值為閾值,則該樣本及之後的樣本(均比該樣本概率值小)判為負樣本,即所有樣本判為全負,計算得tpr=fpr=0,即roc曲線(0,0)點;再選擇第二個樣本點的score作為閾值,大於等於該閾值的樣本(在該樣本之前)判為正樣本,小於該閾值的判為負樣本,那麼此時tp = 1, tp+fn = all gt,計算tpr = recall 。負正類率()

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

可以這麼理解

初始態的值、中間態的值、以及終點態的值

可以畫出的roc影象

計算auc

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

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

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

測試任意給乙個正類樣本和乙個負類樣本,正類樣本的score有多大的概率大於負類樣本的score。具體來說就是統計一下所有的 m×n(m為正類樣本的數目,n為負類樣本的數目)個正負樣本對中,有多少個組中的正樣本的score大於負樣本的score。當二元組中正負樣本的 score相等的時候,按照0.5計算。然後除以mn。實現這個方法的複雜度為o(n^2)。n為樣本數(即n=m+n)

公式法:它也是首先對score從大到小排序,然後令最大score對應的sample 的rank為n,第二大score對應sample的rank為n-1,以此類推。然後把所有的正類樣本的rank相加,再減去m-1種兩個正樣本組合的情況。得到的就是所有的樣本中有多少對正類樣本的score大於負類樣本的score。然後再除以m×n。即

、為了求的組合中正樣本的score值大於負樣本,如果所有的正樣本score值都是大於負樣本的,那麼第一位與任意的進行組合score值都要大,我們取它的rank值為n,但是n-1中有m-1是正樣例和正樣例的組合這種是不在統計範圍內的(為計算方便我們取n組,相應的不符合的有m個),所以要減掉,那麼同理排在第二位的n-1,會有m-1個是不滿足的,依次類推,故得到後面的公式m*(m+1)/2,我們可以驗證在正樣本score都大於負樣本的假設下,auc的值為1。

2、根據上面的解釋,不難得出,rank的值代表的是能夠產生score前大後小的這樣的組合數,但是這裡包含了(正,正)的情況,所以要減去這樣的組(即排在它後面正例的個數),即可得到上面的公式

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

**:採用第一種方法計算:

#include#include#includeusing namespace std;

bool cmp(pairx, pairy)

double auc(vector> &a)

double auc = 0;

int tp = 0, fp = 0, tpnext = 0, fpnext = 0;

for (int i = 0; i < len; i++)

return auc;

}int main()

cout << auc(a);

return 0;

}

參考

一文看懂kylin

kylin到底解決了什麼關鍵問題 要徹底的解決掉資料查詢時間隨著資料量的增長而成線性增長的規律 kylin適合哪類資料的處理 通常查詢資料,一般是統計結果,如果是統計結果,必然會按照維度來進行聚合,kylin的工作原理是多維立方體分析,適合需要從多個維度來觀察資料的查詢。維度,看資料的角度,比如地區...

一文看懂xml

先簡單介紹下html xml xpath 1.html 超文字語言,用來展示資料。2.xml 可擴充套件標記語言,用來傳輸資料。僅僅是純文字,標籤可自定義。3.xpath 專門在xml中查詢資訊的語言。xml 文件必須包含根元素。該元素是所有其他元素的父元素。xml 文件中的元素形成了一棵文件樹。這...

一文看懂條件編譯

條件編譯概述 就是在滿足一定的條件時才對源 進行編譯。條件編譯一般有3種形式 形式一 a ifdef 識別符號 識別符號定義時,執行程式段1,否則執行程式段2 程式段1 else 程式段2 endif b ifdef 識別符號 程式段1 endif 例如 define k 1 ifdef k pri...