Stanford機器學習筆記-7. Machine Learning System Design

7 Machine Learning System Design

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

7.1 Prioritizing What to Work On

當咱們着手針對某一實際問題設計機器學習系統時,咱們應該在哪些方面花費較多的時間來使得系統的偏差較少?以構建一個垃圾郵件分類器(a spam classifier)爲例,咱們能夠從下面幾個方面考慮:設計

  • Collect lots of data
    • E.g. "honeypot" project.
  • Develop sophisticated features based on email routing information (from email header).
  • Develop sophisticated features for message body, e.g. should "discount" and "discounts" be treated as the same word? How about "deal" and "Dealer"? Features about punctuation?
  • Develop sophisticated algorithm to detect misspellings (e.g. m0rtgage, med1cine, w4tches.)

很難說上述的哪種方式最有效,並且每一種方式每每須要花費不少時間去研究調查。orm

7.2 Error Analysis

解決機器學習問題的推薦作法是:

  1. Start with a simple algorithm that you can implement quickly. Implement it and test it on your cross-validation data.
  2. Plot learning curves to decide if more data, more features, etc. are likely to help.
  3. Error analysis: Manually examine the examples (in cross validation set) that your algorithm made errors on. See if you spot any systematic trend in what type of examples it is making errors on.

將偏差轉變爲一個單一的數值很是重要,不然很難判斷咱們所是設計的學習算法的表現。

7.3 Error Metrics for Skewed Classed

有時很難說偏差的減小是否真正改善了算法。以癌症分類爲例:

咱們訓練了一個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就好。

7.3.1 Precision/Recall

上述的狀況一般發生在skewed classes的狀況,即一類的數據遠比另外一類的數據多。對於這種狀況,咱們須要採起另外一種方式來衡量一個學習算法的性能。

咱們定義準確率(Precision)召回率(Recall)以下所示,它們分別從兩種角度衡量算法的性能。

因此,當令y = 0時,Recall = 0 / (0 + #False neg) = 0, 即便它有很小的偏差,可是它的召回率過低了。

注意,若是一個算法預測全部的狀況都是negative,則Precision無定義,由於此時

#predicted positive = 0, 除0是無心義的。

7.3.2 Trading off precision and recall: F1 Score

在7.2節中咱們提到,將偏差轉變爲一個單一的數值很是重要,由於這樣咱們才能方便的比較不一樣算法之間的優劣。如今咱們有precision和recall兩個衡量標準,咱們須要權衡二者。若是用Logistic迴歸模型預測病人是否患癌症,考慮下面的狀況:

狀況1: 假設考慮到一個正常人若是誤判爲癌症,將會承受沒必要要的心理和生理壓力,因此咱們要有很大把握才預測一個病人患癌症(y=1)。那麼一種方式就是提升闕值(threshold),不妨設咱們將闕值提升到0.7,即:

    Predict 1 if: (x)≥0.7

    Predict 0 if: (x)<0.7

在這種狀況下,根據7.3.1節的定義,咱們將會有較高的precision,可是recall將會變低。

狀況2: 假設考慮到一個已經患癌症的病人若是誤判爲沒有患癌症,那麼病人可能將因不能及時治療而失去寶貴生命,因此咱們想要避免錯過癌症患者的一種方式就是下降闕值,假設下降到0.3, 即

    Predict 1 if: (x)≥0.3

    Predict 0 if: (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同時較大,特別的,有:

  • P = 0,R = 1,則F1 =0
  • P = 1,R = 0,則F1 = 0
  • P = 1,R = 1,則F1 = 1

注意:咱們應該是在交叉檢驗集上測試F1的值,避免依賴測試集。

7.4 Data for machine learning

多少數據量對於咱們訓練學習算法是足夠的呢?

一般來講,一個"劣等"算法(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。

  • Large data rationale

數據量大可以起做用的基本原理是,可使用一個具備大量參數的學習算法(e.g. logistic regression/linear regression with many features; neural network with many hidden units)來保證誤差較小,而後使用大量的訓練集來大大減弱過擬合(方差較小),從而達到訓練出一個在測試集上偏差較小的,泛化能力強的模型。

相關文章
相關標籤/搜索