深入理解對比兩個曲線各自的特性和相互的差異需要花不少時間研讀一些國外的技術博客與相關paper,暫時先列出下面這么多,這部分后續可以繼續補充。
ROC曲線和AUC的定義可以參看“ROC曲線於AUC”,Precision-Recall曲線顧名思義即Precision為縱軸,Recall為橫軸的曲線,作圖方法與AUC曲線一致,只是橫縱軸坐標意義不同。
ROC曲線的優勢
ROC曲線有個很好的特性:當測試集中的正負樣本的分布變化的時候,ROC曲線能夠保持穩定。在實際的數據集中經常會出現類不平衡現象,而且測試數據中的正負樣本的分布也可能隨着時間變化。下圖是ROC曲線和Precision-Recall曲線的對比。
其中(a)和(c)為ROC曲線,(b)和(d)為Precision-Recall曲線。(a)和(b)展示的是分類器在原始測試集(正負樣本分布平衡)的結果,(c)和(d)是將測試集中負樣本的數量增加到原來的10倍。可以明顯看出,ROC曲線基本保持原貌,而Precision-Recall曲線則變化較大。
PR曲線會面臨一個問題,當需要獲得更高recall時,model需要輸出更多的樣本,precision可能會伴隨出現下降/不變/升高,得到的曲線會出現浮動差異(出現鋸齒),無法像ROC一樣保證單調性。所以,對於正負樣本分布大致均勻的問題,ROC曲線作為性能指標更魯棒。
PRC曲線的優勢
在正負樣本分布得極不均勻(highly skewed datasets),負例遠大於正例時,並且這正是該問題正常的樣本分布時,PRC比ROC能更有效地反應分類器的好壞,即PRC曲線在正負樣本比例懸殊較大時更能反映分類的真實性能。例如上面的(c)(d)中正負樣本比例為1:10,ROC效果依然看似很好,但是PR曲線則表現的比較差。舉個例子,
單從圖(a)看,這兩個分類器都比較完美(非常接近左上角)。而從圖(b)可以看出,這兩個分類器仍有巨大的提升空間。那么原因是什么呢? 通過看Algorithm1的點 A,可以得出一些結論。首先圖(a)和(b中)的點A是相同的點,因為TPR就是Recall,兩者是一樣的。
假設數據集有100個正樣本。可以得到以下結論:
由圖(a)點A,可得:TPR=TP/(TP+FN)=TP/所有正樣本 =TP/100=0.8,所以TP=80。
由圖(b)點A,可得:Precision=TP/(TP+FP)=80/(80+FP)=0.05,所以FP=1520。
再由圖(a)點A,可得:FPR=FP/(FP+TN)=FP/所有負樣本=1520/所有負樣本=0.1,所以負樣本數量是15200。
由此,可以得出原數據集中只有100個正樣本,卻有15200個負樣本!這就是極不均勻的數據集。直觀地說,在點A處,分類器將1600 (1520+80)個樣本預測為positive,而其中實際上只有80個是真正的positive。 我們憑直覺來看,其實這個分類器並不好。但由於真正negative instances的數量遠遠大約positive,ROC的結果卻“看上去很美”,因為這時FPR因為負例基數大的緣故依然很小。所以,在這種情況下,PRC更能體現本質。
ROC曲線與PRC曲線表現差異的原因
為什么會有上面分析到的兩者差異呢?下面摘自引用[1]的解釋很清楚,FPR 和 TPR (Recall) 只與真實的正例或負例中的一個相關(可以從他們的計算公式中看到),而其他指標如Precision則同時與真實的正例與負例都有關,即下面文字說的“both columns”,這可以結合混淆矩陣和各指標的計算公式明顯看到。
思考
1、ctr預估顯然是負例 遠多於 正例,那為什么業界還普遍用ROC曲線而不是PRC曲線下的面積作為性能指標 ?
思考:
我的思考是,對於ctr預估這個問題,我們需要一個於排序強相關的衡量指標,ROC與PRC都可以,而上面介紹了相比PRC,ROC具有魯棒性的優勢。ROC的缺點是對於ctr這種負例遠多於正例的問題,其顯示的圖像和對應的AUC過於“樂觀”,不能很好地反映分類器的真實性能,這意味着,即使算法的AUC約為0.8,看起來已經是一個比較好的值的,算法性能應該很不錯,但是PRC曲線告訴我們,還沒得很呢,還有很大提升空間。
但是,對於ctr問題本身而言,AUC的高低確實可以衡量兩個算法的性能優劣,算法A的AUC大於算法B,那么絕大部分情況下可以認為算法A優於算法B,即以AUC為指標進行模型的快速迭代和選擇依然是合理的。
另外很重要的一點是,相比於PRC曲線下的面積計算,AUC的計算更容易。
2、隨機猜測的PRC曲線是怎么樣的?
參考資料
[1] https://machinelearningmastery.com/roc-curves-and-precision-recall-curves-for-classification-in-python/
Jason 的 ML專欄系列文章,很贊,里面包括了很多很棒的深入閱讀鏈接,包括下面的補充閱讀中列出來的
[2] 知乎專欄,提到了ROC與PRC的關系 https://zhuanlan.zhihu.com/p/28482121
補充閱讀
[1] An introduction to ROC analysis http://web2.utc.edu/~Dileepan/4270/4270Notes/roc.pdf
[2] The relationship between Precision-Recall and ROC curves https://www.researchgate.net/publication/215721831_The_Relationship_Between_Precision-Recall_and_ROC_Curves