原文:https://share.coursera.org/wiki/index.php/ML:Advice_for_Applying_Machine_Learning
面對一個機器學習問題,我們提取好特徵,挑選好訓練集,選擇一種機器學習算法,然後學習預測得到了第一步結果。然而我們不幸地發現,在測試集上的準確率低得離譜,誤差高得嚇人,要提高準確率、減少誤差的話,下一步該做些什麼呢?
可以採用以下的方法來減少預測的誤差:
- 獲得更多的訓練樣本
- 減少特徵的數量
- 增加特徵的數量
- 使用多項式特徵
- 增大或減小正則化參數
λ
但不要盲目在這些可行的方法裏隨便選一種來提升模型,需要用一些診斷模型的技術來幫助我們選擇使用哪種策略。
1.評估假設
即使模型假設對於訓練集的誤差很低,若存在過擬合,模型的預測也同樣會不準確。
給定一份訓練集,我們可以將數據分成兩部分:訓練集和測試集。
- 使用訓練集最小化
J(Θ) 得到Θ 參數 - 計算測試集的誤差:
3.計算分類錯誤率(即0/1分類錯誤率)
測試集的平均誤差爲:
也就是測試集上分類錯誤的樣本的比例。
2.模型選擇與訓練/驗證/測試集
- 學習算法若僅僅對訓練集擬合較好,並不能說明其假設也是好的。
- 訓練集上的假設誤差通常要比其他數據集上得到的誤差要小。
爲了在假設上選擇模型,可以測試模型的多項式的次數來觀察誤差結果。
無驗證集
- 對不同的多項式次數的模型通過訓練集得到最優化參數
Θ 。 - 找到在預測集上誤差最小的模型的多項式次數
d 。 - 使用測試集估計泛化誤差
Jtest(Θ(d)) 。
在這個例子中,我們用測試集訓練得到的一個變量,即多項式次數
爲了解決這個問題,我們引入了第三種數據集,即交叉驗證集(Cross Validation Set),來作爲選擇
例如,將數據集分成三份:
- 訓練集:60%
- 交叉驗證集:20%
- 測試集:20%
對於這三個數據集我們可以計算三個不同誤差值:
有驗證集
- 對不同的多項式次數的模型通過訓練集得到最優化參數
Θ 。 - 找到在驗證集上誤差最小的模型的多項式次數
d 。 - 使用測試集估計泛化誤差
Jtest(Θ(d)) 。
使用驗證集則避免了使用測試集來確定多項式次數
3.診斷偏差 Vs. 方差
我們來討論一下多項式次數
- 我們需要區分導致預測結果差的原因是偏差還是方差。
- 高偏差也就是欠擬合,高方差也就是過擬合。我們需要在這兩者之間找到一個黃金分割。
隨着多項式次數
同時,交叉驗證集的誤差會隨着
-
高偏差(欠擬合):
Jtrain(Θ) 和JCV(Θ) 都較高,並且JCV(Θ)≈Jtrain(Θ) 。 -
高方差(過擬合):
Jtrain(Θ) 較低,且JCV(Θ) 比Jtrain(Θ) 高得多。
可以用下圖來表示:
4.正則化和偏差/方差
下面來分析正則化參數
λ 較大:高偏差(欠擬合)λ 不大不小:正好λ 較小:高方差(過擬合)
較大的
-
λ 較小:Jtrain(Θ) 較低,且JCV(Θ) 較高(高方差/過擬合)。 -
λ 不大不小:Jtrain(Θ) 和JCV(Θ) 都較低,並且JCV(Θ)≈Jtrain(Θ) 。 -
λ 較大:Jtrain(Θ) 和JCV(Θ) 都較高(高偏差/欠擬合)。
下圖說明了
爲了選擇模型和正則化參數
- 列出
λ 測試的值,比如λ∈{0,0.01,0.02,0.04,0.08,0.16,0.32,0.64,1.28,2.56,5.12,10.24} ; - 選擇一個
λ 的值進行計算; - 創建模型集,比如按照多項式次數或其他指標來創建;
- 選擇一個模型來學習
Θ 值; -
用所選的模型學習得到
Θ 值,使用選擇的λ 值計算Jtrain(Θ) (爲下一步學習參數Θ ); -
使用學習(帶
λ )得到的參數Θ 計算不帶正則項或是λ=0 的訓練誤差Jtrain(Θ) ; -
使用學習(帶
λ )得到的參數Θ 計算不帶正則項或是λ=0 的交叉驗證誤差JCV(Θ) ; - 對模型集合所有
λ 取值重複上述步驟,選擇使交叉驗證集誤差最小的組合; -
如果需要使用圖形化結果來幫助決策的話,可以繪製
λ 和Jtrain(Θ) 的圖像,以及λ 和JCV(Θ) 的圖像; -
使用最好的
Θ 和λ 組合,在測試集上進行預測計算Jtest(Θ) 的值來驗證模型對問題是否有好的泛化能力。 - 爲了幫助選擇最好的多項式次數和
λ 的值,可以採用學習曲線來診斷。
5.學習曲線
訓練3個樣本很容易得到0誤差,因爲我們永遠可以找到一條二次曲線完全經過3個點。
- 當訓練集越來越大時,二次函數的誤差也會增加。
- 誤差值會在訓練集大小m增加到一定程度後慢慢平緩。
高偏差的情況
- 小訓練集:
Jtrain(Θ) 較低,$J_{CV}(\Theta)較高。 - 大訓練集:
Jtrain(Θ) 和JCV(Θ)都較高,並且 J_{train}(\Theta) \approx J_{CV}(\Theta)$。
如果學習算法有高偏差的問題,那麼獲取更多的訓練數據並不會有很多改進。
對於高方差的問題,對於訓練集大小有如下關係:
高方差的情況
- 小訓練集:
Jtrain(Θ) 較低,$J_{CV}(\Theta)較高。 - 大訓練集:
Jtrain(Θ) 會略微增加,JCV(Θ)會略微降低,並且 J_{train}(\Theta) < J_{CV}(\Theta)$。
如果學習算法有高方差的問題,那麼獲取更多的訓練數據是有用的。
下圖展示了訓練集大小和高偏差/高方差問題之間的關係。
6.再次考慮如何選擇提升模型的下一步
決策過程可以分解成以下幾點:
- 獲得更多的訓練樣本
- 解決高方差
- 減少特徵的數量
- 解決高方差
- 增加特徵的數量
- 解決高偏差
- 使用多項式特徵
- 解決高偏差
- 增加正則參數
λ - 解決高偏差
- 減少正則參數
λ - 解決高方差
7.診斷神經網絡
- 參數較少的神經網絡很容易欠擬合,但同時計算也較容易。
- 參數較多的大型神經網絡更容易過擬合,但同時計算量較大。在這種情況下可以使用正則化(增加
λ )來避免過擬合問題。
使用單個隱藏層是一個較好地開始默認設置。你可以使用驗證集在多個隱藏層上訓練神經網絡。
8.模型選擇總結
以下是機器學習診斷的一些總結
- 選擇多項式次數M
- 如何選擇模型中得參數
Θ (即模型選擇)
有3種方式解決:
- 獲取更多數據(非常困難)
- 選擇擬合數據最好且沒有過擬合的模型(非常困難)
- 通過正則化來減少過擬合的機會
偏差:近似誤差(預測值和期望值之間的差值)
- 高偏差 = 欠擬合(BU)
Jtrain(Θ) 和JCV(Θ)都較高,並且 J_{train}(\Theta) \approx J_{CV}(\Theta)$
方差:有限數據集之間的估計誤差值
- 高方差 = 過擬合(VO)
Jtrain(Θ) 較低,並且Jtrain(Θ)<<JCV(Θ)
偏差-方差權衡的直覺
- 複雜模型=>數據敏感=>受訓練集X變化的影響=>高方差,低偏差
- 簡單模型=>更死板=>不受訓練集X變化的影響=>低方差,高偏差
機器學習的最重要的目標之一:找到一個模型在偏差-方差的權衡之間剛剛好。
正則化影響
λ 值較小(過擬合)使模型容易受噪聲影響,導致高方差。λ 值較大(欠擬合)會將參數值接近於0,導致高偏差。
模型複雜度影響
- 多項式次數較低的模型(模型複雜度低)有高偏差和低方差。在這種情況下,模型擬合總是很差。
- 多項式次數較高的模型(模型複雜度高)擬合訓練集極好,擬合測試集極差。導致訓練集上低偏差,但高方差。
- 在現實中,我們想要選擇一個模型在以上兩種情況之間,既然可以很好地擬合數據,也有很好地泛化能力。
使用診斷時的一些典型經驗法則
- 獲取更多地訓練樣本可以解決高方差問題,不能解決高偏差問題。
- 減少特徵數量可以解決高方差問題,不能解決高偏差問題。
- 增加特徵數量可以解決高偏差問題,不能解決高方差問題。
- 增加多項式特徵和交互特徵(特徵和特徵交互)解決高偏差問題,不能解決高方差問題。
- 當使用梯度下降時,減少正則化參數
λ 值可以解決高方差問題,增加λ 值可以解決高偏差問題。 - 當使用神經網絡時,小型神經網絡更容易欠擬合,大型神經網絡更容易過擬合。交叉驗證是選擇神經網絡大小的一種方式。
參考: