機器學習中的召回、精確、準確,究竟是什麼指標?

今天是機器學習真題的第17篇文章,我們來講講機器學習模型的評估。


在之前的文章當中我們已經介紹了好幾個模型了,有樸素貝葉斯、KNN、KMeans、EM還有線性迴歸和邏輯迴歸。今天我們來和大家聊聊該怎麼評估這些模型。


均方差


這個概念很簡單,它和迴歸模型當中的損失函數是一樣的。可以理解成我們預測值和真實值之間的偏差,我們用y表示樣本的真實值,y_表示模型的預測值,那麼均方差可以寫成:


機器學習中的召回、精確、準確,究竟是什麼指標?


這裡的m是樣本的數量,是一個常數,我們也可以忽略,如果忽略的話就是平方差和,好像並沒有一個專門的術語。而且如果不算均值的話,可能這個和會很大,所以通常我們會計算均值。


這裡的MSE是mean square error的縮寫,也就是平均方差的意思。我們都知道方差在統計學當中表示樣本距離均值的震盪程度,方差越大,表示一個指標越不穩定,波動幅度越大。在迴歸模型的場景當中,我們衡量的不是距離均值的離散程度,而是距離實際值的離散程度。這兩者的含義非常近似,應該不難理解。


均方差越小說明模型距離真實值越接近,所以它既可以作為模型訓練時候的損失函數,又可以作為我們人工審查模型效果的參考。


迴歸模型一般使用的指標就是均方差,而分類模型則要複雜得多,會涉及好幾個指標,我們一個一個來看。


TP, TN, FP和FN


這四個值看起來傻傻分不清楚,但是一旦我們理解了它們的英文,其實很好懂。T表示true,也就是真,那麼F自然表示false,也就是假。P表示positive,可以理解成陽性,N就是negative,就是陰性。這裡的陰陽沒有邏輯上的含義,表示的只是類別,我們也可以理解成01或者是甲乙,因為沒有邏輯因素,所以叫什麼都一樣。


所以這四個就是真假和陰陽的排列組合,有T的都表示真,可以理解成預測正確。比如TP就是真陽,也就是說檢測是陽性,實際上也是陽性。同理,TN就是真陰,檢測是陰性,實際上也是陰性。有F則表示

預測錯誤,FP是假陽,也就是檢測是陽性,但是實際上是陰性,表示檢測錯了。同理,FN是假陰,檢測是陰性,但是實際上是陽性。


我們用醫院檢測代入這幾個值當中一下就理解了,TP和TN表示檢測試劑給力,檢測準確,檢測是陰就是陰,是陽就是陽。而FP和FN說明檢測試劑不行,檢測錯了,要麼就把沒病的檢測出了有病,要麼就是明明有病沒檢測出來。顯然在醫療檢測的場景當中,假陽是可以接受的,假陰不行。因為假陽我們還可以再檢測,來確定究竟是陰還是陽,如果假陰放過了病例會對病人產生不好的影響,所以一般來說醫療檢測試劑都會比標準更加敏感,這樣才能儘量不放過漏網之魚。


召回率


召回率的英文是recall,我覺得這個詞翻譯得很好,中文的意思和英文基本一致,也有的教材當中翻譯成查全率,我感覺差了點意思,還是叫召回率更加信雅達一些。


我們假設一個場景,比如說甲是一個排長,手下有10個小兵,有一個任務需要甲召集所有成員去執行。甲一聲令下,召來了8個。那麼召回率就是80%。我們放入機器學習的場景當中去也是一樣的,在二分類場景當中,一般情況下模型考慮的主要都是正例。可以理解成沙裡淘金,負例就是沙,一般價值不大,而金子就是正例,就是我們需要的。所以召回率就是我們預測準確的正例佔所有正例的比例。


我們把上面的TP、TN、FP和FN代入計算,我們可以得到:


機器學習中的召回、精確、準確,究竟是什麼指標?


TP就是我們預測準確的正例,也就是被我們召回的部分,那麼所有的正例有多少呢?答案是召回的正例加上沒有召回的正例,沒有召回的正例說明預測錯了,預測成負例了。但是它們並不是負例,所以就是假陰性的樣本,自然也就是FN。這裡有一點點繞,關鍵點是召回是針對正例的,不操心負例的情況。就好比你去淘金,你顯然不會關心沙子的情況,只會關心金子有沒有撈到,一個意思。


