以我們前面講述的線性回歸為例,比如我們在訓(xùn)練集上訓(xùn)練出最優(yōu)的模型,但是當(dāng)我們將其使用到測試集時(shí),測試的誤差很大,我們該怎么辦??
我們一般采取的措施主要包括以下6種:
增加訓(xùn)練樣本的數(shù)目(該方法適用于過擬合現(xiàn)象時(shí),解決高方差。一般都是有效的,但是代價(jià)較大,如果下面的方法有效,可以優(yōu)先采用下面的方式);
嘗試減少特征的數(shù)量(該方法適用于過擬合現(xiàn)象時(shí),解決高方差);
嘗試獲得更多的特征(該方法適用于欠擬合現(xiàn)象時(shí),解決高偏差);
嘗試增加多項(xiàng)式特征(該方法適用于欠擬合現(xiàn)象時(shí),解決高偏差);
嘗試減小正則化程度λ(該方法適用于欠擬合現(xiàn)象時(shí),解決高偏差);
嘗試增加正則化程度λ(該方法適用于過擬合現(xiàn)象時(shí),解決高方差);
上面的方法不是隨機(jī)選擇,是在合適的情況下(過擬合和欠擬合)選擇合適的方法,對于怎么判斷一個(gè)模型是過擬合還是欠擬合,我們會(huì)在下面給出一些機(jī)器學(xué)習(xí)診斷法。
如何對一個(gè)假設(shè)進(jìn)行評估??
我們前面在講述線性回歸和邏輯回歸時(shí),只是注重針對訓(xùn)練數(shù)據(jù)集訓(xùn)練出一個(gè)最優(yōu)的參數(shù),但是我們訓(xùn)練處的模型對于測試集的性能好壞我們沒有進(jìn)行判斷,我們只是訓(xùn)練的模型使得損失函數(shù)最小,我們前面也討論過,在訓(xùn)練數(shù)據(jù)集上損失函數(shù)最小并不能代表對于給定的測試數(shù)據(jù),測試數(shù)據(jù)的評估非常準(zhǔn)確,比如過擬合現(xiàn)象發(fā)生時(shí),那我們?nèi)绾卧u價(jià)一個(gè)假設(shè)的好壞呢??
主要的方法包括兩種:?
1.對于簡答的模型,我們可以采用將hθ(x)的圖像畫出,來判斷模型的好壞,但是這種方法對于特征變量不是一個(gè)時(shí),這種方法很難實(shí)現(xiàn)或者不可能實(shí)現(xiàn)。例如我們曾經(jīng)看到過這樣的圖像,可以通過hθ(x)的圖像明顯可以看出,該假設(shè)存在著過擬合現(xiàn)象。?
2.另一種評估假設(shè)的方法為:將原來的數(shù)據(jù)集分為訓(xùn)練集和測試集,一般我們是從原來的數(shù)據(jù)集中隨機(jī)選取(保證訓(xùn)練集和測試集中都含有各種類型的數(shù)據(jù))70%的數(shù)據(jù)作為訓(xùn)練集,剩下的30%的樣本作為測試集。同時(shí)這種將原來數(shù)據(jù)集劃分為訓(xùn)練集和測試集的方法可以用于幫助特征選擇、多項(xiàng)式次數(shù)的選擇以及正則化參數(shù)的選擇等。數(shù)據(jù)集劃分的過程如下:?
以上面數(shù)據(jù)集為例,選取前7個(gè)為訓(xùn)練集,后3個(gè)為測試集。用前7個(gè)數(shù)據(jù)集做訓(xùn)練訓(xùn)練出一個(gè)最優(yōu)的模型,評價(jià)這個(gè)訓(xùn)練出的模型的好壞可以使用測試集來進(jìn)行判斷,判斷的標(biāo)準(zhǔn)可以使用測試集的損失函數(shù)來進(jìn)行定量的衡量。?
對于回歸問題,測試集的損失函數(shù)計(jì)算公式如下:?
Jtest(θ)=12mtest∑i=1mtest(hθ(x(i)test)?y(i)test)2
而對于分類問題,測試集的損失函數(shù)計(jì)算公式如下:?
這種測量方式,如果測試樣本損失函數(shù)很大,則代表訓(xùn)練出的模型泛化能力不好。?
對于分類問題,還有另外一種測量的方式,稱為誤分類率,它對于每一個(gè)測試樣本進(jìn)行計(jì)算,計(jì)算的公式如下:?
error=1mtest∑i=1mtesterr(hθ(x(i)test),y(i)))
其中,?
模型的選擇和交叉驗(yàn)證集:?
上述我們是在模型選擇好了之后進(jìn)行訓(xùn)練的,也就是上述我們都是確定了假設(shè)進(jìn)行訓(xùn)練的,但是我們怎么對模型進(jìn)行選擇呢,這一節(jié)我們來討論一下模型的選擇,以及和交叉驗(yàn)證集的關(guān)系。?
模型選擇主要包括以下內(nèi)容:1.怎樣選擇正確的特征來構(gòu)造學(xué)習(xí)算法?2.怎樣選擇學(xué)習(xí)算法中正則化參數(shù)λ?等問題。?
首先我們結(jié)合一個(gè)例子來引出模型的選擇和驗(yàn)證集:?
例如我們有上面十個(gè)模型,我們對于給定的數(shù)據(jù)集選擇哪種模型呢?按照我們上面討論的將數(shù)據(jù)集劃分為訓(xùn)練集和測試集,使用訓(xùn)練集對上述模型進(jìn)行訓(xùn)練,然后使用測試集來進(jìn)行選擇最佳的模型,比如最優(yōu)的為第五個(gè)模型,但是這并不能衡量這個(gè)模型的泛化能力,因?yàn)闇y試集已經(jīng)用于選擇最優(yōu)的模型,這個(gè)模型對于其他未知數(shù)據(jù)的泛化能力還是未知的。?
所以針對上述問題我們可以將數(shù)據(jù)集劃分為訓(xùn)練集、交叉驗(yàn)證集和測試集。一般情況下,訓(xùn)練集占總樣本的60%,交叉驗(yàn)證集占20%,測試集占20%。其中訓(xùn)練集用于訓(xùn)練,交叉驗(yàn)證集用于選擇最優(yōu)的模型,測試集用于測試模型的泛化能力。?
模型選擇方法為:?
1. 使用訓(xùn)練集訓(xùn)練10個(gè)模型;?
2. 用10個(gè)模型分別對交叉驗(yàn)證集計(jì)算出交叉驗(yàn)證誤差(代價(jià)函數(shù)的值),其中計(jì)算公式為:?
3. 選取交叉驗(yàn)證誤差最小的模型作為選擇的模型;?
4. 用測試集對選擇出的模型計(jì)算泛化能力(測試樣本的損失函數(shù)),計(jì)算公式如上文中討論的一樣。
假設(shè)對診斷偏差和方差(即過擬合還是欠擬合)的影響?
利用上述方法學(xué)習(xí)到的算法性能不好一般會(huì)有兩種情況:?
1.會(huì)出現(xiàn)過擬合,也就是所謂的方差很大;?
2.會(huì)出現(xiàn)欠擬合,也就是所謂的偏差很大;?
首先應(yīng)該確定算法性能的不好,是由哪種原因造成的,然后針對不同的情況采取不同的改進(jìn)策略,可以有效的改進(jìn)當(dāng)前的算法。下面我們來講述一下怎么判斷是過擬合還是欠擬合。?
以下面例子為例,來進(jìn)行討論:?
我們可以通過繪制出訓(xùn)練集的代價(jià)函數(shù)和交叉驗(yàn)證驗(yàn)證集的代價(jià)函數(shù)與方次d的關(guān)系來進(jìn)行判斷是上述哪種情況的一種:?
對于訓(xùn)練集,當(dāng)d較小時(shí),模型的擬合程度不是很好,所以訓(xùn)練樣本集的代價(jià)函數(shù)比較大;隨著d的增加,模型的擬合程度不斷提高,代價(jià)函數(shù)不斷的減小;?
對于交叉驗(yàn)證集,由于d比較小時(shí),模型的擬合程度不是很好,對于新來的樣本預(yù)測結(jié)果會(huì)偏差很大,所以交叉驗(yàn)證集的代價(jià)函數(shù)在初始階段會(huì)很大,而隨著d的增加會(huì)出現(xiàn)一個(gè)比較好的方次d,使得模型的擬合程度最佳,同時(shí)對于新來的樣本泛化能力很強(qiáng),所以會(huì)有一個(gè)代價(jià)函數(shù)最小的點(diǎn)出現(xiàn)(該轉(zhuǎn)折點(diǎn)即是模型開始由欠擬合轉(zhuǎn)向過擬合的點(diǎn)),隨后隨著d的增加,由于過擬合,會(huì)存在對新的樣本預(yù)測結(jié)果不良的現(xiàn)象,所以代價(jià)函數(shù)會(huì)逐漸增大。?
當(dāng)我們繪制出上述曲線時(shí),我們就可以判斷出什么時(shí)候是過擬合什么時(shí)候欠擬合,判斷的標(biāo)準(zhǔn)如下:?
1. 當(dāng)訓(xùn)練誤差與交叉驗(yàn)證集誤差接近時(shí),并且都很大時(shí),該模型高偏差(欠擬合);?
2. 當(dāng)訓(xùn)練誤差遠(yuǎn)小于驗(yàn)證集誤差時(shí),并且訓(xùn)練誤差很小時(shí),該模型高方差(過擬合)。?
判斷出該模型是過擬合或者欠擬合之后,然后使用上述提到的過擬合和欠擬合的解決方法,對算法進(jìn)行改進(jìn)。
正則化對偏差和方差的影響?
我們前面講述過正則化可以有效的處理過擬合現(xiàn)象,但是我們上述所說的處理過擬合是在合適的λ情況下,那么λ值的大小對模型的性能是怎樣影響的呢?我們采用上述與方次d對性能的影響相同的方式來分析λ的值對性能的影響。?
我們首先選擇一系列的λ值,通常λ的選擇是0~10之間呈現(xiàn)二倍關(guān)系的值(如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,5.26,5.12,10)?
構(gòu)建方式如下:?
選擇λ的方法如下:?
1.使用訓(xùn)練集訓(xùn)練處12個(gè)不同程度正則化模型;?
2.用12個(gè)模型分別對交叉驗(yàn)證集計(jì)算出交叉驗(yàn)證誤差;?
3.選擇得出交叉驗(yàn)證誤差最小的模型;?
4.運(yùn)用步驟3選出的模型對測試集計(jì)算得出推廣誤差
我們同樣可以將訓(xùn)練集和交叉驗(yàn)證集模型的代價(jià)函數(shù)與λ的值繪制在一張圖上。對于訓(xùn)練集、驗(yàn)證集和測試集的代價(jià)函數(shù)計(jì)算公式為:?
需要注意的是,當(dāng)計(jì)算訓(xùn)練集、交叉驗(yàn)證集和測試集誤差時(shí),不計(jì)算正則項(xiàng),然后繪制出訓(xùn)練集和交叉驗(yàn)證集代價(jià)函數(shù)與λ值的關(guān)系,如下圖所示:?
1. 當(dāng)λ較小時(shí),訓(xùn)練誤差較小(過擬合)而交叉驗(yàn)證集誤差較大;?
2. 隨著λ的增加(從過擬合到欠擬合的過程),訓(xùn)練集誤差逐漸增大(欠擬合),而交叉驗(yàn)證集誤差則是先減小后增大。
學(xué)習(xí)曲線?
學(xué)習(xí)曲線也是一種可以判斷算法是否處于過擬合還是欠擬合的情況,學(xué)習(xí)曲線是將訓(xùn)練集誤差和交叉驗(yàn)證集誤差作為訓(xùn)練集實(shí)例數(shù)量(m)的函數(shù)繪制的圖像。學(xué)習(xí)曲先不僅可以幫助我們是不是處于過擬合或者欠擬合,它還可以幫助我們判斷是否為了提高算法的性能需要我們收集多的數(shù)據(jù)。?
假設(shè)我們有100行數(shù)據(jù),我們從第一行數(shù)據(jù)開始,逐漸增加數(shù)據(jù)進(jìn)行訓(xùn)練,得到每次訓(xùn)練數(shù)據(jù)的代價(jià)函數(shù)值。當(dāng)數(shù)據(jù)很少時(shí),訓(xùn)練模型能夠非常完美的擬合很少的數(shù)據(jù),但是訓(xùn)練出的模型卻不能泛化其他的數(shù)據(jù),所以當(dāng)數(shù)據(jù)很少時(shí),訓(xùn)練集的代價(jià)函數(shù)很小,但是交叉驗(yàn)證集的代價(jià)函數(shù)很大,隨著樣本的增加,訓(xùn)練集的代價(jià)函數(shù)逐漸增大,交叉驗(yàn)證集的代價(jià)函數(shù)逐漸減小。繪制的曲線如下圖所示:?
1. 如何用學(xué)習(xí)曲線識別欠擬合:?
假設(shè)我們的模型處于欠擬合的情況下,擬合曲線如下圖所示:?
我們可以看出,無論我們怎樣增加樣本數(shù)據(jù),誤差都不會(huì)有很大改觀。同時(shí)在欠擬合的情況下,會(huì)出現(xiàn)隨著樣本的增加,訓(xùn)練集代價(jià)函數(shù)和交叉驗(yàn)證集代價(jià)函數(shù)都很大的情況,在這種情況下,就沒有必要花費(fèi)時(shí)間在收集數(shù)據(jù)上了,同時(shí)這也是一種判斷模型是過擬合還是欠擬合的方法。?
2. 如何使用學(xué)習(xí)曲線識別過擬合:?
假設(shè)我們有一個(gè)非常高次的多項(xiàng)式模型(比如最高次項(xiàng)達(dá)到100次),并且正則化非常小時(shí),從下圖可以看出,當(dāng)交叉驗(yàn)證集誤差遠(yuǎn)大于訓(xùn)練集誤差時(shí),往訓(xùn)練集增加更多數(shù)據(jù)可以提高模型的效果。?
對于過擬合現(xiàn)象時(shí),會(huì)出現(xiàn)訓(xùn)練集代價(jià)函數(shù)一直都很小(雖然是增加的趨勢),但是驗(yàn)證集的損失函數(shù)會(huì)很大(雖然是減小的趨勢),同時(shí)訓(xùn)練集代價(jià)函數(shù)和驗(yàn)證集代價(jià)函數(shù)相差會(huì)很大,可以使用這種方法來判斷該模型處于過擬合階段。
對于神經(jīng)網(wǎng)絡(luò)我們在討論一下過擬合和欠擬合現(xiàn)象:?
使用較小的神經(jīng)網(wǎng)絡(luò),類似于參數(shù)較少的情況,容易導(dǎo)致高偏差和欠擬合,但是計(jì)算代價(jià)小;使用較大的神經(jīng)網(wǎng)絡(luò),類似于參數(shù)較多的情況,容易導(dǎo)致高方差和過擬合,雖然計(jì)算代價(jià)比較大,但是可以通過正則化手段來調(diào)整而更加適應(yīng)數(shù)據(jù)。?
對于神經(jīng)網(wǎng)絡(luò)的模型選擇:我們一般選擇較大的神經(jīng)網(wǎng)絡(luò)并采用正則化處理,而不會(huì)選擇較小的神經(jīng)網(wǎng)絡(luò)。?
對于神經(jīng)網(wǎng)絡(luò)隱藏層的層數(shù)選擇,一般我們從一層開始逐漸增加層數(shù),為了更好的選擇出最佳的層數(shù),可以針對不同隱藏層層數(shù)的神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,然后選擇交叉驗(yàn)證集代價(jià)函數(shù)最小的神經(jīng)網(wǎng)絡(luò)。