• 定义:限制参数的大小
  • [x] 作用:解决过拟合

    1.回顾多元线性回归

    1.1 建模过程

    image.png
    08 模型正则化 - 图2

  • [x] 目标:使08 模型正则化 - 图3尽可能小。

即找到08 模型正则化 - 图4,使得08 模型正则化 - 图5尽可能小。

1.2 MSE

Root Mean Squared Errod 均方根误差
08 模型正则化 - 图6
这里换一种写法
08 模型正则化 - 图7

2.岭回归

2.1 原理

岭回归是模型正则化的一种方式。
目标:使08 模型正则化 - 图8 尽可能小。
08 模型正则化 - 图9这个式子考虑了08 模型正则化 - 图10的影响,08 模型正则化 - 图11如果越大,要让整个式子越小,08 模型正则化 - 图12就应该越小

所以,新的08 模型正则化 - 图13要同时考虑方差和08 模型正则化 - 图14两个因素,这样就能做到平衡。

  • 方差:过拟合,08 模型正则化 - 图15偏大
  • 模型正则化:新的08 模型正则化 - 图16越小,08 模型正则化 - 图17越小

    2.2 编码

    2.2.1 准备数据

    ```python import numpy as np import matplotlib.pyplot as plt

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

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

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12405790/1639821683034-327f0ff1-77a0-4d04-a7d2-bb3959228c2e.png#clientId=udb1a98dd-80ee-4&from=paste&id=ua0dd822e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=252&originWidth=366&originalType=url&ratio=1&size=6297&status=done&style=none&taskId=ua8f891a7-4a55-4b59-955a-a5a32c2230a)
  2. <a name="hGZO7"></a>
  3. ### 2.2.2 多项式建模
  4. ```python
  5. from sklearn.pipeline import Pipeline
  6. from sklearn.preprocessing import PolynomialFeatures
  7. from sklearn.preprocessing import StandardScaler
  8. from sklearn.linear_model import LinearRegression
  9. # 分割数据
  10. from sklearn.model_selection import train_test_split
  11. np.random.seed(666)
  12. X_train, X_test, y_train, y_test = train_test_split(X, y)
  13. # 多项式参数配置
  14. def PolynomialRegression(degree):
  15. return Pipeline([
  16. ("poly", PolynomialFeatures(degree=degree)),
  17. ("std_scaler", StandardScaler()),
  18. ("lin_reg", LinearRegression())
  19. ])
  20. # 建模
  21. from sklearn.metrics import mean_squared_error
  22. poly_reg = PolynomialRegression(degree=20)
  23. poly_reg.fit(X_train, y_train)
  24. y_poly_predict = poly_reg.predict(X_test)
  25. # 衡量MSE
  26. mean_squared_error(y_test, y_poly_predict) # 167.94010866878617
  27. # 预测
  28. X_plot = np.linspace(-3, 3, 100).reshape(100, 1)
  29. y_plot = poly_reg.predict(X_plot)
  30. plt.scatter(x, y)
  31. plt.plot(X_plot[:,0], y_plot, color='r')
  32. plt.axis([-3, 3, 0, 6])
  33. plt.show()

image.png

image.png

2.2.3 使用岭回归

  1. from sklearn.linear_model import Ridge
  2. def RidgeRegression(degree, alpha):
  3. return Pipeline([
  4. ("poly", PolynomialFeatures(degree=degree)),
  5. ("std_scaler", StandardScaler()),
  6. ("ridge_reg", Ridge(alpha=alpha))
  7. ])
  8. ridge1_reg = RidgeRegression(20, 0.0001)
  9. ridge1_reg.fit(X_train, y_train)
  10. y1_predict = ridge1_reg.predict(X_test)
  11. mean_squared_error(y_test, y1_predict) # 1.3233492754151852
  12. plot_model(ridge1_reg)

image.png

  1. # 修改alpha值
  2. ridge2_reg = RidgeRegression(20, 1)
  3. ridge2_reg.fit(X_train, y_train)
  4. y2_predict = ridge2_reg.predict(X_test)
  5. mean_squared_error(y_test, y2_predict) # 1.1888759304218448
  6. plot_model(ridge2_reg)

image.png

  1. # 修改alpha值
  2. ridge3_reg = RidgeRegression(20, 100)
  3. ridge3_reg.fit(X_train, y_train)
  4. y3_predict = ridge3_reg.predict(X_test)
  5. mean_squared_error(y_test, y3_predict) # 1.31964561130862
  6. plot_model(ridge3_reg)

image.png

  1. # 修改alpha值
  2. ridge4_reg = RidgeRegression(20, 10000000)
  3. ridge4_reg.fit(X_train, y_train)
  4. y4_predict = ridge4_reg.predict(X_test)
  5. mean_squared_error(y_test, y4_predict) # 1.8408455590998372
  6. plot_model(ridge4_reg)

image.png
08 模型正则化 - 图24值越大,模型的过拟合程度越小。

3. LASSO回归

3.1 原理

Least Absolute Shrinkage and Selection Operator Regression
LASSO回归是模型正则化的一种方式。
目标:使08 模型正则化 - 图25 尽可能小。

3.2 编码

  1. from sklearn.linear_model import Lasso
  2. def LassoRegression(degree, alpha):
  3. return Pipeline([
  4. ("poly", PolynomialFeatures(degree=degree)),
  5. ("std_scaler", StandardScaler()),
  6. ("lasso_reg", Lasso(alpha=alpha))
  7. ])
  8. lasso1_reg = LassoRegression(20, 0.01) # 这里的alpha是theta绝对值
  9. lasso1_reg.fit(X_train, y_train)
  10. y1_predict = lasso1_reg.predict(X_test)
  11. mean_squared_error(y_test, y1_predict) # 1.1496080843259968
  12. plot_model(lasso1_reg)

image.png

  1. lasso2_reg = LassoRegression(20, 0.1)
  2. lasso2_reg.fit(X_train, y_train)
  3. y2_predict = lasso2_reg.predict(X_test)
  4. mean_squared_error(y_test, y2_predict) # 1.1213911351818648
  5. plot_model(lasso2_reg)

image.png

  1. lasso3_reg = LassoRegression(20, 1)
  2. lasso3_reg.fit(X_train, y_train)
  3. y3_predict = lasso3_reg.predict(X_test)
  4. mean_squared_error(y_test, y3_predict) # 1.8408939659515595
  5. plot_model(lasso3_reg)

image.png

4.比较Ridge和LASOO

alpha取趋近于无穷,是为了忽略式子前半部分。

岭回归

08 模型正则化 - 图29
image.png

LASOO回归

08 模型正则化 - 图31
image.png
LASSO趋向于使得一部分theta值变为0。所以可作为特征选择用。

5.弹性网

结合了岭回归和LASSO回归的优点
08 模型正则化 - 图33

6.总结

通常情况下,
1.先尝试岭回归

  • 优点是计算是精准的
  • 缺点是特征太大时,计算太大

2.其次尝试弹性网
因为弹性网结合了岭回归LASSO回归的优点

3.LASSO回归

  • 优点:速度快
  • 缺点:急于将某些特征的参数华为0,造成偏差比较大