【Python機器學習】105:機器學習中誤差的來源與正規化

張育晟 Eason Chang
展開數據人生
Published in
6 min readJul 9, 2020

Errors in Machine Learning and Regularization

還記得之前在評估模型的好壞時,MSE是怎麼算的嗎?是要用真實情況(test)的結果去和預測比對,但是我們一直以來都是用validation data,畢竟真正的testing data要等事情已經發生完了,才能事後檢查模型的好壞。

除了MSE,大家還記得機器學習的最終任務嗎?

機器學習的任務:於可及範圍的 H中挑選一個與 f最相似的 h

但是 h 與 f 終究是不同的函數,而我們關心的是 𝑦̂ 與 y 間的差異,差異小的h稱為泛化(Generalization)的能力好

h的誤差可能源於 Training error 與 Test error:

Training error 常被稱為誤差( error or bias)

Test error 亦可被稱為 Generalization error, 亦被稱為泛化誤差,被簡稱為變異( variance)

如果太過度注重 training data,擴增回歸模型的可及範圍H常伴隨 error 降低,但variance提高。因此機器學習的另一非常重要的任務就是要找平衡。我們試著在回歸模型中紀錄不同高次項參數(從1-10次方)對誤差與變異的影響:

回歸模型 fit 完10次了之後,Training error這個list裡會有10筆資料,是X_train丟到模型h裡,預測出來的值(y_pred)和y_train的差距。可以看到隨著次方越來越高,Training error是越來越小的。

接著看Test error:在前幾次分別加入二次項、三次項,error是有往下降一點,但是隨著加入的次方提高,越到後面error開始飆高。這說明如果模型太複雜,即使 training data 丟到模型裡表現很完美,但是一旦丟testing data,模型的預測結果會非常不準。

h在training data的表現和在validation data的表現各別畫出來:

如上圖,隨著次方提高 Training error確實越來越低,但是 Testing error 卻不斷上升。機器學習實務上在找最佳模型的時候,要找兩個error都是低點的時候,單以這個case來說,似乎加入3次項為最好的模型。一旦再加入更高次項到模型裡,即使 Training error 變得非常低,但是 Testing error 已經不知道飆到哪裡去了,這也是所謂的過度配飾(Overfitting),亦即此模型泛化的能力非常的差。

通常會用兩個面向評斷h是不是在所有H中的一個好選擇:

Training error (誤差)是否夠小

Training error 與 Generalization error之間的差異(變異)是否夠小

這兩個面向分別對應到機器學習的挑戰:

Underfitting(配適不足):Training error與Generalization error 均大

任何資料進來,模型都會預測出幾乎一樣的答案。

Overfitting(過度配適):Training error 小,但是 Generalization error大

在模擬的時候,模型都表現的非常好,但是testing data 卻預測得很爛

正規化(Regularization)

正規化指的是在目標函式(成本函式)增加資訊以解決「配適」問題的技巧。

如果我們要降低這些多項式模型的複雜程度,最常見的方式就是限制w,讓W越小越好,甚至變成0。至於如何去限制w,如何讓h在加入更多高次項、特徵時盡可能保持平滑的方法,就是正規化(Regularization)

在原本的成本函數裡加一個抑制數值在後面

在原本的MSE公式後面加上一個 λ 乘上w向量的平方。λ又叫做懲罰係數,如果我的模型變的太複雜,w太大,整個MSE就會變得非常大,因此懲罰係數就是來抑制w的大小。

誤差與變異的平衡是由使用者來拿捏!!!

具備正規化的Normal equations:

給定 X_train, y_train 與 λ=0 利用 Normal equarions with Regularization 求w:

由於模型設定為3次方,因此會輸出4個w

由於 X_train 的shape是m*n,X_train的轉置矩陣的shape是n*m,兩者相乘後的大小為n*n,因此相加的單位矩陣的shape也要是n*n。

比對之後發現即便使用 Normal equations with Regularization 求w,在 λ=0 的情況下跟 sklearn.model.LinearRegression 得到的結果相同,意即沒有正規化。

如果連Linear Regression()都想要捨棄掉,可以改用 Scikit-Learn 中的sklearn.linear_model.Ridge:

當 𝛼=0 與原本的 Normal Equation 解相同:

𝛼 愈大表示「正規化」程度愈高,意味著對 𝑤 的抑制愈大:

𝛼=1000 時:

不同的 𝛼 與其所對應的誤差、變異:

感謝你閱讀完這篇文章,如果你覺得這些文章對你有幫助請在底下幫我拍個手(長按最多可以拍50下手)。

上一章:【Python機器學習】104:如何處理加入類別變數的回歸模型

下一章:【Python機器學習】106:使用梯度遞減尋找最佳解的相關演算法

--

--

張育晟 Eason Chang
展開數據人生

在不斷變動中努力思索自己的定位,想做的事情很多,但最希望的是不要變成無趣的人。 Linkedin: https://www.linkedin.com/in/stareason1997