6. 學習模型的評估與選擇
Content
6. 學習模型的評估與選擇
6.1 如何調試學習算法
6.2 評估假設函數(Evaluating a hypothesis)
6.3 模型選擇與訓練/驗證/測試集(Model selection and training/validation/test sets)
6.4 偏差與方差
6.4.1 Diagnosing bias vs. variance.
6.4.2 正則化與偏差/方差(Regularization and bias/variance)
6.5 學習曲線(Learning Curves)
6.6 調試學習算法
我們已經學習了許多有用的學習模型(線性回歸,Logistic回歸,神經網絡),但是當要解決一個實際問題時,以下問題是我們要考慮的:
-
如何知道我們所設計的模型是有用的或者較好的?
-
當模型應用的不理想時,我們應該從哪些方面進行改進?
-
如何針對具體問題選擇學習模型?
下面將針對上述問題提出建議。
6.1 如何調試學習算法
現在假設我們已經實現了如下的一個正則化的線性回歸模型用於預測房價
根據已有的訓練集,我們已經將該模型訓練完畢。但是,當我們需要在新的數據集上進行房價的預測時,發現預測的結果和實際有很大的誤差。下面我們應該做什么?我們可以從下面的一些角度考慮:
-
獲取更多的數據量
- 有時數據量大並沒有幫助
-
通常數據量越大,學習模型訓練得越好,但是即使這樣,也應該做一些初步實驗(見6.5節 學習曲線)來確保數據量越大,訓練越好。(如果一開始就用大量的數據來訓練模型,將會耗費大量的時間:收集數據,訓練模型)
-
減少特征量
-
細心的從已有的特征量中選出一個子集
-
可以手工選擇,也可以用一些降維( dimensionality reduction)技術
-
-
增加額外的特征量
-
有時並不起作用
-
仔細考慮數據集,是否遺漏了一些重要的特征量(可能花費較多的時間)
-
添加的特征量可能只是訓練集的特征,不適合全體數據集,可能會過擬合
-
-
添加多項式的特征量
-
減少正則化參數
-
增加正則化參數
可以發現,我們似乎有很多種方法來改善學習模型,但是,有些方法可能要花費很多時間(或許還不起作用),有些方法可能是矛盾的。所以,需要一種方式來給我們指明方向:到底應該采用哪種或哪些方式來優化模型。我們將這種方式稱為機器學習診斷(Machine Learning Diagnostics)。機器學習診斷是一種測試法,能夠深入了解某種算法到底是否有用。這通常也能夠告訴我們,要想改進一種算法的效果,什么樣的嘗試才是有意義的,從而節省時間,減少不必要的嘗試。
6.2 評估假設函數(Evaluating a hypothesis)
當我們確定學習算法的參數的時候,我們考慮的是選擇使訓練誤差最小化的參數。但我們已經知道(見3.1 underfitting and overfitting ),僅僅是因為這個假設具有很小的訓練誤差,並不能說明它就一定是一個好的假設函數,可能該假設函數會過擬合,泛化能力弱。
該如何判斷一個假設函數是過擬合的呢?對於簡單的例子,可以對假設函數 h(x) 進行畫圖 然后觀察圖形趨勢。但是,特征量較多時(大於2),畫圖就很難實現。因此,我們需要另一種方法來評估我們的假設函數。如下給出了一種評估假設函數的標准方法:
假設我們有這樣一組數據組(如圖6-1),我們要做的是將這些數據分成兩部分: 訓練集和測試集。一種典型的分割方法是按照7:3的比例,將70%的數據作為訓練集,30%的數據作為測試集。這里默認原有數據集是無序的(隨機的),所以我們選擇前70%作為訓練集,后30%作為測試集,但如果原數據集是有序的,我們應該隨機選擇出7:3的數據集分別作為訓練集和測試集。
圖6-1 大小為10的數據集及其划分
因此,典型的訓練和測試方案如下:
-
用70%划分得到的訓練集來訓練模型:即最小化J(θ)
-
計算訓練后的模型在測試集上的誤差( test set error)。
其中Jtest(θ) 為測試集上的平均平方誤差(average square error),mtest為測試集的大小。
如果我們使用線性回歸,test set error 則為
另一種定義Logistics回歸的誤差是誤分類率(misclassification error)或稱0/1錯分率(0/1 misclassification).
-
定義error function
-
Test error is
6.3 模型選擇與訓練/驗證/測試集(Model selection and training/validation/test sets)
如何選擇正則化參數的大小和多項式的次數是常常面臨的問題,稱之為模型選擇問題。我們已經多次接觸到過擬合現象,在過擬合的情況中,參數非常擬合訓練集,那么模型對於相同數據組預測集的預測誤差不能夠用來推廣到一般情況的,即是不能作為實際的泛化誤差。也就是不能說明你的假設對於新樣本的效果。
下面我們來考慮模型選擇問題,假如要選擇能最好地擬合數據的多項式次數,具體地,我們在次數為1到10之間應該如何做出選擇。
d表示應該選擇的多項式次數。所以,似乎除了要確定的參數θ之外,我們同樣需要用數據集來確定這個多項式的次數d。
- d =1 (linear)
- d=2 (quadratic)
- ...
- d=10
那么我們可以這樣做:
-
選擇第一個模型(d = 1),然后求訓練誤差的最小值,得到一個參數向量θ 1
-
選擇第二個模型(d = 2), 二次函數模型, 進行同樣的過程, 得到另一個參數向量θ 2
以此類推,最后得到θ10
接下來對所有這些模型,求出測試集誤差
- Jtest(θ1)
- Jtest(θ2)
- ...
- Jtest(θ10)
接下來為了確定選擇哪一個模型最好,即哪一個對應的測試集誤差最小。對於這個例子,我們假設最終選擇了五次多項式模型。
確定模型后,現在我們想知道,這個模型能不能很好地推廣到新樣本。我們可以觀察這個五次多項式假設模型對測試集的擬合情況,但這里有一個問題是:這樣做仍然不能公平地說明,我的假設推廣到一般時的效果。其原因在於,我們剛才是使用的測試集和假設擬合來得到的多項式次數d 這個參數,這也就是說,我們選擇了一個能夠最好地擬合測試集的參數d的值。因此,我們的參數向量θ5在擬合測試集時的結果很可能導致一個比實際泛化誤差更完美的預測結果。換言之,我們是找了一個最能擬合測試集的參數d,因此我再用測試集來評價我們的模型就顯得不公平了。
為了解決這一問題,在模型選擇中,如果我們想要評價某個假設,我們通常采用以下的方法:給定某個數據集,和剛才將數據分為訓練和測試集不同的是,我們要將其分為三段:
- 訓練集 Training set (60%) - m values
- 交叉檢驗集 Cross validation (CV) set (20%)mcv
- 測試集 Test set (20%) mtest
我們隨之也可以定義訓練誤差,交叉驗證誤差和測試誤差如下:
因此,我們按如下方式選擇模型:
1. Minimize cost function for each of the models as before
2. Test these hypothesis on the cross validation set to generate the cross validation error
3. Pick the hypothesis with the lowest cross validation error. e.g. pick θ5
4. Finally,Estimate generalization error of model using the test set
值得注意的是,在如今的機器學習應用中, 也有很多人是用測試集來選擇模型, 然后又同樣的測試集來評價模型的表現報告測試誤差,看起來好像還能得到比較不錯的泛化誤差。如果有很多很多測試集的話,這也許還能行得通,否則得到的測試誤差很大程度要比實際的泛化誤差好。因此最佳做法還是把數據分成訓練集、驗證集、測試集。
6.4 偏差與方差
6.4.1 Diagnosing bias vs. variance
如圖6-2,當運行一個學習算法時,如果這個算法的表現不理想,那么多半是出現兩種情況,要么是偏差比較大(欠擬合),要么是方差比較大(過擬合),能判斷出現的情況是這兩種情況中的哪一種非常重要,因為它是一個很有效的指示器,告訴我們可以改進算法的最有效的方法和途徑。
圖6-2 不同模型的擬合情況
現在我們已經掌握了訓練集,驗證集和測試集的概念。我們就能更好地理解偏差和方差的問題。具體來說,我們沿用之前所使用的訓練集誤差和驗證集誤差的定義也就是平方誤差,畫出圖6-3.
圖6-3 多項式次數與誤差的關系
d等於1是用線性函數來進行擬合,而在最右邊的這個圖表示更高次數的多項式的擬合情況。隨着我們增大多項式的次數,我們將對訓練集擬合得越來越好,所以如果d等於1時 對應着一個比較大的訓練誤差,而如果我們的多項式次數很高時 我們的訓練誤差就會很小 甚至可能等於0 因為可能非常擬合訓練集。所以,當我們增大多項式次數時,我們不難發現訓練誤差明顯下降。
接下來我們再看交叉驗證誤差,如果d等於1,意味着用一個很簡單的函數來擬合數據,此時我們不能很好地擬合訓練集(欠擬合),我們會得到一個較大的交叉驗證誤差,而如果我們用一個中等大小的多項式次數來擬合時,如d等於2,那么我們會得到一個更小的交叉驗證誤差,因為我們找了一個能夠更好擬合數據的次數。但是,如果次數d太大,比如說d的值取為4 ,那么我們又過擬合了,我們又會得到一個較大的交叉驗證誤差。
具體來說 假設我們得出了一個學習算法,而這個算法並沒有表現地如期望那么好,我們應該判斷此時的學習算法是正處於高偏差的問題還是高方差的問題。
-
當訓練誤差和交叉驗證誤差相近且都比較大時,即對應圖6-3曲線中的左端,對應的就是高偏差的問題
-
相反地,當訓練誤差較小而交叉驗證誤差遠大於訓練誤差時,即對應圖6-3曲線右端,對應的是高方差的問題
6.4.2 正則化與偏差/方差(Regularization and bias/variance )
我們知道,算法正則化可以有效地防止過擬合。但正則化跟算法的偏差和方差又有什么關系呢?對於如下正則化的線性回歸模型
我們分析以下三種情形:
-
第一種情形是正則化參數λ取一個比較大的值,如等於10000,此時,所有這些參數θ將被大大懲罰,其結果是這些參數的值將近似等於0 並且假設模型 h(x) 的值將等於或者近似等於
。因此我們最終得到的假設函數應該近似是一條平滑的直線(如圖6-4-(1)),因此這個假設處於高偏差,對數據集欠擬合(underfit)。
-
與之對應的另一種情況是λ值很小,比如λ=0,這種情況下,如果我們要擬合一個高階多項式,通常會處於高方差和過擬合(overfitting)的情況(如圖6-4-(3))。因為λ的值等於0相當於沒有正則化項 因此會對假設過擬合。
-
如圖6-4-(2),只有λ取不大不小的值時,才會得到一組對數據剛好擬合的參數值θ。
圖6-4 不同λ取值的擬合情況
現在我們可以按照如下方式選擇出一個最合適的正則化參數 λ:
- 確定λ可能的取值向量,通常為[0,0.01,0.02,0.04,0.08,… ,10.24]
- 每一個λ的可能取值對應一個模型,對每一個模型進行訓練,使代價函數
最小,得到對應的參數θ。
- 對於每個訓練后的模型,計算出其在交叉檢驗集上的誤差
- 取使
最小的模型作為我們的模型,並將其應用於測試集,得到測試誤差
,並以此估計泛化誤差。
其中:
與多項式次數與誤差類似,我們可以畫出λ與誤差的函數關系,如圖6-5所示
圖6-5 λ與誤差的關系
6.5 學習曲線(Learning Curves)
有時我們需要檢查學習算法運行是否一切正常,或者希望改進算法的表現或效果,那么學習曲線(Learning Curves)就是一種很好的工具。並且,我們可以使用學習曲線來判斷某一個學習算法是否處於偏差,方差問題或是二者皆有。下面我們就來介紹學習曲線。
學習曲線和圖6-5類似,它們的區別在於學習曲線是以訓練集的大小m為橫坐標。縱坐標仍然是訓練集誤差Jtrain和交叉檢驗誤差Jcv。
一般情況下的學習曲線如圖6-7所示:
-
對於訓練集誤差而言,m越小,越容易擬合,誤差越小,換言之,J train隨m的增大而增大。
-
對於交叉檢驗誤差而言,m越小,模型的泛化能力越弱,故誤差越大,換言之,J cv隨m的增大而減小。
-
當m大到一定程度時,訓練集誤差和交叉檢驗誤差較接近且都比較小。
圖6-7 一般情況下的學習曲線
當學習算法是高偏差時,如圖6-8所示,此時:
-
對於訓練集誤差而言,當m很小時,誤差很小,但由於它不能很好的擬合訓練集,隨后就會增長較快,達到一個較穩定的值。
-
對於交叉檢驗誤差而言,當m很小時,算法的泛化能力非常弱,誤差很大,隨着m的增加,泛化能力稍有提升,誤差會有所減小,但由於學習算法本身對訓練集誤差較大,故交叉檢驗誤差不會下降太多,最后穩定在一個較高的值。
-
在m不太大時,訓練集誤差就和交叉檢驗誤差接近,但都比較大。
所以,在高偏差的情況下,增大訓練集往往不起作用。
圖6-8 高偏差時的學習曲線
當學習算法是高方差時,如圖6-9所示,此時:
-
對於訓練集誤差而言,當m很小時,誤差很小,並且由於算法能很好的擬合訓練集(過擬合),隨着m的增加,誤差只有少量增加(增加很慢)。
-
對於交叉檢驗誤差而言,當m很小時,算法的泛化能力非常弱,誤差很大,隨着m的增加,泛化能力稍有提升,誤差會有所減小,但由於學習算法過擬合,泛化能力有限,故交叉檢驗誤差不會下降太多,最后穩定在一個較高的值。
-
在m較大時,訓練集誤差和交叉檢驗誤差也有一定的差距,此時訓練集誤差較小,而交叉檢驗集誤差較大。
所以,在高方差的情況下,增大訓練集通常是有效的(減少過擬合)。
圖6-9 高方差時的學習曲線
6.6 調試學習算法
經過了上面的分析,現在我們對調試學習算法的策略進行總結
-
Get more training examples --> helps to fix high variance
-
Not good if you have high bias
-
-
Smaller set of features --> fixes high variance (overfitting)
-
Not good if you have high bias
-
-
Try adding additional features --> fixes high bias (because hypothesis is too simple, make hypothesis more specific)
-
Add polynomial terms --> fixes high bias problem
-
Decreasing λ --> fixes high bias
-
Increases λ --> fixes high variance
對於神經網絡而言,我們需要針對不同的問題設計不同的網絡結構,通常從下面兩種角度考慮:
-
選擇一個較小的網絡
-
較少的隱藏層(如1層)和較少的隱藏單元,適用於變量(特征量)較少的情況
-
可能欠擬合,但計算代價較小
-
-
選擇一個較大的網絡
-
更多的隱藏層-需要我們決定具體是多少層較好
-
適用於變量較多的情況,
-
可能會過擬合,需要使用正則化來削弱過擬合
-
計算代價更大
-
通常而言,選擇一層隱藏層或許是比較好的選擇。當然,在應用神經網路時也應將已有數據集划分為訓練集,交叉檢驗集和測試集。