全文共3271字,預計學習時長6分鐘
選擇合適的度量標準去解決分類問題,可以讓我們更好地了解模型,讓模型更快地實現自我優化,並獲得更多面向業務的結果。比如:
解決模稜兩可的問題
天氣預報、股價預測、信用欺詐檢測等都試圖通過建立數據模式來解決一個看似模糊的問題。我們往往試圖找出觀測數據和觀測目標標籤之間的關係,並進一步利用發現的這些關係進行預測。
那麼,我們發現的數據和預測目標之間關係的質量如何呢?
求函數近似值
在所有有可能的數據下,每一個事件都是可預測的,因此每一個目標觀測都可以用一個函數來解釋,這個函數採用了正確的預測值集。
f(AllPredictors)->yorf(AllPredictors) gives target
我們試圖找到一個函數g,與f值非常近似。由於有時沒有所有預測變量和所有的觀測值,因此不可能找到函數f本身。所以發現:
g(Some subset ofPredictors) -> y [Correct in most cases]
g與f的近似程度如何?
「g與f的近似程度」將取決於我們的預測器,以及我們的學習算法。
我們有兩個問題,第一:函數近似程度有多高?第二:在數據和目標之間找到的關係有多好?度量標準會回答這些問題。
一個好的指標來預測第二天的降雨情況
我們每天都會對第二天進行預測。比如我們經常會預測明天是否會下雨?需要帶傘嗎?
假設只有87天下雨,278天沒下雨。我們可以預測這些天中下雨天有42天。但總的來說,預測有122天要下雨。87天中有42天是正確的,278天中有278-80=198天,42+198=240天。所以正確率為240/365或65%。但如果我們的目的是保護用戶不被淋溼,那麼我們失敗了87-42=45次。有一半的雨都沒料到。所以,雖然65%的時間是正確的,但仍然有45天被淋溼,只在42天沒被淋溼。
所以,使用的指標(總誤差的百分比)是否是問題的正確指標?請看下面2個案例:
案例1:避開下雨天:客戶基於你的預測來計劃外出。也許你可以用另一種方法衡量?就像「檢測到%雨天」和「N天之前的TTL /預測」一樣,由於我們的用戶希望能避開下雨天,如果我們能檢測到大多數雨天就更好了。此外,在這種情況下,提前提供預測(第二個度量標準)以供用戶計劃也很重要。我們在努力優化兩者。
案例2:通勤交通路線選擇:在這裡你可以預測每小時的情況並且不需要查找所有下雨天,更重要的是大部分時間都要正確,因此用戶(或地圖應用程式)可以在大多數時間選擇正確的路線。這裡「整體的正確時間百分比」確實是一個很好的指標。
由此可見,成功的機器學習解決方案不僅需要定義精度、召回、準確度。指標可能還需要考慮重要的業務因素,例如應該何時進行預測?需要預測多長時間?(需求預測域)算法需要多長時間等等。
本文重點研究了分類問題的一個子集——偏差標籤分類問題。在這些問題中,目標標籤不是均勻分布的。示例本身存在偏差,其中正標籤(下雨)僅為87,而負標籤為278個,偏差為1:3。
像信用欺詐這樣的問題有很多偏差,99%的例子是負標籤(非欺詐),只有1%是正標籤(欺詐)。因此,諸如準確性、精確度、召回之類的通用指標無法達到目的。此外,許多組織都有一套關於精確、召回的概念(90%精確度,95%召回率)。但對於這些偏重類的問題,這些數字大多是無法實現的。因此,正確的問題是:機器學習模型能否提供商業價值?指標應反映此問題。
可用於分類問題的度量標準
本文提供了當前流行的scikit庫中可用的分類指標列表。下面是從最好到最差的排序(關於偏差問題):
敏感度分數
特異性分數
精確度
召回
平衡準確度
準確性
F1得分
AUC-ROC
精確召回曲線下的平均精度/面積
不平衡/偏差問題的分類度量行為
我們將人工創建一些數據然後將偏差分為正面和負面兩類。接下來,使用分類算法和一些指標來檢查指標對增加的偏差的反應。
理想情況下,如果沒有對模型進行微調或對數據進行重新採樣,合適的指標應該是從好到壞。另一方面,不考慮偏差的指標將不會顯示出很大的變化,甚至可能隨著變差的增大而增大。
首先看看不平衡的數據是什麼樣的,使用scikit的make_moons api函數。
當增加不平衡時的結果為:
接下來看看在不斷增加的不平衡下各種指標是怎樣的。
接下來,定義一個連續構建模型的函數。
最後,編寫了一個遍布於各種不平衡值以及我們提供的指標的函數,並繪製了指標與不平衡的關係圖。
此處使用了np.logspac來生成不平衡值。這有助於生成更多接近0的值,更少接近1的值。第8行的函數調用不平衡數據,這是一個自定義函數,可以在同一文件夾的lib.py中找到。其他自定義函數在同一個文件中。
最後,來運行它。使用F1、準確性、召回和精確性作為度量標準。
觀察結果如下:
準確性對不平衡一點也不敏感,而精度、召回和F1對不平衡敏感。
接下來,嘗試一些其他指標。我們定義了兩個新的指標:precision@recall=75和recall@precision=75,因此我們將recall/precision保持在一個設定的閾值,然後檢查不平衡是如何影響其他指標的。
注意,所有這些指標都對不平衡很敏感。為了改進,需要調整模型。另一方面,準確度對不平衡不敏感,因此呈現出良好性能的虛假舒適畫面。這是因為隨著偏差的增加,預測最頻繁出現的類別將呈現高精度。在1:99的偏差情況下(1個正偏差和99個負偏差),如果預測結果總是負的,那麼99%是準確的。準確度=正確預測數/總示例數。
最後將AUC-ROC和平均精度與準確度進行比較。
注意,AUC-ROC對不平衡不敏感。因此,如果數據集有偏差,那麼AUC-ROC就不是一個很好的指標。來找出其中的原因。
關於AUC-ROC對不平衡不敏感的解釋
對於不同的閾值(0-1),ROC曲線呈現出真陽性與假陽性。隨機猜測的最小值可能是0.5。
讓我們看看它對增加不平衡有什麼作用。
我們想證明的是:隨著不平衡的增加,TPR和FPR保持不變。Eq 1: TPR = TP/(TP+FN)
隨著不平衡的增加,TPR將基本保持不變,因為它取決於對正偏差例子進行的錯誤分類。如果算法的檢測性為90%,那麼TPR = 90 /(90+ 10)= 0.9,即TPR不依賴於偏差,而僅依賴於算法檢測正偏差的程度。
Eq 2: FPR =FP/(TN+FP)
有趣的是,隨著偏差的增加,我們將會得到更多的FP,假設算法將每100個負偏差例子中的1個歸類到正偏差裡面(FP),那麼當偏差值較高時,我們得到的負偏差將比正偏差多很多,也將得到很多FP。但在這裡不考慮FP,考慮的是FPR。注意TN的分母,真負值(TN)也會因負偏差類別的增加而增加。因此,FPR也保持不變。
鑑於兩個方程式在直觀上是相同的,因此AUC-ROC對偏差不敏感也就不足為奇了。
使用派生指標解決不平衡/偏差問題
建議根據需求使用以下兩種方法之一。
Precision@Recall=x or FPR@Recall=x
Recall@Precision=x
為什麼有用?
舉一個欺詐檢測的例子,如果想檢測95%的欺詐,那麼召回率= 0.95,現在你要確保沒有太多的FP。精度= TP /(TP + FP),因此請提高精度,降低FP。你在公式中修復了x,所以你對召回有所了解,現在通過不斷召回來優化模型,以提高精度或降低FPR。
同樣的,比如說癌症的藥物管理(化療)。要確保沒有這種疾病的人不會開這種藥物,因為它對健康有巨大的影響。醫院認為診斷的錯誤率只有千分之一。或者精度=999/(999+1)=0.999。所以精度是固定的,現在你的模型必須增加檢測/召回。因此,recall@precision=0.999是一個很好的度量標準。
除了使用這些特定問題的派生度量之外,指標還可以由多個約束條件組成。例如,在談到的降雨預報問題中,你可以有一個像Precision@Recall=0.8,Duration=7Days的指標,即你想要檢測80%的雨天,並在至少7天之前預測到降雨。通過這些約束條件,你也能優化精度。
選擇正確的度量標準時要注意的事項
基於問題和度量的數學性質
如果分布存在偏差,則準確性和AUC-ROC不是優選。最好使用Precision / Recall或某些派生度量。
基於商業效用
在這種情況下,派生指標是優選,因為它們最適合用於商業案例。我們在上面展示了Precision@ Recall = x和Recall @ Precision = x如何很好地編碼業務需求。
為什麼不使用曲線下面積/f1得分/AP作為度量
僅供參考:這只是一個觀點。
請注意,當精度和召回互換時,F1可以是相同的值。設精度= 0.9,召回= 0.3,然後f1 =0.45,將它們互換,並設召回= 0.9,精度= 0.3,結果仍然是f1 = 0.45。現在,如果將f1作為模型指標,那麼精度和召回的值是多少呢?貴公司是否準備好接受這兩個值了呢?他們能理解嗎?
至於AP/AUC-ROC,它們也有類似的情況,即曲線下的面積可能相同,因為兩個外觀非常不同的曲線優化方式各不相同。
注意:
· 不要將AUC-ROC、PR曲線區域(平均精度分數)等用於業務報告。
· 不要在報告中使用像F1 Score這樣複雜的指標。
· 使用派生度量標準,這樣可以輕鬆地輕鬆捕獲業務的精髓。
· 如果數據不平衡,請不要使用準確性或auc-roc。
留言 點讚 關注
我們一起分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」