機器學習入門 8-3 過擬合與欠擬合
- 2019 年 12 月 25 日
- 筆記

本系列是《玩轉機器學習教程》一個整理的影片筆記。通過之前的小節了解了多項式回歸的基本思路,有了多項式就可以很輕鬆的對非線性數據進行擬合,進而求解非線性回歸的問題,但是如果不合理的使用多項式,會引發機器學習領域非常重要的問題過擬合以及欠擬合。
01
均方誤差衡量多項式回歸
測試用的數據集和前幾個小節所創建的數據集是一樣的:
- 創建的數據集具有一個特徵;
- 生成的y和x之間是二次方的關係;



首先還是使用線性回歸來擬合上面的非線性數據集:


最終在非線性的數據集上,線性回歸得到的R方值為0.49,由於沒有像分類精度那種統一的衡量標準,因此在回歸中引入了R方,R方的範圍為[0, 1],因此0.49相對來說還是比較低的,通過R方值也可以看出來,樣本數據x和樣本標記的輸出y之間他們的線性關係是很弱的,所以直接使用這種線性回歸的方式可能並不合適。這種情況下,我們就需要嘗試使用一些擬合非線性數據的方法,而多項式回歸就能擬合非線性數據集。
通過之前小節的學習,知道了多項式回歸的本質只是增加樣本數據的多項式特徵,之後依然使用線性回歸進行擬合,那此時可不可以繼續使用R方來衡量回歸擬合的好壞呢?

其實依然是可以通過R方來進行衡量的。有些人可能會有疑問,因為直接使用線性回歸模型進行回歸分析和添加多項式特徵之後再使用線性回歸,他們之間的方程是不一樣的,相對應的線性回歸係數的個數是不同的,他們處在不同的維度,所以如果此時使用R方來衡量兩個不同方程的線性回歸好壞,是不具有說服力的,但是實際上是可以通過R方這個指標來衡量線性回歸和多項式回歸的。為了避免這種歧義,老師使用了均方誤差指標來衡量數據擬合的結果,這是因為不論是線性回歸還是多項式回歸此時都是對同樣一組數據進行擬合,所以即使使用不同的方法進行擬合得到的均方誤差指標是具有可比性的,同時使用均方誤差作為衡量指標也方便在下一小節繪製學習曲線。

接下來計算線性回歸以及多項式回歸的均方誤差:


在使用多項式的時候創建了一個函數,返回的是Pipeline對象,其實質就是使用Pipeline對多項式進行包裝,在這個Pipeline中多項式回歸分成三個步驟:
- 添加多項式的特徵;
- 由於新添加特徵是多項式,特徵和特徵之間的差距比較大,可能導致梯度下降優化演算法迭代效率低下,因此對添加特徵後的數據進行歸一化操作;
- 最終就是將數據輸入到線性回歸模型中進行訓練;
這裡將添加多項式特徵的PolynomialFeatures對象的參數通過傳入函數中的參數進行指定。
對於上面的非線性數據集使用線性回歸得到的均方誤差值為3.07,而使用多項式回歸得到的均方誤差值為1.09,很顯然使用多項式回歸要比使用線性回歸要好很多。繪製一下原始的數據和擬合的結果:


通過上圖的擬合效果可以看出,degree階數為2的擬合效果非常好,那如果degree傳入其他的值會怎麼樣呢?

2
過擬合和欠擬合
上面介紹當degree值傳入2的時候擬合的效果非常好,接下來給degree傳入不同的值,首先將degree參數設置為10,看看degree為10時候模型的均方誤差是多少?


得到的均方誤差值為1.05,得到的這個值比前面degree設置為2的時候還要好,這就說明將degree傳入10之後,訓練出來的模型對於原始的數據來說,預測結果比degree值為2的效果要好。

接下來,嘗試一下更極端的,將degree設置為100:


計算出來的均方誤差更小了,只有0.68,繪製影像彎曲程度更厲害了。事實上,在degree設置為100的時候,繪製的影像並不是我們計算出來真正的擬合曲線,這是因為繪製出來的曲線,他們只是原有數據點之間對應y的預測值連接出來的結果,有很多地方可能沒有那個數據點,所以連接的結果和原來的曲線不一樣,接下來真正還原一下degree為100的擬合曲線。


這個繪製結果比之前更準確,因為此時的X是在-3到3這個軸之間均勻取值的,所以不會出現兩個點之間相隔太大這樣的情況。通過y軸可以看出來,負的方向到達了-25000這麼多,這個影像其實是看不出來整個擬合曲線是什麼樣子的,所以此時對軸的取值範圍進行一下限定,也就是添加一行限定軸範圍的程式碼。


這就是真正的將degree傳入100之後多項式回歸擬合的結果。

現在就可以簡答的分析一下,很顯然多項式回歸degree傳入的值越高,我們最終的擬合結果會越好,其實道理非常的容易,有這麼多的樣本點,總能找到一根曲線,這根曲線可以將我們所有樣本點都進行擬合,也就是說讓我們的所有樣本點都完全的落在這根曲線上,使得整體均方誤差擬合的誤差值為0,當然如果讓這個擬合的結果為0的話,相應的多項式的次數degree取值一定是非常高的。
前面實驗degree的值設置為2到10再到100,很明顯均方誤差一直在降低。擬合的結果雖然從均方誤差的角度來看更加的好,均方誤差越來越小,但是他真的是一個能夠更好的反映樣本數值走勢相應的曲線嗎?換句話說,我們用了一個非常高維的數據,雖然使得我們擬合所有的點獲得了更小的誤差,但是這根擬合曲線完全不是我們想要的樣子,他為了能夠擬合給定的所有樣本點,變的太過複雜了,這種情況就稱之為過擬合,也就是Overfitting,fit是模型擬合數據的函數,over過渡的擬合了,因此稱之為overfitting。如下圖所示。

最開始使用一根直線來擬合非線性數據,很顯然也沒有反映原始數據的樣本特徵,但是他的問題並不是因為太多複雜,而是太過簡單,這種情況就稱之為欠擬合,相應的應為叫做Underfitting。
我們使用多項式回歸的方式可以非常直觀的解釋過擬合和欠擬合,如果使用二次方程生成原始數據的話,那麼使用一次方程得到擬合的結果顯然就是欠擬合,而我們使用高於二次方擬合的結果,尤其是使用degree為10、100甚至更高的階數進行擬合的話,結果一定是過擬合的。

點贊噢
下一小節會介紹如何識別出過擬合以及欠擬合,還有之前一直使用的train_test_split方法將原始數據集劃分為訓練數據集和測試數據集背後更重要的意義。