1. 程式人生 > >第六週:Machine learning system design

第六週:Machine learning system design

做專案的推薦方法

  1. 迅速地用一個簡單的演算法來實現這個專案,不必特別精細,並在交叉驗證集上測試。
  2. 畫出學習曲線,判斷是否需要更多的資料,或者更多的特徵值還是多項式等等。
  3. 之後就是誤差分析了,需要我們人工地去檢查那些犯錯的樣例,發現這些樣例有哪些共同的性質。

評估演算法好壞

我們以癌症患者分類器為例,比如說癌症患者在訓練集的比例是0.5%,那如果我的機器學習演算法直接預測所有的人都不是癌症患者,那麼我的演算法冒無疑問在測試集上依舊可以取得很好的精度,因為患癌症的人畢竟是少數,可是這個演算法得出的結果未免太過荒謬了。這個就是偏斜類(skewed class)問題了。這就告訴我們之前評估演算法好壞的方法並不靠譜,我們需要其他的評估方法來測量我們演算法的好壞。

度量演算法好壞的術語

這裡寫圖片描述
我們設total_examples = TP+FP+FN+TN, 也就是樣例總數。

精度

顧名思義,是指我們的演算法預測對的比例。
精度(accuracy) = (TP + TN) / total_examples 

(這裡的TP,TN在上圖找)

查準率(準確率,說實話我感覺準確率這個詞讓我感覺蠻像精度的,不過這是西瓜書上的,所以我們還是區分一下精度和準確率吧。)

在所有預測為positive的樣例裡,真正是positive的比例。以癌症患者分類器為例,也就是預測為癌症患者的人中,真的是癌症患者的比例。
查準率(precision) = TP / (TP + FP)

查全率(召回率)

對於真正是positive的樣例,被預測成positive的比例。還是癌症患者分類器為例,癌症患者被查出來的比例。
查全率(recall) = TP / (TP + FN)

查準率,查全率的比較

還是以癌症患者為例,我們希望癌症患者儘量地被查出來,也就是查全率比較高,相反地,對於查準率就比較低了。
同樣地,我們也希望不要有非癌症患者被我們預測成癌症患者,造成不必要的損失,也就是查準率比較高,相反地,查全率就比較低了。
那麼我們到底是要查全率高,還是要查準率高?那麼得要看你需要的到底是什麼了。
一般地,查準率變高,查全率會變低,或者相反的情況。我想,除非是你的假設非常接近真實模型,查準率和查全率都非常接近1的情況。

如何調整查全率和查準率

比如在邏輯迴歸問題中
這裡寫圖片描述
我們通常是threshold設定成0.5,可是如果我們需要較高的查準率,可以將threshold設定高一點,如果需要較高的查全率,那麼將threshold設定低一點。

綜合查準率和查全率的選擇

我們通常希望二者都比較高,可是一般來說,一個變大,另一個就會變小,有沒有另一種度量標準?
我們首先會想到二者的平均值可以嗎?可是聯想到偏斜類的問題,這個方案直接斃掉。
還有一種方法就是利用調和平均算出來的F值(調和平均,有興趣的同學自行搜一下吧,很簡單的一個公式)。

F = 2*(P*R / (R+P))

有了F值,我們就可以有一個比較好的度量方式了。