精確率和準確率


你可能在很多機器學習的書本當中看到過這兩個值,有可能你看的時候還記得它們之間的區別,但是看完之後就忘記了,甚至有可能從此陷入了混淆的狀態。這並不稀奇,我也經歷過,甚至我在面試的時候還搞錯了。


這裡面的原因很大一部分在於翻譯問題,這兩個值翻譯得太接近了。我們從

中文上很難區分出精確率和準確率有什麼差別,在我們看來,這兩個詞是等價的,然而英文當中這兩個詞是做了區分的。所以我們要搞清楚這兩者,需要來看英文的解釋,而不是隻是記住一個概念。


在英文當中,精確率的英文是precision,詞典當中的解釋是:precision is defined as the proportion of the true positives against all the positive results (both true positives and false positives). 翻譯過來是所有預測為正例的樣本當中,正確的比例


準確率英文是accuracy,英文解釋是:accuracy is the proportion of true results (both true positives and true negatives) in the population. 翻譯過來也就是預測結果準確的概率,既然是預測結果準確,那麼顯然既包含了正例也包含了負例。


從英文的描述上我們可以明顯地看出這兩個概念的差異,兩個都是預測正確的部分,但精確率只針對正例,而準確率針對的是所有樣本,既包含正例也包含負例。我個人覺得這兩者翻譯成

篩選正確率和判斷正確率比較容易理解一些,如果只有精確率和準確率可能還好,再加上上面說的召回率,可能真的要暈菜的。


我們來舉一個例子,來把這三個指標都說清楚。


假設在國共內戰期間,tg要抓軍統的特務,已經鎖定了一個村子中的100個百姓,交給甲乙兩個人去找出特務。其中甲挑選了18個人,其中有12個特務,乙呢挑選了10個人,其中有8個特務。假設我們知道一共有20個特務,那麼請問,這兩個人的召回、準確和精確率分別是多少?

機器學習中的召回、精確、準確,究竟是什麼指標?

我們先來看甲,我們先從簡單的召回開始,既然一共有20個特務,甲找出了其中的12個,那麼召回率就是12/20 = 0.6。精確是篩選正確率,我們一共篩選出了18人,其中有12個是正確的,所以精確率是12/18 = 2/3。準確率呢是整體的正確率,它判斷正確了12個特務和80個普通百姓,準確率是(12 + 82 - 8) / 100,也就是86%。


我們再來看乙,它的召回率是8 / 20 = 0.4,精確率呢是8 / 10 = 0.8,準確率是(8 + 90 - 12) / 100 = 86%。


從上面這個例子當中,我們可以得到精確率和準確率的公式。


其中精確率是篩選正確的概率,就是篩選正確的數量除以篩選出來的樣本數,篩選正確的數量自然就是TP,篩選出來的總數除了正確的還有錯誤的,篩選錯誤的也就是FP,所以:


機器學習中的召回、精確、準確,究竟是什麼指標?


準確率是整體上來正確率,也就是所有正確的除以所有樣本數量:


機器學習中的召回、精確、準確,究竟是什麼指標?


recall和precision的取捨


我們繼續研究剛才的例子,從甲乙兩人的結果當中我們會發現他們兩人的準確率都很高,都是86%。但是你會發現這個值沒什麼意義,因為我如果一個特務也沒抓出來,準確率一樣可以有80%。因為負樣本太多了,拉昇了整體的準確率,並不能說明問題。如果負樣本佔據的比例還要大,那麼準確率還會進一步提升。


比如在醫療行業當中,一些疾病的檢測看準確率是沒有用的,因為發病率本身並不高,大量的都是負樣本。如果啥也檢測不出來,一樣可以得出很高的準確率。明白了這點之後,也會減少很多忽悠,比如很多假藥或者假儀器騙子用準確率來說事欺騙消費者。


在負例不重要的場景當中,我們一般不會參考準確率,因為會受到負例的影響。那麼recall和precision這兩個值我們應該參考哪個呢?


