
做機器學(xué)習(xí)項目這幾年我發(fā)現(xiàn)一個很有意思的現(xiàn)象很多人訓(xùn)練模型時眼睛只盯著準確率Accuracy這一個數(shù)字看到90%就覺得自己大功告成了。結(jié)果模型一上線在實際業(yè)務(wù)里表現(xiàn)慘不忍睹。問題出在哪不是模型不好而是你沒選對衡量模型好壞的尺子。分類器模型的評價指標表面上就是幾個公式、幾張表格但實際上它決定了你訓(xùn)練時的優(yōu)化方向、調(diào)參時的決策依據(jù)以及最終能否真正解決業(yè)務(wù)問題。這篇文章我想從實際項目出發(fā)把分類器評價指標這件事從頭到尾捋一遍講講每個指標到底在說什么、適合什么場景以及那些踩過的坑。分類器可以說是監(jiān)督學(xué)習(xí)里最基礎(chǔ)也最常用的模型類型從垃圾郵件識別、貸款違約預(yù)測到醫(yī)療影像篩查本質(zhì)上都是分類問題。而評價指標就是用來回答這個分類器到底行不行的一套量化標準。只不過不同業(yè)務(wù)對行不行的定義完全不同垃圾郵件漏掉一封可能只是有點煩但癌癥篩查漏掉一例就是人命關(guān)天的事。所以指標的選擇從來不是一個技術(shù)問題而是一個業(yè)務(wù)問題的映射。明白了這一點你才算真正入門了分類器評價。1. 先從最核心的混淆矩陣說起在我?guī)н^的項目里凡是模型效果說不清楚的情況十有八九是沒把混淆矩陣搞明白?;煜仃囀抢斫馑蟹诸愒u價指標的基礎(chǔ)它把模型的預(yù)測結(jié)果和真實標簽放在一個2x2的表格里四個格子分別代表四種情況TPTrue Positive實際為正類預(yù)測也為正類。FPFalse Positive實際為負類但預(yù)測成了正類。FNFalse Negative實際為正類但預(yù)測成了負類。TNTrue Negative實際為負類預(yù)測也為負類。我第一次接觸這個概念時總覺得這四個縮寫容易記混。后來找到一個笨辦法看第二個字母。第二個字母是P代表模型預(yù)測為正類Positive第二個字母是N代表模型預(yù)測為負類Negative。第一個字母表示預(yù)測對了還是錯了T就是True對了F就是False錯了。這樣一來就永遠不會搞混了。有了這四個數(shù)幾乎所有分類指標都能推導(dǎo)出來。我習(xí)慣把混淆矩陣當(dāng)作證據(jù)臺賬來看你不能只看模型說得對不對還要看它是在什么條件下說對的是在正類樣本上對了還是在負類樣本上對了。很多看似漂亮的指標一放到混淆矩陣里就現(xiàn)出原形了。1.1 混淆矩陣的構(gòu)建過程先說說怎么得到混淆矩陣。在真正業(yè)務(wù)代碼里我們通常直接用現(xiàn)有庫來計算但為了理解原理我建議你至少手動實現(xiàn)過一次。假設(shè)你有一批測試集數(shù)據(jù)真實標簽有50個正類、50個負類。模型預(yù)測之后你統(tǒng)計一下預(yù)測值和真實值之間的組合關(guān)系實際為正類且預(yù)測為正類 - TP 實際為負類但預(yù)測為正類 - FP 實際為正類但預(yù)測為負類 - FN 實際為負類且預(yù)測為負類 - TN把這些數(shù)字填進矩陣橫軸通常放預(yù)測類別縱軸放實際類別就完成了混淆矩陣的構(gòu)建。這個過程就是一次對賬每一條測試樣本你都要知道它被模型劃到了哪個格子而不是只看最終得分。提示二分類的混淆矩陣看著簡單但到了多分類場景矩陣會變成n x n的表格對角線上的值就是各類別被正確預(yù)測的數(shù)量其余位置就是各類別之間的混淆情況。多分類指標也是在這個基礎(chǔ)上擴展的后面我會專門講。1.2 混淆矩陣的實際業(yè)務(wù)解讀混淆矩陣里的每一個格子在業(yè)務(wù)層面都有明確的含義。比如在信貸風(fēng)控場景下把好客戶預(yù)測成壞客戶FP意味著你可能錯失一筆優(yōu)質(zhì)業(yè)務(wù)把壞客戶預(yù)測成好客戶FN則意味著你承擔(dān)了違約損失。這兩類錯誤的代價往往不對稱所以不能簡單用一個總數(shù)來概括模型好壞??辞宄煜仃嚨姆植歼€能幫你快速發(fā)現(xiàn)模型是否存在系統(tǒng)性偏差。比如某一類樣本數(shù)量很少但錯誤全部集中在那一類上說明模型對該類別的學(xué)習(xí)明顯不足。這時候你要做的不是盲目調(diào)參而是檢查訓(xùn)練數(shù)據(jù)的類別分布、特征表達是否充分甚至要考慮是否要為少數(shù)類單獨建模。2. 二分類五大核心指標逐個拆解基于混淆矩陣最常用的五個指標是準確率、精確率、召回率、F1分數(shù)和特異度。我逐個講清楚它們的計算方式、直觀含義和適用場景這比囫圇吞棗記公式要有用得多。2.1 準確率是最直觀也最容易騙人的指標準確率的公式是Accuracy (TP TN) / (TP TN FP FN)翻譯成人話就是所有樣本中模型預(yù)測正確的比例。對于類別分布均衡的數(shù)據(jù)集準確率確實能直觀反映模型整體表現(xiàn)這也是為什么很多人把它當(dāng)成首選指標。但在類別嚴重不平衡的場景下準確率會變得非常不可靠。我做過一個真實的項目數(shù)據(jù)集里95%是負類樣本5%是正類樣本。一個愚蠢的、永遠預(yù)測負類的模型準確率都能達到95%。看著模型報告上的95%準確率實際上模型啥也沒學(xué)會。這種時候準確率就徹底失真了。所以我在實際工作中遇到不平衡數(shù)據(jù)的第一反應(yīng)就是不要單獨看準確率必須結(jié)合其他指標一起看。2.2 精確率談的是模型說對的時候有多靠譜精確率Precision的公式是Precision TP / (TP FP)。它回答的問題是預(yù)測為正類的樣本中有多少比例是真的正類換句話說它度量的是模型的精度也就是模型給出正類判斷時的可信度。精確率高意味著模型比較保守它不太敢輕易說某樣本是正類一旦說了大概率是對的。在垃圾郵件識別里我們希望精確率高因為把正常郵件誤判成垃圾郵件的代價很大你不想錯過一封重要郵件。類似的場景還有商品推薦你推薦給用戶的商品必須是用戶真正感興趣的推薦錯了會直接影響用戶體驗和信任度。2.3 召回率談的是模型漏掉了多少正類召回率Recall的公式是Recall TP / (TP FN)也叫真正率TPR。它回答的問題是所有真實的正類樣本中模型找回來了多少比例它度量的是模型的完整性也就是模型的查全能力。召回率高意味著模型比較激進它會盡可能把所有疑似正類都找出來代價是可能誤傷一部分負類。在醫(yī)療篩查場景我們希望召回率高因為漏診的代價遠遠大于誤診的代價。如果模型漏掉了一個癌癥患者導(dǎo)致的后果可能是不可逆的。這時候我們寧可讓模型把一些沒問題的人也標記為需進一步檢查也不能漏掉任何一個真正的患者。2.4 精確率和召回率的矛盾以及F1的調(diào)和之道在大多數(shù)情況下精確率和召回率是一對矛盾指標。你把分類閾值調(diào)低模型更傾向于預(yù)測正類召回率上升但誤報也增多精確率下降你把閾值調(diào)高模型更謹慎精確率上升但真正要找的樣本也被放過了召回率下降。這種魚與熊掌不可兼得的關(guān)系是分類器調(diào)參中最核心的權(quán)衡。為了有一個綜合性的評價我們引入F1分數(shù)它是精確率和召回率的調(diào)和平均數(shù)F1 2 x Precision x Recall / (Precision Recall)。調(diào)和平均數(shù)的特點是只有當(dāng)精確率和召回率都比較高時F1才會高。如果你的模型精確率99%但召回率只有10%算出來的F1也高不了。F1特別適合在你不確定哪個指標更重要時使用它是一個相對均衡的折中方案。2.5 特異度是經(jīng)常被忽視的配角特異度Specificity的公式是Specificity TN / (TN FP)它回答的問題是所有真實負類樣本中模型正確識別出了多少比例特異度和召回率看起來對稱但它們的關(guān)注點完全不同。召回率關(guān)心正類樣本的覆蓋情況特異度關(guān)心負類樣本的甄別情況。在有些場景下特異度其實至關(guān)重要。比如反欺詐系統(tǒng)如果特異度不夠高意味著大量正常交易被攔截用戶體驗會變得非常糟糕。數(shù)據(jù)科學(xué)家常犯的錯誤是只關(guān)注精確率和召回率完全無視特異度。實際上完整評價一個分類器準確率、精確率、召回率、F1和特異度這五個指標應(yīng)該一起來看才能對模型形成一個立體的全貌。3. 曲線類指標P-R曲線與ROC曲線單點指標只能反映模型在一個固定閾值下的表現(xiàn)但很多分類模型輸出的是連續(xù)的概率值我們還需要能評估模型在所有閾值下總體表現(xiàn)的指標。這就引出了P-R曲線和ROC曲線。3.1 閾值如何影響模型的判別結(jié)果大部分分類模型最終輸出的不是一個離散的類別標簽而是一個0到1之間的概率分數(shù)。比如邏輯回歸輸出的是正類的概率SVM輸出的是決策函數(shù)值。我們需要設(shè)定一個閾值比如0.5概率大于等于0.5的判為正類小于0.5的判為負類。閾值不是固定不變的它是一個可以自由調(diào)節(jié)的旋鈕。把閾值從1往下慢慢降低模型預(yù)測為正類的樣本會越來越多召回率逐步上升但精確率往往會逐步下降。把每個閾值下對應(yīng)的精確率和召回率畫出來就是P-R曲線。把每個閾值下對應(yīng)的真正率和假正率畫出來就是ROC曲線。這兩條曲線可以看作閾值掃描的完整記錄比只看某個固定閾值下的指標要全面得多。3.2 P-R曲線的解讀和適用場景P-R曲線的橫軸是召回率縱軸是精確率。一個性能優(yōu)秀的分類器P-R曲線應(yīng)該盡量向右上方凸起。如果曲線下的面積AP分數(shù)越大說明模型在各類別上整體表現(xiàn)越好。P-R曲線最大的特點是對正類樣本的數(shù)量比例比較敏感。當(dāng)正負類樣本數(shù)量差距較大時P-R曲線能更直觀地反映模型在少類上的表現(xiàn)。我當(dāng)時在做一個異常檢測項目時正類樣本占比不到1%用ROC曲線看模型簡直完美但換成P-R曲線立刻露餡模型的表現(xiàn)遠沒有ROC曲線顯示的那么樂觀。所以P-R曲線特別適合類別不平衡、且你重點關(guān)注正類樣本的場景。3.3 ROC曲線的解讀和適用場景ROC曲線的橫軸是假正率FPR即FP/(FPTN)縱軸是真正率TPR也就是召回率。曲線下面積就是AUC值。AUC有一個很直觀的概率解釋隨機從正類樣本中抽取一個再從負類樣本中抽取一個模型給正類樣本打分高于負類樣本的概率。AUC越大說明模型區(qū)分正負類的能力越強。ROC曲線有個特性對于類別分布的變化不那么敏感。即使正負類比例大幅變化ROC曲線基本保持穩(wěn)定。所以在做模型選型、比較不同模型效果時AUC是一個很好的整體區(qū)分能力指標。但在類別極度不平衡且你只關(guān)心少類樣本時ROC的樂觀傾向會讓你誤判這時候要回到P-R曲線。3.4 兩條曲線的對比和選擇策略很多初學(xué)者搞不清P-R曲線和ROC曲線到底該用哪個我的經(jīng)驗是看你的業(yè)務(wù)更在意什么。如果你的業(yè)務(wù)中正類樣本很少、且正類是核心關(guān)注點比如欺詐檢測、異常檢測、罕見病篩查優(yōu)先看P-R曲線如果你想評估模型整體的排序能力且正負類相對均衡ROC曲線和AUC值會更穩(wěn)定、更有參考價值。另外這兩者還可以同時用來診斷模型問題。ROC曲線良好但P-R曲線很差通常意味著類別不平衡問題嚴重ROC曲線和P-R曲線都很差說明模型本身區(qū)分能力不足需要換特征或換算法。通過兩條曲線的組合判斷你可以快速定位模型問題的根源方向。4. 多分類場景下的指標擴展實際業(yè)務(wù)里二分類雖然常見但多分類同樣普遍比如圖像分類、文本分類、客戶分群等。多分類的指標不是重新發(fā)明輪子而是把二分類的指標用不同策略推廣到多個類別上。4.1 宏平均、微平均和加權(quán)平均的區(qū)別多分類場景下評價指標有幾種平均策略。宏平均Macro是先對每個類別分別計算指標比如先算每個類別的精確率再求平均值它給每個類別相同的權(quán)重。微平均Micro是先把所有類別的TP、FP、FN匯總起來再計算整體指標它會偏向樣本量大的類別。加權(quán)平均Weighted是宏平均的變體按每個類別的樣本比例加權(quán)再求平均。我用一個簡單的例子說明區(qū)別。假設(shè)三個類別的測試樣本分別是90、5、5某個模型在第三類上表現(xiàn)很差。宏平均會把第三類和第一類看得同樣重要拉低最終分數(shù)微平均因為第一類樣本占大頭最終分數(shù)依然很高。所以當(dāng)你關(guān)注少類別的表現(xiàn)時應(yīng)該選擇宏平均當(dāng)你關(guān)注總體資源消耗時微平均更合適。注意sklearn中classification_report返回的macro avg和weighted avg是最常被用到的兩個值。前者反映各類別平均表現(xiàn)后者更貼近樣本量加權(quán)后的實際效果。兩者差距過大說明模型在小類上明顯偏弱。4.2 多分類混淆矩陣的可視化與解讀多分類混淆矩陣是一個n x n表格行為真實類別列為預(yù)測類別。對角線上的數(shù)值越集中說明模型分類越準確。非對角線上的數(shù)值分布則揭示了模型最容易在哪些類別之間混淆??梢暬喾诸惢煜仃囄伊?xí)慣用熱力圖配合顏色映射數(shù)值越大顏色越深。這樣一眼就能看出模型的主要錯誤歸屬。比如我在一個圖像分類項目里發(fā)現(xiàn)模型經(jīng)常把貓和狗混淆但基本不混淆汽車和飛機。這說明模型可能沒有學(xué)到足夠區(qū)分貓狗的有效特征而不是模型整體崩潰。這種診斷信息對后續(xù)優(yōu)化方向非常有價值。4.3 多分類指標的計算注意事項計算多分類指標時有一個容易踩的坑某些類別沒有出現(xiàn)在預(yù)測結(jié)果里或者某個類別的正類數(shù)與預(yù)測正類數(shù)都為零導(dǎo)致精確率公式分母為0。在不平衡數(shù)據(jù)中尤其常見。多數(shù)框架對這種情況的默認處理是返回0并伴隨警告但這個0并不代表模型在這個類別上真的0分可能是無預(yù)測狀態(tài)。處理方式一般是設(shè)置zero_division參數(shù)或自行添加平滑項。我一般習(xí)慣打印出完整的混淆矩陣來檢查而不是只盯著平均指標。如果某個類別根毛都沒有預(yù)測出來平均指標再好看都是空中樓閣必須回到原始數(shù)據(jù)去找原因。5. 樣本不均衡這個繞不開的坎樣本不均衡是分類任務(wù)中最常見的干擾因素也是指標誤讀的根源之一。我記得有一個項目正負樣本比例達到1000:1幾乎所有常用指標都會變得難以解讀。搞懂不均衡場景下的指標特性是分類器評價的進階必修課。5.1 不均衡場景下哪些指標會失真首先是準確率前面已經(jīng)說過負類占比極高時全預(yù)測負類的模型也能拿到很高的準確率。其次是召回率在不均衡場景下它單獨看沒有意義必須結(jié)合精確率一起看因為你很容易通過無腦預(yù)測正類把召回率拉到100。AUC雖然相對穩(wěn)定但只在正負類比例變化不大的范圍內(nèi)可靠極端不均衡時也會顯得過于樂觀。5.2 從業(yè)務(wù)角度定義最優(yōu)指標組合不均衡場景下我一般不建議只看某一個指標而是從業(yè)務(wù)代價出發(fā)定義一組指標。比如對于醫(yī)療篩查核心指標是召回率輔助看精確率對于精準營銷核心指標是精確率輔助看召回率對于風(fēng)控兩邊都重要直接看F1或更貼近業(yè)務(wù)的自定義加權(quán)公式。務(wù)實地講評價一個分類器不能脫離業(yè)務(wù)去談最好。很多搞數(shù)據(jù)競賽的人習(xí)慣只看AUC或者F1但在真實業(yè)務(wù)里指標必須配合業(yè)務(wù)目標。我參與過的一個風(fēng)控項目最終模型優(yōu)化的不是AUC而是自定義的代價函數(shù)把不同類型錯誤配上不同的金額權(quán)重。這樣的指標才真正對業(yè)務(wù)有指導(dǎo)意義。5.3 不均衡數(shù)據(jù)建模后的指標驗證對于不均衡數(shù)據(jù)我還有一個習(xí)慣建模完成后一定要分別看正類和負類的指標而不是只看匯總值。具體做法是從混淆矩陣出發(fā)分別計算正類的精確率、召回率、F1以及負類的精確率、召回率、F1。如果正類召回率很高但負類召回率很低說明模型激進過頭了反過來正類精確率很高但召回率很低說明模型太保守。這種分而治之的方式比單個綜合指標更能暴露模型的問題。有一次我接手一個老模型整體F1看起來還行但一拆分發(fā)現(xiàn)負類召回率只有30%導(dǎo)致大量正常操作被攔截。運維同事天天被投訴問題根源卻在模型評估環(huán)節(jié)就被埋下了。6. 三類典型場景怎么選指標不同業(yè)務(wù)場景對分類器評價指標的取舍差別極大這里我挑三個典型場景搜索推薦、風(fēng)控反欺詐、醫(yī)療診斷。通過這些案例你會發(fā)現(xiàn)指標選擇本質(zhì)上是一個錯誤代價權(quán)衡問題。6.1 搜索推薦場景精確率優(yōu)先在搜索推薦系統(tǒng)里模型給用戶推薦商品或內(nèi)容核心目標是讓用戶點擊或購買。推薦錯了用戶會感到被打擾甚至對平臺產(chǎn)生不信任。所以這類場景下我們優(yōu)先保證精確率寧可少推薦也要保證推薦的準確性。當(dāng)然精確率優(yōu)先不代表召回率不重要。我的經(jīng)驗是在召回階段從海量候選里篩選出幾百個主要看召回率在排序階段把幾百個排成幾十個展示給用戶主要看精確率。不同階段用不同指標這才是評價體系的正確打開方式。6.2 風(fēng)控反欺詐場景向少類召回率傾斜欺詐交易是典型的少類事件如果把欺詐放過造成的損失是直接的把正常交易誤判為欺詐影響的只是用戶體驗和部分收入。所以在反欺詐場景通常優(yōu)先做高召回率再通過精確率來控制誤報率。具體操作上我發(fā)現(xiàn)一個比較穩(wěn)妥的方式是設(shè)定一個召回率下限在這個前提下最大化精確率。比如要求欺詐召回率不低于95%在這個約束下盡量做到精確率最高。這樣既保證了核心風(fēng)險不失控又防止誤報過多。你可以在驗證集上畫出P-R曲線找出符合召回率約束的最優(yōu)閾值點。6.3 醫(yī)療診斷場景召回率壓倒一切醫(yī)療診斷場景里漏診一例惡性腫瘤的后果遠嚴重于誤診一例良性病例。所以在這個場景里模型評價的核心指標是召回率并且通常要求無限逼近100%。臨床上常用敏感性這個術(shù)語其實質(zhì)就是召回率。但是只有召回率沒有精確率也不行。如果模型把所有患者都預(yù)測為陽性召回率確實是100%但精確率低到不可用醫(yī)生也會失去對模型的信任。所以醫(yī)療場景通常會設(shè)置一個回叫率-漏檢率的平衡區(qū)間并在這個區(qū)間內(nèi)選擇可接受的模型。做醫(yī)療AI項目時評估指標必須跟臨床醫(yī)生反復(fù)對齊這是一個非常重要的經(jīng)驗。7. 實操一次跑完分類器全部評價指標說了這么多理論直接上代碼。我用一段通用的Python代碼演示如何一次性算出分類器的全部核心指標。這段代碼在Jupyter Notebook里可以完整跑通我建議你把它存成模板以后任何二分類項目都能直接復(fù)用。7.1 準備數(shù)據(jù)集和訓(xùn)練預(yù)測為了演示方便我直接用一個模擬分類器生成預(yù)測結(jié)果不依賴特定數(shù)據(jù)集。實際項目中你只需要把y_true和y_pred換成自己模型的結(jié)果就行。import numpy as np from sklearn.metrics import ( accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report, roc_auc_score, roc_curve, precision_recall_curve, auc ) # 模擬真實標簽和模型預(yù)測概率 rng np.random.default_rng(42) y_true np.array([0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1]) y_pred_prob rng.uniform(0, 1, sizelen(y_true)) # 固定閾值 0.5 threshold 0.5 y_pred (y_pred_prob threshold).astype(int) # 混淆矩陣 cm confusion_matrix(y_true, y_pred) print(Confusion Matrix:) print(cm)這段代碼用隨機概率模擬了模型的輸出實際項目中y_pred_prob是模型在測試集上的預(yù)測概率。固定閾值0.5是最常見的選擇但前面也說過閾值應(yīng)該根據(jù)業(yè)務(wù)需求來調(diào)節(jié)。7.2 計算準確率、精確率、召回率、F1接著用 sklearn 的現(xiàn)成函數(shù)一次性算出五個核心指標accuracy accuracy_score(y_true, y_pred) precision precision_score(y_true, y_pred) recall recall_score(y_true, y_pred) f1 f1_score(y_true, y_pred) tn, fp, fn, tp cm.ravel() specificity tn / (tn fp) print(fAccuracy: {accuracy:.4f}) print(fPrecision: {precision:.4f}) print(fRecall: {recall:.4f}) print(fF1 Score: {f1:.4f}) print(fSpecificity: {specificity:.4f}) # 輸出完整分類報告 print(\nClassification Report:) print(classification_report(y_true, y_pred))classification_report輸出的是一個包含精確率、召回率、F1、支持數(shù)的表格非常直觀。注意cm.ravel()的順序是 [TN, FP, FN, TP]這是sklearn的固定約定不要記錯了。7.3 繪制P-R曲線和ROC曲線曲線類指標能讓評價視野從單點擴展到全閾值。下面這段代碼會同時畫出P-R曲線和ROC曲線import matplotlib.pyplot as plt # P-R 曲線 precisions, recalls, pr_thresholds precision_recall_curve(y_true, y_pred_prob) pr_auc auc(recalls, precisions) # ROC 曲線 fpr, tpr, roc_thresholds roc_curve(y_true, y_pred_prob) roc_auc roc_auc_score(y_true, y_pred_prob) fig, axes plt.subplots(1, 2, figsize(12, 5)) axes[0].plot(recalls, precisions, marker.) axes[0].set_title(fP-R Curve (AP {pr_auc:.4f})) axes[0].set_xlabel(Recall) axes[0].set_ylabel(Precision) axes[1].plot(fpr, tpr, marker.) axes[1].plot([0, 1], [0, 1], linestyle--, labelRandom) axes[1].set_title(fROC Curve (AUC {roc_auc:.4f})) axes[1].set_xlabel(FPR) axes[1].set_ylabel(TPR) axes[1].legend() plt.tight_layout() plt.show()P-R曲線下的面積在很多資料中叫APAverage PrecisionROC曲線下的面積叫AUC。兩者結(jié)合看比只看單一指標要可靠得多。很多實際項目的模型診斷就是通過觀察這兩條曲線的形態(tài)差異來定位問題的。8. 常見問題與排查技巧實錄最后分享幾個我在實戰(zhàn)中反復(fù)踩過的坑每個都對應(yīng)一個高頻問題。這些經(jīng)驗不是從文檔里看來的是我在項目交付中被現(xiàn)實毒打后總結(jié)出來的。8.1 為什么準確率95%但業(yè)務(wù)效果一塌糊涂這種情況幾乎都是樣本不均衡惹的禍。如果你發(fā)現(xiàn)模型的生死指標是正類召回率而準確率卻很高那大概率是負類占了絕大多數(shù)模型走保守預(yù)測路線就能包住準確率但對真正關(guān)心的正類毫無識別能力。我的處理辦法很簡單第一看混淆矩陣把TP、FP、FN、TN四個數(shù)擺出來第二分別計算正類和負類的召回率第三用P-R曲線代替ROC曲線觀察模型在少類上的真實表現(xiàn)。三步走完問題通常就暴露了。8.2 精確率和召回率都高F1卻不高的問題有人遇到過精確率80%、召回率80%但F1只有0.5的情況嗎如果算出來0.5而不是0.8八成是公式用錯了。F1是調(diào)和平均數(shù)不是算術(shù)平均數(shù)。正確計算方式F1 2 x 0.8 x 0.8 / (0.8 0.8) 0.8如果你算出的F1明顯不等于這個數(shù)檢查一下是不是把precision和recall的變量搞混了或者傳參順序反了。這種低級錯誤我自己也犯過排查半天才發(fā)現(xiàn)是公式里除數(shù)和被除數(shù)寫反了。8.3 閾值設(shè)0.5是不是最優(yōu)選擇不是。0.5只是默認值它隱含的假設(shè)是正類錯誤和負類錯誤的代價相等這在多數(shù)真實業(yè)務(wù)里是不成立的。最優(yōu)閾值應(yīng)該根據(jù)業(yè)務(wù)代價曲線來確定。比如在欺詐檢測中你可能需要讓召回率達到90%那么就去P-R曲線上找到召回率等于90%的那個點再讀取對應(yīng)的閾值。實際操作上我一般會把所有閾值下的精確率、召回率、F1算出來畫成一張隨閾值變化的曲線圖然后根據(jù)業(yè)務(wù)約束挑選合適的閾值點。這個步驟是純手工的但非常值得做往往只需要十幾行代碼就能幫你找到一個明顯優(yōu)于0.5的決策邊界。8.4 不同模型比較時用什么指標更公平比較不同模型時我的建議是不要只用一個指標下結(jié)論。比如A模型F1更高B模型AUC更高這看似矛盾其實正常因為F1和AUC衡量的是模型的不同方面。F1反映的是在某個具體閾值下的應(yīng)用表現(xiàn)AUC反映的是模型整體的排序能力。一個模型應(yīng)用表現(xiàn)好一個模型排序能力強兩者并不互斥。我的經(jīng)驗是在模型選型階段優(yōu)先看AUC因為它不受閾值影響能反映模型上限在模型上線前則優(yōu)先調(diào)閾值、看F1和業(yè)務(wù)指標因為線上系統(tǒng)的表現(xiàn)高度依賴具體閾值。兩階段用不同指標才是科學(xué)決策。8.5 指標看起來沒問題但線上效果差這個問題我在多個項目里遇到過。模型在測試集上F1很高、AUC也很高上線之后效果卻不行。主要原因通常是訓(xùn)練集和線上數(shù)據(jù)分布不一致也就是所謂的數(shù)據(jù)漂移。指標再好也只是在測試集上證明了一個事實模型在那個數(shù)據(jù)分布下表現(xiàn)好。但線上數(shù)據(jù)變了之前的結(jié)論自然失效。這種情況下你已經(jīng)不能用傳統(tǒng)分類指標來解決根本問題而是要建立線上監(jiān)控。比如觀察線上預(yù)測的概率分數(shù)分布與訓(xùn)練時的分布是否相似定期用新標注的數(shù)據(jù)做驗證持續(xù)迭代模型。指標不是一次性的而是伴隨模型生命周期的長期工具。我個人在實際操作中的體會是評價分類器這件事沒有一勞永逸的標準答案關(guān)鍵是理解每個指標的適用邊界。多花點時間把混淆矩陣、精確率、召回率、F1、P-R曲線、ROC曲線之間的關(guān)系真正吃透再回到業(yè)務(wù)里定指標權(quán)重你會發(fā)現(xiàn)模型的真實水平比你想象的要清楚得多。最后再分享一個小技巧不管計算什么指標第一件事永遠是打印混淆矩陣這四個格子會告訴你其他所有指標背后隱藏的真相。