Content算法
7 Machine Learning System Design機器學習
7.1 Prioritizing What to Work On ide
7.2 Error Analysis性能
7.3 Error Metrics for Skewed Classed 學習
7.3.1 Precision/Recall 測試
7.3.2 Trading off precision and recall: F1 Scoreui
7.4 Data for machine learningspa
當咱們着手針對某一實際問題設計機器學習系統時,咱們應該在哪些方面花費較多的時間來使得系統的偏差較少?以構建一個垃圾郵件分類器(a spam classifier)爲例,咱們能夠從下面幾個方面考慮:設計
很難說上述的哪種方式最有效,並且每一種方式每每須要花費不少時間去研究調查。orm
解決機器學習問題的推薦作法是:
將偏差轉變爲一個單一的數值很是重要,不然很難判斷咱們所是設計的學習算法的表現。
有時很難說偏差的減小是否真正改善了算法。以癌症分類爲例:
咱們訓練了一個logistic迴歸模型來預測病人是否得癌症 (y = 1 if cancer, y = 0 otherwise),咱們在測試集上測得偏差爲1%(即正確診斷率99%)。可是,事實上病人患癌症的機率只有0.50%,也就是若是咱們徹底忽略特徵量,直接令全部的y = 0,那麼該模型的錯誤率只有0.5%。咱們辛苦獲得模型的偏差竟然比直接令y=0的偏差大。這很讓人生氣! 可是仔細想一想,直接令y = 0真的比咱們訓練出的模型好嗎? 假設咱們須要預測一個事實上已經患癌症(y=1)的病人,那麼前者徹底不可能預測正確,然後者倒是有機會預測正確的。從這個角度看,咱們訓練獲得的模型彷佛更好。這也就說明了算法1比算法2的偏差小,不必定算法1就好。
上述的狀況一般發生在skewed classes的狀況,即一類的數據遠比另外一類的數據多。對於這種狀況,咱們須要採起另外一種方式來衡量一個學習算法的性能。
咱們定義準確率(Precision)和召回率(Recall)以下所示,它們分別從兩種角度衡量算法的性能。
因此,當令y = 0時,Recall = 0 / (0 + #False neg) = 0, 即便它有很小的偏差,可是它的召回率過低了。
注意,若是一個算法預測全部的狀況都是negative,則Precision無定義,由於此時
#predicted positive = 0, 除0是無心義的。
在7.2節中咱們提到,將偏差轉變爲一個單一的數值很是重要,由於這樣咱們才能方便的比較不一樣算法之間的優劣。如今咱們有precision和recall兩個衡量標準,咱們須要權衡二者。若是用Logistic迴歸模型預測病人是否患癌症,考慮下面的狀況:
狀況1: 假設考慮到一個正常人若是誤判爲癌症,將會承受沒必要要的心理和生理壓力,因此咱們要有很大把握才預測一個病人患癌症(y=1)。那麼一種方式就是提升闕值(threshold),不妨設咱們將闕值提升到0.7,即:
Predict 1 if: hθ(x)≥0.7
Predict 0 if: hθ(x)<0.7
在這種狀況下,根據7.3.1節的定義,咱們將會有較高的precision,可是recall將會變低。
狀況2: 假設考慮到一個已經患癌症的病人若是誤判爲沒有患癌症,那麼病人可能將因不能及時治療而失去寶貴生命,因此咱們想要避免錯過癌症患者的一種方式就是下降闕值,假設下降到0.3, 即
Predict 1 if: hθ(x)≥0.3
Predict 0 if: hθ(x)<0.3
在這種狀況下,將獲得較高的recall,可是precision將會降低。
狀況1和狀況2彷佛是相互矛盾的,事實上,precision和recall每每是以下關係,而且高闕值對應高precision和低recall;低闕值對應低precision和高recall。
這樣看來,咱們不得不在precision和recall作出權衡。考慮下面的例子:
能夠看出算法3是恆預測y=1(由於其recall = 1).
爲了將precision(P)和recall(R)這兩種度量方式轉爲一種單一的方式,一個簡單的考慮是取兩者的平均值,即: (P + R) / 2;可是這種方式彷佛不太理想,由於若是這樣,算法3將會被認爲是最優的,而算法3是恆預測y=1,precision很是低。
事實上,一種更好的方式根據precision和recall的調和平均定義F1 Score以下:
1 / F1 = (1 / P + 1 / R) / 2
得 F1 = 2PR / (P + R)
要使F1較大,須要P和R同時較大,特別的,有:
注意:咱們應該是在交叉檢驗集上測試F1的值,避免依賴測試集。
多少數據量對於咱們訓練學習算法是足夠的呢?
一般來講,一個"劣等"算法(inferior algorithm),若是給它足夠的數據來學習,它的表現每每優於一個缺少數據學習的"優等"算法(superior algorithm)。因此在機器學習界有一個這樣的共識:
"It's not who has the best algorithm that wins. It's who has the most data."
(我想這就是BIG DATA的魅力吧)
值得注意的是,爲了充分利用數據,咱們應該選擇包含足夠信息的特徵量。一般一個判斷參考是,給出輸入x,一我的類的專家是否可以自信的預測出y。
數據量大可以起做用的基本原理是,可使用一個具備大量參數的學習算法(e.g. logistic regression/linear regression with many features; neural network with many hidden units)來保證誤差較小,而後使用大量的訓練集來大大減弱過擬合(方差較小),從而達到訓練出一個在測試集上偏差較小的,泛化能力強的模型。