二分类最优阈值确定_分类模型评价标准,AUC还是Macro F1?
在人工智能領域,分類任務占據了很大的比例,例如物體識別(計算機視覺)、信用卡欺詐(數值型預測)、情感分析(自然語言處理)等等。針對眾多的分類需求,模型的評價標準只是簡單的準確率(Accuracy)嗎? AUC和Macro F1,誰才是真正的分類評價標準呢?
對于業務用戶來說,希望技術團隊完成的是正確分類,區別無分是分成兩類還是多類,是一個級別的分類還是多個級別的分類,然后要求準一點。那么什么是準一點呢?也許用戶還沒有意識到這個問題的復雜性,或者說沒有意識到他們真正關心的是什么。由于多分類問題可以簡化為多個二分類問題,我們直接來分析看似簡單的二分類問題。
準一點就是準確度(Accuracy),也就是說用戶給了我們數據,我們分好類把答卷交給用戶,用戶判卷子的結果。以二分類舉例,75%就是每100個數據,被正確挑出的正類和負類一共有75個。一般情況下這樣的評估方式是合理的,但也有特殊的例子,譬如真實的正負類比例是98比2,那么模型只要把所有的數據都判別為正類,準確率就是98%,非常高,但對業務沒有任何意義,因為一個負類都挑不出來。
為了更方便描述問題,我們按下表把實際的正負類和判斷的正負類分成四種情況,分別是TP、FP、FN、TN,那么準確率Accuracy就是 (TP+TN)/ ALL。要提升準確率,就要降低左下角的FP(也就是誤判,把不該判斷為正類的誤判為了正類)和右上角的FN(也就是漏判,把應該判斷為正類的漏判為了負類)。下表也被稱作混淆矩陣(Confusion matrix)。
那么用戶實際關注的是什么呢?舉兩個例子。例如各大網站的商品推薦,建立一個模型的目的是盡量將正確的商品推薦給感興趣的用戶,如果推了一個產品用戶沒有興趣,也不會有很大損失,這種情境下用戶對于錯誤的推薦并不會很在意。這是一種情境。
而如果是欺詐、垃圾郵件、還款逾期判別的模型,對識別的用戶和郵件會直接進行處理,被錯判為欺詐的用戶可能非常惱怒,被錯判為垃圾郵件也許會直接影響用戶工作。這種情況下寧可遺漏,也要減少誤判。這是第二種情境。
這兩種情境,用戶關注點并不相同,情境一關注的是不要遺漏,可推薦可不推薦的都要給用戶推薦過去。情境二關注的是誤判,拿不準的寧可漏掉,也不要錯誤判定。使用技術語言,情境一關注的是查全率: Recall or TPR = TP/(TP+FN),情境二關注的是精確率: Precision = TP/(TP+FP)。那有沒有平衡這兩種評價標準的指標呢?有,就是F Measure,簡化版本為F1。在多分類中,又細化為Micro F1和Macro F1。
到此天下太平,拿到需求只要跟用戶確認好關注的是Recall,還是Precision就好。然而,新的搗亂分子出現了,那就是AUC:Area Under Curve。
AUC是反映ROC曲線下面的面積,面積越大,模型質量越好。而這個面積是由ROC曲線決定的。而組成ROC曲線的每一個點,是由TPR和FPR來決定。TPR和FPR,指的是TP的比率和FP的比率。TPR = TP/(TP+FN),其實就是Recall。而FPR是個新面孔,FPR=FP/(FP+TN)。如果全部分類正確,則TPR為1,FPR為0,ROC曲線的左上角就是坐標為0,1的點,此時AUC為1。
那么AUC和F1的區別是什么呢?AUC關注的是混淆矩陣里左右兩邊的關系,即放到正類答卷里的數據多,還是放到負類卷子里的數據多。
而F1關注的是正類被誤判的多還是漏判的多:
那么AUC里為什么正類答卷和負類答卷的數據是變化的呢?因為AUC是在并不假設閾值是固定的前提下判斷模型質量。這里的閾值是指,模型判斷一行數據是正類還是負類時,是概率大于50%判斷為正類?還是大于60%判斷為正類?在這個閾值不固定的情況下,AUC仍可以判斷模型質量,并且可以使用KS(Kolmogorov-Smirnov)來幫助查找最優閾值:KS=max(TPR-FPR)。可以說ROC曲線是由多個閾值形成的多個混淆矩陣的結果組合成的。而F1是指在閾值已經固定的前提下,判斷模型質量。因而AUC更公正和合理一些。
至于最終正確的閾值是什么,要考慮用戶更關注TPR還是FPR,才能取舍。
還有一點,樣本確定后,TPR、FPR分母就固定下來了,所以會隨TP、FP增長單調遞增。但Precision的變化情況會隨著閾值調整而變化,且不可預測,或者說不穩定,而AUC會穩定很多。
總結一下,正確的做法是用AUC評價模型能力,選取好的模型之后根據實際需求確定閾值,再用Macro F1計算性能指標。
總結
以上是生活随笔為你收集整理的二分类最优阈值确定_分类模型评价标准,AUC还是Macro F1?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: api接口加密_谈谈API接口开发中的安
- 下一篇: python界面开发pyqt_Pytho