Advice for applying machine learning
本周主要學習如何提升算法效率,以及如何判斷學習算法在什么時候表現的很糟糕和如何debug我們的學習算法。為了讓學習算法表現更好,我們還會學習如何解決處理偏態數據(skewed data)。
以下內容部分參考我愛公開課-Advice for applying machine learning
一、內容概要
- Evaluating a learning algorithm
- Deciding what to try next(決定接下來該試着做什么)
- Evaluating a Hypothesis (評估假設)
- Model Selection and Train/Validation/Test sets (模型選擇和訓練/驗證/測試集划分)
- Bias vs. Variance
- Diagnosing(診斷) Bias vs. Variance
- Regularization and Bias/Variance
- Learning Curves(學習曲線)
- Deciding what to do next Revisited
- Buiding a Spam Classifier
- Priorizing what to work on
- Error Analysis
- Handling Skewed Data(處理偏斜數據)
- Error Metrics for Skewed Classes(不對稱分類的錯誤評估)
- Trading Off Precision and Recall(精度與召回率的權衡)
- Using Large Data Sets
- Data For Machine Learning
二、重點&難點
1. Evaluating a Learning Algorithm
1) Deciding what to try next
一般來說我們訓練學習算法遇到瓶頸的時候一般會從下面幾種方法中選擇一種或幾種改進方法,但是隨意選擇一個可能會浪費我們的時間,所以接下來將會介紹Machine Learning Diagnostic來幫助我們選擇更好的改進措施。

2)Evaluating a Hypothesis
這個其實就是將原來的訓練數據集認為的再次分為Training set (70%)和Testing Set (30%),先對Training set 進行訓練得到權重,然后將權重帶入Testing Set ,最后算出誤差testError,從而來判斷學習算法的准確度。
testError的計算方法依計算類型不同而不同:

3)Model Selection and Train/Validation/Test Sets
上面提到了檢查testError來判斷假設的准確度,但是並不是誤差越小,假設就越准確。
所以進一步優化的方法是將原來的數據划分為
- Training Set(占60%左右)
- Cross validation Set(20%)
- Testing Set(20%)

下面開始進行模型選擇,我們事先假設右下圖10個多項式(d表示多項式的最高項次冪數)。
-
- 以Training Set為數據計算出10個不同的\(h_θ(x)\)的θ參數
-
- 將上一步中求出的θ參數分別代入驗證數據集,並找出誤差最小的一項,假設是\(θ^{(4)}\)
-
- 最后將\(θ^{(4)}\)帶入測試集,評估最后的整體誤差
2. Bias vs. Variance
1) Diagnosing(診斷) Bias vs. Variance
首先要能區分bias和variance的區別,祭上神圖:

上圖很好的詮釋了二者的區別,更具體的可參見機器學習中的Bias(偏差),Error(誤差),和Variance(方差)有什么區別和聯系?
高偏差(high bias):\(J_{train}(θ)\)和\(J_{CV}(θ)\)都很大,並且二者的值接近
高方差(high variance):\(J_{train}(θ)\)小, \(J_{CV}(θ)\)遠大於\(J_{train}(θ)\)
示意圖如下:

2) Regularization and Bias/Variance
對於過擬合問題,正則化是個非常有效的解決方案,下面是一個之前提到過的正則化線性回歸的例子:
但是如何選擇λ的值呢?this is a question!方法和上面的模式選擇類似(見下圖)

然后可以畫出如下的關於λ的偏差、方差圖

總結一下步驟就是:
- 1.創建一組λ的值,如λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24});
- 2.創建一組不同degrees的\(h_θ(x)\),即x的最高次冪不同
- 3.for λs in λ:
for hs in h:
學習得到一組θ - 4.計算\(J_{CV}(θ)\)
- 5.選取驗證集誤差最小的一組參數
- 6.將上面求得的最佳θ和λ代入測試集求出\(J_{test}(θ)\)
3) Learning Curves
- 高偏差欠擬合問題的學習曲線:

我們發現,如果一個學習算法是高偏差的,那么它的訓練誤差和驗證集誤差在一定的訓練樣本數目之后都很高,而且不會隨着樣本數目的增大而改變,所以對於高偏差欠擬合的問題,增加訓練樣本數目不是一個好的解決辦法
- 高方差過擬合問題的學習曲線:

我們發現,如果一個學習算法是高方差的,那么它的訓練誤差和驗證集誤差在一定的訓練樣本數目之后雖然有差異,但是會隨着樣本數目的增大而減小她們之間的gap,所以對於高方差過擬合的問題,增加訓練樣本數目是解決方法之一。
4) Deciding what to do next Revisited
好了,說完了這么多與偏差/方差有關的問題,我們再次回到本章的開頭的問題,
假設你實現了一個正則化的線性回歸算法來預測房價,然而當你用它來測試一批新的房屋數據時,發現預測出來的數據是很不准確的,那么,下一步你該干啥?以下這些選項,分別針對的是高方差或高偏差的問題,你可以嘗試用上述小節的一些方法來診斷你的學習算法,不過對於下述選項,需要你考慮一下是針對高偏差還是方差的問題,可以先思考一分鍾再看答案:
-
獲取更多的訓練樣本
-
嘗試使用更少的特征的集合
-
嘗試獲得其他特征
-
嘗試添加多項組合特征
-
嘗試減小 λ
-
嘗試增加 λ
答案:
-
獲取更多的訓練樣本 - 解決高方差
-
嘗試使用更少的特征的集合 - 解決高方差
-
嘗試獲得其他特征 - 解決高偏差
-
嘗試添加多項組合特征 - 解決高偏差
-
嘗試減小 λ - 解決高偏差
-
嘗試增加 λ -解決高方差
3. Buiding a Spam Classifier
略,詳情參考Coursera公開課筆記: 斯坦福大學機器學習第十一課“機器學習系統設計(Machine learning system design)”
4.Handling Skewed Data
1) Error Metrics for Skewed Classes
什么是不對稱性分類(Skewed Classes)?
以癌症預測或者分類為例,我們訓練了一個邏輯回歸模型\(h_θ(x)\). 如果是癌症,y = 1, 其他則 y = 0。
我們將訓練得到的模型運用到測試集上發現這個模型的錯誤率僅為1%(99%都分正確了),看起來貌似是一個非常好的結果?
但假如僅有0.5%的病人得了癌症。這個時候如果我們不用任何學習算法,對於測試集中的所有人都預測y = 0,即沒有癌症,那么這個預測方法的錯誤率僅為0.5%,比我們廢好大力訓練的邏輯回歸模型的還要好。這就是一個不對稱分類的例子,對於這樣的例子,僅僅考慮錯誤率是有風險的。
現在我們就來考慮一種標准的衡量方法:Precision/Recall(精確度和召回率)
首先對正例和負例做如下的定義:

