機器學習“傻瓜式”理解(11)模型泛化

上一節我們瞭解到,我們在機器學習領域要解決的主要問題便是高方差的問題,主要的解決的辦法便是模型泛化,其功能的概括來說便是通過限制超參數的大小,來解決過擬合或者模型含有巨大的方差誤差這樣的問題。

嶺迴歸(Ridge Regression)

嶺迴歸也是模型正則化一種方式,通過加入模型正則化的方式來更好的解決模型過擬合的線性的產生。
目標函數
根數數學的常識,我們擬合住的模型的上下抖動的幅度主要受參數的影響,因此以多項式迴歸爲例,我們加入的模型正則化正好可以平衡這一部分。
加入的模型正則化爲:
在這裏圖片描述
解釋:上面的阿爾法其實便是我們引入的超參數,主要的作用就是用來平衡新的目標損失函數的大小。如果阿爾法等於0,那麼就相當於我們沒有引入模型正則化,但是如果阿爾法等於無窮,相應地,爲了平衡損失函數的大小,我們需要進行使得我們的theta的平方儘可能的小纔可以。
實例查看
模擬數據集進行查看:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

np.random.seed(666)
x = np.random.uniform(-3,3,size = 100)
X = x.reshape(-1,1)
y = 0.5 * x + 3. + np.random.normal(0, 1, size=100)

X_train,X_test,y_train,y_test = train_test_split(X,y)

plt.scatter(x,y)
plt.show()

散點圖顯示:
在這裏插入圖片描述
使用嶺迴歸以及多項式管道進行調參,來查看模型的泛化能力。
首先封裝一個擬合住的模型曲線:

# 繪製模型曲線
def plot_curve(model):
    X_plot = np.linspace(-3,3,100).reshape(-1,1)
    y_plot = model.predict(X_plot)

    plt.scatter(x,y)
    plt.plot(X_plot[:,0],y_plot,color='r')
    plt.axis([-3,3,0,6])
    plt.show()

使用管道的方式

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge

def ridgeRegression(degree,alpha):
	return Pipeline([
		('poly',PolynomialFeatures(degree=degree)),
		('std',StandardScaler()),
		('ridge',Ridge(alpha=alpha))
	])

分情況討論:degree=20,a = 0.0001

ridge1_reg = RidgeRegression(20, 0.0001)
ridge1_reg.fit(X_train, y_train)

y1_predict = ridge1_reg.predict(X_test)
mean_squared_error(y_test, y1_predict)
# 輸出:1.323349275406402(均方誤差)

plot_model(ridge1_reg)

在這裏插入圖片描述分情況討論:degree=20,a= 1

ridge2_reg = RidgeRegression(20, 1)
ridge2_reg.fit(X_train, y_train)

y2_predict = ridge2_reg.predict(X_test)
mean_squared_error(y_test, y2_predict)
# 輸出:1.1888759304218448(均方誤差)

plot_model(ridge2_reg)

在這裏插入圖片描述
分情況討論:degree=20、alpha=1000000(相當於無窮大)

ridge4_reg = RidgeRegression(20, 1000000)
ridge4_reg.fit(X_train, y_train)

y4_predict = ridge4_reg.predict(X_test)
mean_squared_error(y_test, y4_predict)
# 輸出:1.8404103153255003

plot_model(ridge4_reg)

在這裏插入圖片描述
通過上圖可以看出,當阿爾法無限大的時候,只有後面的模型正則化在起着作用,因爲爲了平衡,theta必須無限接近於0

LASSO迴歸

LASSO迴歸與嶺迴歸相同,其主要的目的是主要是解決模型的過擬合問題或者模型含有巨大的方差的問題。
對於LASSO迴歸的實現原理,與嶺迴歸實現的原理相同,只不過特殊點在於添加的代數式不同。
在這裏插入圖片描述
後續的實驗與前面的嶺迴歸實現的步驟相同,只需要將Ridge處修改爲Lasso.並且超參數還是degree和alpha。
LASSO的特點: 趨向於使得一部分theta的值變爲0,也就是說Lasso認爲theta等於0的特徵是完全沒有用的,因此我們可以使用Lasso做特徵選擇用,但是有些時候也會導致不準確,如果我們想要追求準確程度,ridge迴歸更合適。

L1 & L2 & 彈性網絡

由上面所講的,兩種迴歸的方式都用於解決模型的過擬合或者模型過度複雜的問題,但是通過下面的圖片,我們可以知道很多東西背後的數學原理都是想通的。
在這裏插入圖片描述
因此,我們變引出了兩種正則:
在這裏插入圖片描述
但是兩種正則項互有利弊,於是彈性網絡提出,它綜合了兩種正則項。
在這裏插入圖片描述
r是新添加的一個超參數,用來平衡兩個正則項之間的比例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章