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


7 Machine Learning System Design

Content

  7 Machine Learning System Design

    7.1 Prioritizing What to Work On 

    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 Score

    7.4 Data for machine learning

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.)

很難說上述的哪一種方式最有效,而且每一種方式往往需要花費很多時間去研究調查。

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)來保證偏差較小,然后使用大量的訓練集來大大減弱過擬合(方差較小),從而達到訓練出一個在測試集上誤差較小的,泛化能力強的模型。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com