深度學習:評價指標:準確率、精確率、回召率、 F-1 Score、ROC、AUC
參考:連結:https://www.jianshu.com/p/4dde15a56d44
1、從二分類評估指標說起
1.1 混淆矩陣
我們首先來看一下混淆矩陣,對於二分類問題,真實的樣本標籤有兩類,我們學習器預測的類別有兩類,那麼根據二者的類別組合可以劃分為四組,如下表所示:
上表即為混淆矩陣,其中,行表示預測的label值,列表示真實label值。TP,FP,FN,TN分別表示如下意思:
TP(true positive):表示樣本的真實類別為正,最後預測得到的結果也為正;
FP(false positive):表示樣本的真實類別為負,最後預測得到的結果卻為正;
FN(false negative)
TN(true negative):表示樣本的真實類別為負,最後預測得到的結果也為負.
可以看到,TP和TN是我們預測準確的樣本,而FP和FN為我們預測錯誤的樣本。
1.2 準確率Accruacy
準確率表示的是分類正確的樣本數佔樣本總數的比例,假設我們預測了10條樣本,有8條的預測正確,那麼準確率即為80%。
用混淆矩陣計算的話,準確率可以表示為:
雖然準確率可以在一定程度上評價我們的分類器的效能,不過對於二分類問題或者說CTR預估問題,樣本是極其不平衡的。對於大資料集來說,標籤為1的正樣本資料往往不足10%,那麼如果分類器將所有樣本判別為負樣本,那麼仍然可以達到90%以上的分類準確率,但這個分類器的效能顯然是非常差的。
1.3 精確率Precision和召回率Recall
為了衡量分類器對正樣本的預測能力,我們引入了精確率Precision和召回率Recall。
精確率表示預測結果中,預測為正樣本的樣本中,正確預測為正樣本的概率;
召回率表示在原始樣本的正樣本中,最後被正確預測為正樣本的概率;
二者用混淆矩陣計算如下:
精確率和召回率往往是一對矛盾的指標。在CTR預估問題中,預測結果往往表示會被點選的概率。如果我們對所有的預測結果進行降序排序,排在前面的是學習器認為最可能被點選的樣本,排在後面的是學習期認為最不可能被點選的樣本。
如果我們設定一個閾值,在這個閾值之上的學習器認為是正樣本,閾值之下的學習器認為是負樣本。可以想象到的是,當閾值很高時,預測為正樣本的是分類器最有把握的一批樣本,此時精確率往往很高,但是召回率一般較低。相反,當閾值很低時,分類器把很多拿不準的樣本都預測為了正樣本,此時召回率很高,但是精確率卻往往偏低。
1.4 F-1 Score
為了折中精確率和召回率的結果,我們又引入了F-1 Score,計算公式如下:
對於F1 Score有很多的變化形式,感興趣的話大家可以參考一下週志華老師的西瓜書,我們這裡就不再介紹了。
1.5 ROC與AUC (只能用於二分類)
在許多分類學習器中,產生的是一個概率預測值,然後將這個概率預測值與一個提前設定好的分類閾值進行比較,大於該閾值則認為是正例,小於該閾值則認為是負例。(例如:0.7》0.5)為正)如果對所有的排序結果按照概率值進行降序排序,那麼閾值可以將結果截斷為兩部分,前面的認為是正例,後面的認為是負例。
我們可以根據實際任務的需要選取不同的閾值。如果重視精確率,我們可以設定一個很高的閾值,如果更重視召回率,可以設定一個很低的閾值。
到這裡,我們會丟擲兩個問題:
1)設定閾值然後再來計算精確率,召回率和F1-Score太麻煩了,這個閾值到底該設定為多少呢?有沒有可以不設定閾值來直接評價我們的模型效能的方法呢?
2)排序結果很重要呀,不管預測值是多少,只要正例的預測概率都大於負例的就好了呀。
沒錯,ROC和AUC便可以解決我們上面丟擲的兩個問題。
ROC全稱是“受試者工作特徵”,(receiver operating characteristic)。我們根據學習器的預測結果進行排序,然後按此順序逐個把樣本作為正例進行預測,每次計算出兩個重要的值,分別以這兩個值作為橫縱座標作圖,就得到了ROC曲線。
這兩個指標是什麼呢?是精確率和召回率麼?並不是的,哈哈。
ROC曲線的橫軸為“假正例率”(True Positive Rate,TPR),又稱為“假陽率”;縱軸為“真正例率”(False Positive Rate,FPR),又稱為“真陽率”,
假陽率,簡單通俗來理解就是預測為正樣本但是預測錯了的可能性,顯然,我們不希望該指標太高。
真陽率,則是代表預測為正樣本但是預測對了的可能性,當然,我們希望真陽率越高越好。
ROC計算過程如下:
1)首先每個樣本都需要有一個label值,並且還需要一個預測的score值(取值0到1);
2)然後按這個score對樣本由大到小進行排序,假設這些資料位於表格中的一列,從上到下依次降序;
3)現在從上到下按照樣本點的取值進行劃分,位於分界點上面的我們把它歸為預測為正樣本,位於分界點下面的歸為負樣本;
4)分別計算出此時的TPR和FPR,然後在圖中繪製(FPR, TPR)點。
說這麼多,不如直接看圖來的簡單:
AUC(area under the curve)就是ROC曲線下方的面積,如下圖所示,陰影部分面積即為AUC的值:
AUC量化了ROC曲線表達的分類能力。這種分類能力是與概率、閾值緊密相關的,分類能力越好(AUC越大),那麼輸出概率越合理,排序的結果越合理。
在CTR預估中,我們不僅希望分類器給出是否點選的分類資訊,更需要分類器給出準確的概率值,作為排序的依據。所以,這裡的AUC就直觀地反映了CTR的準確性(也就是CTR的排序能力)。
終於介紹完了,那麼這個值該怎麼計算呢?
2、AUC的計算
關於AUC的計算方法,如果僅僅根據上面的描述,我們可能只能想到一種方法,那就是積分法,我們先來介紹這種方法,然後再來介紹其他的方法。
2.1 積分思維
這裡的積分法其實就是我們之前介紹的繪製ROC曲線的過程,用程式碼簡單描述下:
auc = 0.0
height = 0.0
for each training example x_i, y_i:
if y_i = 1.0:
height = height + 1/(tp+fn)
else
auc += height * 1/(tn+fp)
return auc
在上面的計算過程中,我們計算面積過程中隱含著一個假定,即所有樣本的預測概率值不想等,因此我們的面積可以由一個個小小的矩形拼起來。但如果有兩個或多個的預測值相同,我們調整一下閾值,得到的不是往上或者往右的延展,而是斜著向上形成一個梯形,此時計算梯形的面積就比較麻煩,因此這種方法其實並不是很常用。
2.2 Wilcoxon-Mann-Witney Test
關於AUC還有一個很有趣的性質,它和Wilcoxon-Mann-Witney是等價的,而Wilcoxon-Mann-Witney Test就是測試任意給一個正類樣本和一個負類樣本,正類樣本的score有多大的概率大於負類樣本的score。
根據這個定義我們可以來探討一下二者為什麼是等價的?首先我們偷換一下概念,其實意思還是一樣的,任意給定一個負樣本,所有正樣本的score中有多大比例是大於該負類樣本的score? 由於每個負類樣本的選中概率相同,那麼Wilcoxon-Mann-Witney Test其實就是上面n2(負樣本的個數)個比例的平均值。
那麼對每個負樣本來說,有多少的正樣本的score比它的score大呢?是不是就是當結果按照score排序,閾值恰好為該負樣本score時的真正例率TPR?沒錯,相信你的眼睛,是這樣的!理解到這一層,二者等價的關係也就豁然開朗了。ROC曲線下的面積或者說AUC的值 與 測試任意給一個正類樣本和一個負類樣本,正類樣本的score有多大的概率大於負類樣本的score
哈哈,那麼我們只要計算出這個概率值就好了呀。我們知道,在有限樣本中我們常用的得到概率的辦法就是通過頻率來估計之。這種估計隨著樣本規模的擴大而逐漸逼近真實值。樣本數越多,計算的AUC越準確類似,也和計算積分的時候,小區間劃分的越細,計算的越準確是同樣的道理。具體來說就是: 統計一下所有的 M×N(M為正類樣本的數目,N為負類樣本的數目)個正負樣本對中,有多少個組中的正樣本的score大於負樣本的score。當二元組中正負樣本的 score相等的時候,按照0.5計算。然後除以MN。公式表示如下:
實現這個方法的複雜度為O(n^2 )。n為樣本數(即n=M+N)
2.3 Wilcoxon-Mann-Witney Test的化簡
該方法和上述第二種方法原理一樣,但複雜度降低了。首先對score從大到小排序,然後令最大score對應的sample的rank值為n,第二大score對應sample的rank值為n-1,以此類推從n到1。然後把所有的正類樣本的rank相加,再減去正類樣本的score為最小的那M個值的情況。得到的結果就是有多少對正類樣本的score值大於負類樣本的score值,最後再除以M×N即可。值得注意的是,當存在score相等的時候,對於score相等的樣本,需要賦予相同的rank值(無論這個相等的score是出現在同類樣本還是不同類的樣本之間,都需要這樣處理)。具體操作就是再把所有這些score相等的樣本 的rank取平均。然後再使用上述公式。此公式描述如下:
有了這個公式,我們計算AUC就非常簡單了,下一節我們會給出一個簡單的Demo
3、AUC計算程式碼示例
這一節,我們給出一個AUC計算的小Demo,供大家參考:
import numpy as np
label_all = np.random.randint(0,2,[10,1]).tolist()
pred_all = np.random.random((10,1)).tolist()
print(label_all)
print(pred_all)
posNum = len(list(filter(lambda s: s[0] == 1, label_all)))
if (posNum > 0):
negNum = len(label_all) - posNum
sortedq = sorted(enumerate(pred_all), key=lambda x: x[1])
posRankSum = 0
for j in range(len(pred_all)):
if (label_all[j][0] == 1):
posRankSum += list(map(lambda x: x[0], sortedq)).index(j) + 1
auc = (posRankSum - posNum * (posNum + 1) / 2) / (posNum * negNum)
print("auc:", auc)
輸出為:
[[1], [1], [1], [1], [0], [0], [1], [0], [1], [0]]
[[0.3338126725065774], [0.916003907444231], [0.21214487870979226], [0.7598235037160891], [0.07060830328081447], [0.7650759555141832], [0.16157972737309945], [0.6526480840746645], [0.9327233203035652], [0.6581121768195201]]
auc: 0.5833333333333334
相關推薦
深度學習:評價指標:準確率、精確率、回召率、 F-1 Score、ROC、AUC
參考:連結:https://www.jianshu.com/p/4dde15a56d44 1、從二分類評估指標說起 1.1 混淆矩陣 我們首先來看一下混淆矩陣,對於二分類問題,真實的樣本標籤有兩類,我們學習器預測的類別有兩類,那麼根據二者的類別組合可以劃分為四組,如下表
機器學習常見評價指標:AUC、Precision、Recall、F-measure、Accuracy
1、AUC的計算 AUC是一個模型評價指標,用於二分類模型的評價。AUC是“Area under Curve(曲線下的面積)”的英文縮寫,而這條“Curve(曲線)”就是ROC曲線。 為什麼要用AUC作為二分類模型的評價指標呢?為什麼不直接通過計算準確率來對模型進
深度學習訓練評價指標
深度學習分類任務評價指標 PR曲線即查準率(Precision)與查全率(Recall) https://blog.csdn.net/zong596568821xp/article/details/80797695 深度學習常用評價指標(分類清晰) https://
深度學習常用評價指標
評價指標: 準確率 (Accuracy),混淆矩陣 (Confusion Matrix),精確率(Precision),召回率(Recall),平均正確率(AP),mean Average Precision(mAP),交除並(IoU),ROC + AUC,非極大值抑制
迴歸評價指標:MSE、RMSE、MAE、R2、Adjusted R2
我們通常採用MSE、RMSE、MAE、R2來評價迴歸預測演算法。 1、均方誤差:MSE(Mean Squared Error) 其中,為測試集上真實值-預測值。 2、均方根誤差:RMSE(Root Mean Squard Error) 可以看出,RMSE=sqrt(M
機器學習算法中的評價指標(準確率、召回率、F值、ROC、AUC等)
html eight inf 曲線 mba cor 方法 指標 pan 參考鏈接:https://www.cnblogs.com/Zhi-Z/p/8728168.html 具體更詳細的可以查閱周誌華的西瓜書第二章,寫的非常詳細~ 一、機器學習性能評估指標 1.準確率(A
機器學習演算法中的評價指標(準確率、召回率、F值、ROC、AUC等)
參考連結:https://www.cnblogs.com/Zhi-Z/p/8728168.html 具體更詳細的可以查閱周志華的西瓜書第二章,寫的非常詳細~ 一、機器學習效能評估指標 1.準確率(Accurary) 準確率是我們最常見的評價指標,而且很容易理解,就是被分對的樣本
23個深度學習庫大排名:TensorFlow、Keras名列一二,Sonnet增長最快
本文對 23 個深度學習庫進行了排名,衡量的標準有三個:GitHub、Stack Overflow 以及谷歌搜尋結果。TensorFlow 憑藉最大、最活躍的社群主導了該領域,排名第一;Keras 是最為流行的深度學習前端,排名第二;Theano 依然實力強大,即使沒有大公司的支援,排名第四;Sonnet
23個深度學習庫大排名:TensorFlow最活躍、Keras最受歡迎,Theano 屌絲逆襲
開源最前線(ID:OpenSourceTop) 猿妹 編譯 來源:https://github.com/thedataincubator/data-science-blogs/blob/master/deep-learning-libraries.md The Data Incubator 最近
語義分割中的深度學習方法全解:從FCN、SegNet到各代DeepLab
語義分割是什麼?語義分割方法在處理影象時,具體到畫素級別,也就是說,該方法會將影象中每個畫素分配到某個物件類別。下面是一個具體案例。△ 左邊為輸入影象,右邊為經過語義分割後的輸出影象。該模型不僅要識別出摩托車和駕駛者,還要標出每個物件的邊界。因此,與分類目的不同,相關模型要具
深度學習歸一化:BN、GN與FRN
在深度學習中,使用歸一化層成為了很多網路的標配。最近,研究了不同的歸一化層,如BN,GN和FRN。接下來,介紹一下這三種歸一化演算法。 BN層 BN層是由谷歌提出的,其相關論文為《Batch Normalization: Accelerating Deep Network Training by Reduc
深度學習框架哪家強:TensorFlow?Caffe?MXNet?Keras?PyTorch?
能夠 平臺 false 對稱 寫到 python form 演示 有一個 深度學習框架哪家強:TensorFlow?Caffe?MXNet?Keras?PyTorch?對於這幾大框架在運行各項深度任務時的性能差異如何,各位讀者不免會有所好奇。 微軟數據科學家Ili
Tensorflow深度學習之十二:基礎圖像處理之二
fcm 數字 ssi port con tty .net term file Tensorflow深度學習之十二:基礎圖像處理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出
大咖 | 《深度學習革命》作者:人們對AI概念的理解存在偏差
人工智慧發展到了今天,關於深度學習以及神經網路等學術名詞人人都能說上兩句。 但是,你真的理解這些概念麼? 其實,人們對這些詞語的很多理解都存在偏差。 對基本概念的誤解必然導致對人工智慧的錯誤解讀。因此“殺手AI
《深度學習革命》作者:GAN令我驚豔,現在的人們對AI操之過急了
近日,學習演算法先驅人物、《深度學習革命》一書作者Terrence Sejnowski在接受The Verge訪談時簡要介紹了AI的起源和發展,同時表示,關於“殺人AI”和“機器人代替人類”等概念更多是過度炒作的結果,因為人們對AI新技術的期待有些過於著急了。令他印象最深刻的
實戰深度學習(上):OpenCV庫
在如今人工智慧的浪潮下,無數模擬機器學習和深度學習的開發者工具倍出,其中在計算機圖形學和計算機視覺裡面最流行的一個庫就是OpenCV庫了.計算機圖形學和計算機視覺學在我們的自動駕駛和仿生機器人當中有著舉足輕重的地位,尤其是opencv庫在裡面的應用尤為廣泛。今天我就分享給大家
深度學習目標檢測系列:faster RCNN實現|附python原始碼
目標檢測一直是計算機視覺中比較熱門的研究領域,有一些常用且成熟的演算法得到業內公認水平,比如RCNN系列演算法、SSD以及YOLO等。如果你是從事這一行業的話,你會使用哪種演算法進行目標檢測任務呢?在我尋求在最短的時間內構建最精確的模型時,我嘗試了其中的R-CNN系列演算法,如果讀者們對這方面的
深度學習經典網路回顧:AlexNet+VGG
一.AlexNet: 雖然深度學習元年是2006年,但是真正使深度學習火起來的是2012年的ImageNet上的AlexNet,由於本人本科畢設有用到該網路模型,雖然後面更優秀的網路模型層出不窮本人再沒有使用過該網路,但是該網路的設計對後序網路的設計還是又不可磨滅的影響。首
深度學習目標檢測系列:一文弄懂YOLO演算法|附Python原始碼
在之前的文章中,介紹了計算機視覺領域中目標檢測的相關方法——RCNN系列演算法原理,以及Faster RCNN的實現。這些演算法面臨的一個問題,不是端到端的模型,幾個構件拼湊在一起組成整個檢測系統,操作起來比較複雜,本文將介紹另外一個端到端的方法——YOLO演算法,該方法操作簡便且模擬速度快,效
Tensorflow深度學習之三十三:tf.scatter_update
一、tf.scatter_update tf.scatter_update( ref, indices, updates, use_locking=True, name=None ) Applies sparse