True Positive (真正例, TP)被模型預測為正的正樣本;可以稱作判斷為真的正確率
True Negative(真負例 , TN)被模型預測為負的負樣本 ;可以稱作判斷為假的正確率
False Positive (假正例, FP)被模型預測為正的負樣本;可以稱作誤報率
False Negative(假負例 , FN)被模型預測為負的正樣本;可以稱作漏報率
True/False: 指的是我們的算法預測分類的正負性
Postive/Negative: 指數據真實分類的正負性
計算公式如下:

例題:

計算可得
Precision:預測中實際得癌症的病人數量(真正例)除以我們預測的得癌症的病人數量
Recall-預測中實際得癌症的病人數量(真正例)除以實際得癌症的病人數量
不妨舉這樣一個例子:某池塘有1400條鯉魚,300只蝦,300只鱉。現在以捕鯉魚為目的。撒一大網,逮着了700條鯉魚,200只蝦,100只鱉。那么,這些指標分別如下:
正確率 = 700 / (700 + 200 + 100) = 70%
召回率 = 700 / 1400 = 50%
F值 = 70% * 50% * 2 / (70% + 50%) = 58.3%
不妨看看如果把池子里的所有的鯉魚、蝦和鱉都一網打盡,這些指標又有何變化:
正確率 = 1400 / (1400 + 300 + 300) = 70%
召回率 = 1400 / 1400 = 100%
F值 = 70% * 100% * 2 / (70% + 100%) = 82.35%
由此可見,正確率是評估捕獲的成果中目標成果所占得比例;召回率,顧名思義,就是從關注領域中,召回目標類別的比例;而F值,則是綜合這二者指標的評估指標,用於綜合反映整體的指標。
作者:祁鑫
鏈接:https://www.zhihu.com/question/19645541/answer/39732647
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
2) Trading Off Precision and Recall(精度與召回率的權衡)
有了Precision和Recall這兩個指標可以幫助我們很直觀的看到我們的模型的效果如何,但是當兩個指標一大一小時我們該如何評判呢?例如
- Precision1 = 0.85, Recall1 = 0.4
- Precision2 = 0.36, Recall2 = 0.90
這個時候再怎么評判呢?
首先我們假設已經訓練得到了邏輯回歸模型\(h_θ(x)\),,一種通常的判斷正負類的方法是設定一個閾值,一般為0.5,即
- \(h_θ(x)≥0.5 ,則y=1\)
- \(h_θ(x)<0.5 ,則y=0\)
很顯然我們知道閾值的大小的設定可以調節Precision和Recall,例如 - 當我們將閾值設為0.9,那么會導致高精度,低召回率(Higher precision, lower recall)
- 當我們將閾值設為0.3,那么會導致高召回率,低精確度(Higher recall, lower precision)
這些問題,可以歸結到一張Precision Recall曲線,簡稱PR-Curve:

你可能會想到用 (Precision+Recall)/2(即二者的均值)來作為評價的指標,下面我們來舉個例子看看這樣行不行
| 算法 | Precision | Recall | (Precision+Recall)/2 |
|---|---|---|---|
| 算法1 | 0.5 | 0.4 | 0.45 |
| 算法2 | 0.7 | 0.1 | 0.4 |
| 算法3 | 0.02 | 1.0 | 0.51 |
按照上面的標准,算法3是最好的,但的確如此嗎?直覺看上去算法一比較起來應該是最好的,雖然效果並不是特別理想。
現在我們引入標准的F值或者F1-score:
| 算法 | Precision | Recall | \(2\frac{P·R}{P+R}\) |
|---|---|---|---|
| 算法1 | 0.5 | 0.4 | 0.44 |
| 算法2 | 0.7 | 0.1 | 0.175 |
| 算法3 | 0.02 | 1.0 | 0.039 |
現在看來的確是算法1要優秀一些。
F值是對精確度和召回率的一個很好的權衡,兩種極端的情況也能很好的平衡:
- P=0 或 R=0時,F1 = 0
- P=1 且 R=1時,F1 = 1
5.Using Large Data Sets
1) Data For Machine Learning
這小節舉了個實際的例子,就是有人用好幾種不同的算法來預測同一個事件,在數據不是很大的時候准確率會有明顯的差別,但是當數據足夠大的時候,他們之間的准確率幾乎是相等的,所以說大數據是很重要的。
