召回、精確、準確,這些讓人頭大的概念一文全講清楚

本文始發於我的公衆號:TechFlow,原創不易,求個關注web


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

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

均方差

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

這裏的m是樣本的數量,是一個常數,咱們也能夠忽略,若是忽略的話就是平方差和,好像並無一個專門的術語。並且若是不算均值的話,可能這個和會很大,因此一般咱們會計算均值。app

這裏的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位閾值來判斷是正例仍是負例,理論上來講,咱們提高這個閾值,就能夠提高模型的精確度,可是與此同時召回率也會降低。反之,若是咱們下降這個閾值,咱們會獲得更多的正例,同時也意味着會有更多的負例被誤判成了正例,精確度也就下降。

總結

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

若是以爲迷糊了,能夠想一想那個抓間諜的例子,很是生動有效,必定能夠幫助大家加深記憶。

今天的文章就是這些,若是以爲有所收穫,請順手點個關注或者轉發吧,大家的舉手之勞對我來講很重要。

相關文章
相關標籤/搜索