我們再回到問題的場景當中,甲乙兩個人,甲的召回更高,20個特務裡找到了其中的12個。而乙的準確率更高,找出的10個人裡面有8個是特務,命中率很高。那麼這兩個人究竟誰更強呢?


代入問題的場景,你會發現這個問題沒有標準答案,答案完全取決於他們兩人的上司。如果上司是一個利己主義者,更加註重業績,寧可殺錯不可放過,那麼他顯然會覺得甲更好,因為抓到的特務更多。如果上司是悲天憫人的仁者,他顯然會更喜歡乙,少抓錯一點就少給老百姓帶來一些損傷。所以這並不是一個技術問題,而是一個哲學問題。


哪一個更好完全取決於看待問題的角度和問題的場景,如果我們換一個場景就不一樣了。如果是疾病篩查的場景,我可能會希望召回更高的,這樣可以儘可能多地召回正例。至於檢測結果不準確,我們可以多測幾次來增加置信度,但是如果放過了一些樣本就會帶來患者漏診的風險。如果是風控場景,由於查到了作弊行為後往往會採取嚴厲的處罰,我們當然更關注精確率,因為一旦抓錯會給用戶帶來巨大的損傷,可能就卸載app再也不來了,所以寧可放過也不可殺錯。


有沒有一個指標可以綜合考慮召回和精確呢?還是有的,這個值叫做F1-score


它的定義是:


機器學習中的召回、精確、準確,究竟是什麼指標?


如果熟悉數學的同學會發現f1-score本質上是recall和precision的調合平均數,我們可以用它來均衡recall和precision,方便我們做取捨。我們也可以計算一下剛才甲和乙的f1-score,計算下來,甲的f1-score是0.631,乙的f1-score是0.533,所以整體上來說還是甲更好。


recall和precision的trade-off


我們繼續剛才的例子,如果你們做過許多模型,你們會發現在機器學習領域當中,recall和precision是不可調和的兩個值,一個模型精確率高了,往往召回就低,而召回高了,精確率就低,我們很難做到精確和召回一起提升,這是為什麼呢?


我用邏輯迴歸模型舉例,我們來看下下面這張圖:

機器學習中的召回、精確、準確,究竟是什麼指標?

圖中的l1,l2和l3可以看成是3個不同的模型,顯然我們可以看得出來l1的精確率最高,但是召回最低,而l3的精確最低,但是召回最高。


這是由兩個原因導致的,第一個原因是我們的樣本存在誤差,尤其是臨界邊緣的數據由於存在誤差,會互相滲透。第二個原因是模型的擬合能力有限,比如在這個例子當中,我們用的是線性模型,我們只能以線性平面劃分樣本。如果擴大召回,就必然會導致混入更多錯誤樣本,如果提升精度,必然召回會下降。


顯然,這是一個交易,英文是trade-off,我們不能都要,必須要在兩者之間做個選擇。當然如果我們換成擬合能力更強大的模型,比如gbdt或者是神經網絡,會取得更好的效果,但是也並非是沒有代價的,越複雜的模型訓練需要的樣本數量也就越多。如果沒有足夠的樣本,模型越複雜越難收斂。

機器學習中的召回、精確、準確,究竟是什麼指標?

這是一個考驗算法工程師的經典場景,我們需要根據我們的場景做出合適的選擇。究竟是要擴大召回,還是提高精確。以邏輯迴歸模型舉例,我們以0.5位閾值來判斷是正例還是負例,理論上來說,我們提升這個閾值,就可以提升模型的精確度,但是與此同時召回率也會下降。反之,如果我們降低這個閾值,我們會得到更多的正例,同時也意味著會有更多的負例被誤判成了正例,精確度也就降低。


總結


今天介紹的這幾個概念不僅是機器學習基礎中的基礎,更是面試當中的常客,作為一個合格的算法工程師,這是必須要理解的內容。


如果覺得迷糊了,可以想想那個抓間諜的例子,非常生動有效,一定可以幫助你們加深記憶。


今天的文章就是這些,如果覺得有所收穫,請順手點個關注或者轉發吧,你們的舉手之勞對我來說很重要。


分享到:


相關文章: