出現過擬合時,使用正則化可以將模型的擬合程度降低一點點,使曲線變得緩和。
L1正則化(LASSO)
正則項是所有參數的絕對值的和。正則化不包含theta0,因爲他只是偏置,而不影響曲線的擺動幅度。
# 使用pipeline進行封裝
from sklearn.linear_model import Lasso
# 使用管道封裝lasso
def LassoRegssion(degree, alpha):
return Pipeline([
("poly", PolynomialFeatures(degree = degree)),
("std_scaler", StandardScaler()),
("lasso", Lasso(alpha=alpha))
])
使用 的正則化擬合20階多項式
lasso_reg = LassoRegssion(20, 0.01)
lasso_reg.fit(X_train, y_train)
y_predict = lasso_reg.predict(X_test)
plot_model(lasso_reg)
MSE 1.149608084325997
MSE 1.1213911351818648
時,均方誤差又變大了,正則化過度了。模型變成了直線,所有參數都接近0了。因爲沒有對進行正則化,所以偏置的值沒有變化
1.8408939659515595
L2正則化(嶺迴歸)
1/2可加可不加,因爲方便求導。對J()求最小值時,也將的值變小。當越大,右邊受到的影響就越大,的值就越小
使用pipeline封裝Ridge
from sklearn.linear_model import Ridge
# 使用管道封裝嶺迴歸
def RidgeRegression(degree, alpha):
return Pipeline([
("poly", PolynomialFeatures(degree = degree)),
("std_scaler", StandardScaler()),
("ridge_reg", Ridge(alpha = alpha))
])
使用20階多項式擬合,即沒有正則化。
ridge_reg100 = RidgeRegression(20, 0)
ridge_reg100.fit(X_train, y_train)
y_predict = ridge_reg100.predict(X_test)
plot_model(ridge_reg100)
# MSE 167.94010860994555
ridge_reg100 = RidgeRegression(20, 0.0001)
# MSE 1.3233492754136291
ridge_reg100 = RidgeRegression(20, 10)
# MSE 1.1451272194878865
ridge_reg100 = RidgeRegression(20, 10000)
# MSE 1.7967435583384
對比
- LASSO更趨向於將一部分參數變爲0,更容易得到直線。Ridge更容易得到曲線。
- 越大,正則化的效果越明顯
兩個正則化的不同僅僅在於正則化項的不同:
常見的對比還有:
MSE 和 MAE :
歐拉距離和曼哈頓距離:
還有明可夫斯基距離:
彈性網(待定)
就是將兩個範式進行結合。