我們前面提到過,降低方差的方法有模型正則化,此方法也是最重要提供模型泛化能力方法。我們今天瞭解L1和L2兩種正則化方法。用到正則化的算法有Lasso迴歸、嶺迴歸、支持向量機等。
一、模型正則化概念
模型正則化(Regularization),對學習算法的修改,限制參數的大小,減少泛化誤差而不是訓練誤差。
在使用比較複雜的模型,去擬合數據時,很容易出現過擬合現象(訓練集表現很好,測試集表現較差),這會導致模型的泛化能力下降,這時候,我們就需要使用正則化,降低模型的複雜度。
正則化的策略包括:約束和懲罰被設計爲編碼特定類型的先驗知識 偏好簡單模型其他形式的正則化,如:集成的方法,即結合多個假說解釋訓練數據。
二、L1正則化
L1正則化,就是在目標函數中加了L1範數這一項。使用L1正則化的迴歸模型叫做LASSO迴歸(Least Absolute Shrinkage and Selection Operator Regression)。
數學原理就是:若模型過擬合,參數θ就會非常大。爲了限制參數θ,我們改變損失函數,加入模型正則化。使儘可能小。
注意:
①、 取值範圍是1~n,即不包含。這是因爲,不是任何一個參數的係數,是截距。反映到圖形上就是反映了曲線的高低,而不決定曲線每一部分的陡峭與緩和。所以模型正則化時不需要。
②、對於超參數係數,在模型正則化的新的損失函數中,要讓每個都儘可能小的程度佔整個優化損失函數程度的多少。即的大小表示優化的側重。
L1正則化可以使得參數稀疏化,即得到的參數是一個稀疏矩陣。因此可以常使用LASSO迴歸做特徵選擇,篩選最重要的特徵。
# 使用Pipeline封裝一個Lasso迴歸方法
def LassoRegression(degree,alpha):
return Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('lasso_reg',Lasso(alpha=alpha))
])
# 我們調整alpha=0.0001,0.1,10 看不同結果
alphas=[0.0001,0.1,10]
for alpha in alphas:
lasso_reg = LassoRegression(30,alpha)
lasso_reg.fit(X_train,y_train)
y1_predict=lasso_reg.predict(X_test)
print(mean_squared_error(y_test,y1_predict))
X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = lasso_reg.predict(X_plot)
plt.scatter(X,y)
plt.plot(X_plot[:,0],y_plot,color='r')
plt.axis([-3,3,0,10])
plt.show()
看效果圖發現,α值適中,模型效果才更佳。
α=0.0001
α=0.01
α=10
三、L2正則化
L2正則化,就是在目標函數中加了L2範數這一項(用平方和來做正則項)。使用L2正則化的迴歸模型叫做嶺迴歸(Ridge Regression)。
數學原理就是:若模型過擬合,參數θ就會非常大。爲了限制參數θ,我們改變損失函數,加入模型正則化。使儘可能小。
將係數壓縮無限接近0,不會等於0;因此,和LASSO迴歸對比,不會生成稀疏矩陣。
# 使用Pipeline封裝一個Lasso迴歸方法
def ridgeregression(degree,alpha):
return Pipeline([
('poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('ridge_reg',Ridge(alpha=alpha))
])
# 我們調整alpha=0.0001,1,1000 看不同結果
alphas=[0.0001,1,1000]
for alpha in alphas:
ridge_reg = ridgeregression(30,alpha)
ridge_reg.fit(X_train,y_train)
y1_predict=ridge_reg.predict(X_test)
print(mean_squared_error(y_test,y1_predict))
X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = ridge_reg.predict(X_plot)
plt.scatter(X,y)
plt.plot(X_plot[:,0],y_plot,color='r')
plt.axis([-3,3,0,10])
plt.show()
看效果圖發現,跟LASSO迴歸一樣,α值適中,模型效果才更佳。
α=0.0001
α=1
α=1000