分类器模型评价指标
Spark mllib 自帶了許多機器學習算法,它能夠用來進行模型的訓練和預測。當使用這些算法來構建模型的時候,我們需要一些指標來評估這些模型的性能,這取決于應用和和其要求的性能。Spark mllib 也提供一套指標用來評估這些機器學習模型。
具體的機器學習算法歸入更廣泛類型的機器學習應用,例如:分類,回歸,聚類等等,每一種類型都很好的建立了性能評估指標。本節主要分享分類器模型評價指標。
ROC曲線
????? ROC曲線指受試者工作特征曲線 / 接收器操作特性曲線(receiver operating characteristic curve), 是反映敏感性和特異性連續變量的綜合指標,是用構圖法揭示敏感性和特異性的相互關系,它通過將連續變量設定出多個不同的臨界值,從而計算出一系列敏感性和特異性,再以敏感性為縱坐標、(1-特異性)為橫坐標繪制成曲線,曲線下面積越大,診斷準確性越高。在ROC曲線上,最靠近坐標圖左上方的點為敏感性和特異性均較高的臨界值。
ROC(Receiver Operating Characteristic)曲線和AUC常被用來評價一個二值分類器(binary classifier)的優劣?。ROC曲線怎么來的呢,我們來看經典的混淆矩陣:
針對一個二分類問題,將實例分成正類(postive)或者負類(negative)。但是實際中分類時,會出現四種情況:
(1)真正類(True?Positive?,?TP):被模型預測為正類的正樣本
(2)假正類(False?Positive?,?FP):被模型預測為正類的負樣本
(3)假負類(False?Negative?,?FN):被模型預測為負類的正樣本
(4)真負類(True?Negative?,?TN):被模型預測為負類的負樣本
列聯表如下,1代表正類,0代表負類:
由上表可得出橫,縱軸的計算公式:
(1)真正類率(True?Positive?Rate?,?TPR)【靈敏度(sensitivity)】:TPR?=?TP?/(TP?+?FN)?,即正樣本預測結果數/正樣本實際數
(2)假負類率(False?Negative?Rate?,?FNR)?:FNR?=?FN?/(TP?+?FN)?,即被預測為負的正樣本結果數/正樣本實際數
(3)假正類率(False?Positive?Rate?,?FPR)?:FPR?=?FP?/(FP?+?TN)?,即被預測為正的負樣本結果數/負樣本實際數
(4)真負類率(True?Negative?Rate?,?TNR)【特指度(specificity)】:TNR?=?TN?/(TN?+?FP)?,即負樣本預測結果數/負樣本實際數
假設采用邏輯回歸分類器,其給出針對每個實例為正類的概率,那么通過設定一個閾值如0.6,概率大于等于0.6的為正類,小于0.6的為負類。對應的就可以算出一組(FPR,TPR),在平面中得到對應坐標點。隨著閾值的逐漸減小,越來越多的實例被劃分為正類,但是這些正類中同樣也摻雜著真正的負實例,即TPR和FPR會同時增大。閾值最大時,對應坐標點為(0,0),閾值最小時,對應坐標點(1,1)。
如下面這幅圖,(a)圖中實線為ROC曲線,線上每個點對應一個閾值。
橫軸FPR:1-TNR,1-Specificity,FPR越大,預測正類中實際負類越多。
縱軸TPR:Sensitivity(正類覆蓋率),TPR越大,預測正類中實際正類越多。
理想目標:TPR=1,FPR=0,即圖中(0,1)點,故ROC曲線越靠攏(0,1)點,越偏離45度對角線越好,Sensitivity、Specificity越大效果越好。
需要提前說明的是,我們這里只討論二值分類器。對于分類器,或者說分類算法,評價指標主要有accuracy,precision,recall,F-score,以及我們今天要討論的ROC和AUC。下圖是一個ROC曲線的示例。
正如我們在這個ROC曲線的示例圖中看到的那樣,ROC曲線的橫坐標為false positive rate(FPR),縱坐標為true positive rate(TPR)。下圖中詳細說明了FPR和TPR是如何定義的。
接下來我們考慮ROC曲線圖中的四個點和一條線。第一個點,(0,1),即FPR=0, TPR=1,這意味著FN(false negative)=0,并且FP(false positive)=0。Wow,這是一個完美的分類器,它將所有的樣本都正確分類。第二個點,(1,0),即FPR=1,TPR=0,類似地分析可以發現這是一個最糟糕的分類器,因為它成功避開了所有的正確答案。第三個點,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以發現該分類器預測所有的樣本都為負樣本(negative)。類似的,第四個點(1,1),分類器實際上預測所有的樣本都為正樣本。經過以上的分析,我們可以斷言,ROC曲線越接近左上角,該分類器的性能越好。
下面考慮ROC曲線圖中的虛線y=x上的點。這條對角線上的點其實表示的是一個采用隨機猜測策略的分類器的結果,例如(0.5,0.5),表示該分類器隨機對于一半的樣本猜測其為正樣本,另外一半的樣本為負樣本。
如何畫ROC曲線
對于一個特定的分類器和測試數據集,顯然只能得到一個分類結果,即一組FPR和TPR結果,而要得到一個曲線,我們實際上需要一系列FPR和TPR的值,這又是如何得到的呢?我們先來看一下Wikipedia上對ROC曲線的定義:
In signal detection theory, a receiver operating characteristic (ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied.
問題在于“as its discrimination threashold is varied”。如何理解這里的“discrimination threashold”呢?我們忽略了分類器的一個重要功能“概率輸出”,即表示分類器認為某個樣本具有多大的概率屬于正樣本(或負樣本)。通過更深入地了解各個分類器的內部機理,我們總能想辦法得到一種概率輸出。通常來說,是將一個實數范圍通過某個變換映射到(0,1)區間。
假如我們已經得到了所有樣本的概率輸出(屬于正樣本的概率),現在的問題是如何改變“discrimination threashold”?我們根據每個測試樣本屬于正樣本的概率值從大到小排序。下圖是一個示例,圖中共有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曲線的結果如下圖:
當我們將threshold設置為1和0時,分別可以得到ROC曲線上的(0,0)和(1,1)兩個點。將這些(FPR,TPR)對連接起來,就得到了ROC曲線。當threshold取值越多,ROC曲線越平滑。
其實,我們并不一定要得到每個測試樣本是正樣本的概率值,只要得到這個分類器對該測試樣本的“評分值”即可(評分值并不一定在(0,1)區間)。評分越高,表示分類器越肯定地認為這個測試樣本是正樣本,而且同時使用各個評分值作為threshold。我認為將評分值轉化為概率更易于理解一些。
AUC指標
AUC(Area Under Curve)被定義為ROC曲線下的面積,顯然這個面積的數值不會大于1。又由于ROC曲線一般都處于y=x這條直線的上方,所以AUC的取值范圍在0.5和1之間。使用AUC值作為評價標準是因為很多時候ROC曲線并不能清晰的說明哪個分類器的效果更好,而AUC作為數值可以直觀的評價分類器的好壞,值越大越好。
在了解了ROC曲線的構造過程后,編寫代碼實現并不是一件困難的事情。相比自己編寫代碼,有時候閱讀其他人的代碼收獲更多,當然過程也更痛苦些。在此推薦scikit-learn中關于計算AUC的代碼。
AUC含義是什么
那么AUC值的含義是什么呢?根據(Fawcett, 2006),AUC的值的含義是: > The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.
這句話有些繞,我嘗試解釋一下:首先AUC值是一個概率值,當你隨機挑選一個正樣本以及一個負樣本,當前的分類算法根據計算得到的Score值將這個正樣本排在負樣本前面的概率就是AUC值。當然,AUC值越大,當前的分類算法越有可能將正樣本排在負樣本前面,即能夠更好的分類。
AUC值為ROC曲線所覆蓋的區域面積,顯然,AUC越大,分類器分類效果越好。
AUC = 1,是完美分類器,采用這個預測模型時,不管設定什么閾值都能得出完美預測。絕大多數預測的場合,不存在完美分類器。
0.5 < AUC < 1,優于隨機猜測。這個分類器(模型)妥善設定閾值的話,能有預測價值。
AUC = 0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預測價值。
AUC < 0.5,比隨機猜測還差;但只要總是反預測而行,就優于隨機猜測。
以下示例三種AUC值(曲線下面積):
AUC的物理意義
假設分類器的輸出是樣本屬于正類的socre(置信度),則AUC的物理意義為,任取一對(正、負)樣本,正樣本的score大于負樣本的score的概率。
AUC的計算方法
? 第一種方法:計算出ROC曲線下面的面積,就是AUC的值。由于我們的測試樣本是有限的。我們得到的AUC曲線必然是一個階梯狀的。因此,計算的AUC也就是這些階梯下面的面積之和。計算的精度與閾值的精度有關。
????? 第二種方法:一個關于AUC的很有趣的性質是,它和Wilcoxon-Mann-Witney Test(秩和檢驗)是等價的。而Wilcoxon-Mann-Witney Test就是測試任意給一個正類樣本和一個負類樣本,正類樣本的score有多大的概率大于負類樣本的score。有了這個定義,我們就得到了另外一中計算AUC的辦法:得到這個概率。具體來說就是統計一下所有的 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。即
公式解釋:
? ? ? 1、為了求的組合中正樣本的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取平均。然后再使用上述公式。
為什么使用ROC曲線
既然已經這么多評價標準,為什么還要使用ROC和AUC呢?因為ROC曲線有個很好的特性:當測試集中的正負樣本的分布變化的時候,ROC曲線能夠保持不變。在實際的數據集中經常會出現類不平衡(class imbalance)現象,即負樣本比正樣本多很多(或者相反),而且測試數據中的正負樣本的分布也可能隨著時間變化。下圖是ROC曲線和Precision-Recall曲線5的對比:
在上圖中,(a)和(c)為ROC曲線,(b)和(d)為Precision-Recall曲線。(a)和(b)展示的是分類其在原始測試集(正負樣本分布平衡)的結果,(c)和(d)是將測試集中負樣本的數量增加到原來的10倍后,分類器的結果。可以明顯的看出,ROC曲線基本保持原貌,而Precision-Recall曲線則變化較大。
其他評估指標
| true positive (TP) eqv. with hit true negative (TN) eqv. with correct rejection false positive (FP) eqv. with?false alarm,?Type I error false negative (FN) eqv. with miss,?Type II error sensitivity?or?true positive rate (TPR) eqv. with?hit rate,?recall specificity?(SPC) or?true negative rate (TNR) precision?or?positive predictive value?(PPV) negative predictive value?(NPV) fall-out?or?false positive rate (FPR) false discovery rate?(FDR) miss rate or?false negative rate?(FNR) accuracy?(ACC) F1 score is the?harmonic mean?of?precision?and?sensitivity Matthews correlation coefficient?(MCC) Informedness = Sensitivity + Specificity - 1 |
在機器學習,模式識別中,我們做分類的時候,會用到一些指標來評判算法的優劣,最常用的就是識別率,簡單來說,就是?
?
這里的?表示預測對的樣本數,表示測試集總的樣本數。
識別率有的時候過于簡單, 不能全面反應算法的性能,除了識別率,還有一些常用的指標,就是我們要介紹的?
F1-score, recall, precision.
在介紹這些概念之前,我們先來看一個二分類的問題,給定一組訓練集:?
這里假定?對應正樣本,?對應負樣本。假設我們建立了一個分類模型?, 對每一個輸入的樣本?會輸出一個預測值?, 那么將預測值?與樣本對應的實際值做比較,會得到以下四種情況:
| ? |
| ? |
| ? |
第一種情況,預測為正,實際也為正,我們稱為 true positive (TP),第二種情況,預測為正,實際為負,我們稱為 false positive (FP),第三種情況,預測為負,實際為正,稱為false negative (FN),最后一種情況,預測為負,實際也為負,稱為 true negative (TN),每一個樣本只可能屬于這四種情況中的某一種,不會有其它的可能。
很顯然,給定一個測試集,我們可以得到如下的關系:?
如果我們定義一個測試集中,正樣本個數為, 負樣本個數為, 那么我們可以知道:,
所以,我們常用的識別率?其實就等于?
,?
進一步,我們可以定義 recall ,precision, F1-score 如下所示:?
?
可以看到,recall 體現了分類模型對正樣本的識別能力,recall 越高,說明模型對正樣本的識別能力越強,precision 體現了模型對負樣本的區分能力,precision越高,說明模型對負樣本的區分能力越強。F1-score 是兩者的綜合。F1-score 越高,說明分類模型越穩健。
比如我們常見的雷達預警系統,我們需要對雷達信號進行分析,判斷這個信號是飛行器(正樣本)還是噪聲 (負樣本), 很顯然,我們希望系統既能準確的捕捉到飛行器信號,也可以有效地區分噪聲信號。所以就要同時權衡recall 和 precision這兩個指標,如果我們把所有信號都判斷為飛行器,那 recall 可以達到1,但是precision將會變得很低(假設兩種信號的樣本數接近),可能就在 0.5 左右,那F1-score 也不會很高。
有的時候,我們對recall 與 precision 賦予不同的權重,表示對分類模型的偏好:
?
可以看到,當?,那么就退回到了,?其實反映了模型分類能力的偏好,?的時候,precision的權重更大,為了提高,我們希望precision 越小,而recall 應該越大,說明模型更偏好于提升recall,意味著模型更看重對正樣本的識別能力; 而?的時候,recall 的權重更大,因此,我們希望recall越小,而precision越大,模型更偏好于提升precision,意味著模型更看重對負樣本的區分能力。
舉例:以下程序片段說明了spark lr加載數據集,訓練二元分類模型,使用不同的評估指標進行評估。
?importorg.apache.spark.mllib.classification.LogisticRegressionWithLBFGS
importorg.apache.spark.mllib.evaluation.BinaryClassificationMetrics
importorg.apache.spark.mllib.regression.LabeledPoint
importorg.apache.spark.mllib.util.MLUtils
// Load training data in LIBSVM format
val data=MLUtils.loadLibSVMFile(sc,"data/mllib/sample_binary_classification_data.txt")
// Split data into training (60%) and test (40%)
val Array(training, test)= data.randomSplit(Array(0.6,0.4), seed =11L)
training.cache()
// Run training algorithm to build the model
val model=newLogisticRegressionWithLBFGS()
.setNumClasses(2)
.run(training)
// Clear the prediction threshold so the model will return probabilities
model.clearThreshold
// Compute raw scores on the test set
val predictionAndLabels= test.map{caseLabeledPoint(label, features)=>
val prediction = model.predict(features)
(prediction, label)
}
// Instantiate metrics object
val metrics = newBinaryClassificationMetrics(predictionAndLabels)
// Precision by threshold
val precision = metrics.precisionByThreshold
precision.foreach{case(t, p)=>
println(s"Threshold: $t, Precision: $p")
}
// Recall by threshold
val recall = metrics.recallByThreshold
recall.foreach{case(t, r)=>
println(s"Threshold: $t, Recall: $r")
}
// Precision-Recall Curve
val PRC = metrics.pr
// F-measure
val f1Score = metrics.fMeasureByThreshold
f1Score.foreach{case(t, f)=>
println(s"Threshold: $t, F-score: $f, Beta = 1")
}
val beta = 0.5
val fScore = metrics.fMeasureByThreshold(beta)
f1Score.foreach{case(t, f)=>
println(s"Threshold: $t, F-score: $f, Beta = 0.5")
}
// AUPRC
val auPRC = metrics.areaUnderPR
println("Area under precision-recall curve = "+ auPRC)
// Compute thresholds used in ROC and PR curves
val thresholds = precision.map(_._1)
// ROC Curve
val roc = metrics.roc
// AUROC
val auROC = metrics.areaUnderROC
println("Area under ROC = "+ auROC)
Refer
http://blog.csdn.net/justdoithai/article/details/51213367
http://f.dataguru.cn/thread-659637-1-1.html
http://www.cnblogs.com/who-a/p/5499539.html
http://blog.csdn.net/u011263983/article/details/51924891
https://en.wikipedia.org/wiki/Receiver_operating_characteristic
https://en.wikipedia.org/wiki/F1_score
總結
- 上一篇: Online Learning算法理论与
- 下一篇: EM算法学习笔记