注
:正则化是用来防止过拟合的方法。在最开始学习机器学习的课程时,只是觉得这个方法就像某种魔法一样非常神奇的改变了模型的参数。但是一直也无法对其基本原理有一个透彻、直观的理解。直到最近再次接触到这个概念,经过一番苦思冥想后终于有了我自己的理解。
线性回归很简单,用线性函数拟合数据,用 mean square error (mse) 计算损失(cost),然后用梯度下降法找到一组使 mse 最小的权重。
lasso 回归和岭回归(ridge regression)其实就是在标准线性回归的基础上分别加入 L1 和 L2 正则化(regularization)。
本文的重点是解释为什么 L1 正则化会比 L2 正则化让线性回归的权重更加稀疏,即使得线性回归中很多权重为 0,而不是接近 0。或者说,为什么 L1 正则化(lasso)可以进行 feature selection,而 L2 正则化(ridge)不行。
岭回归
就是带有正则化的回归。
带有正则化的线性回归-Ridge的API:sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0) 具有 l 2 l_2 l2 正则化的线性最小二乘法
alpha
: 正则化力度 (λ也表示正则化力度 )
coef_
: 回归系数
正则化力度对权重有什么影响呢?看下面官网给的一张图。
正则化力度越大(右到左),模型越来越简单。所以正则化对权重的影响为:正则化力度越来越大,权重越来越趋近于0。
岭回归进行房价预测如下:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.metrics import mean_squared_error
# 1获取数据
lb = load_boston()
# 2分割数据为训练集合测试集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# 3进行标准化处理,特征值和目标值都必须进行标准化处理
std1 = StandardScaler()
x_train = std1.fit_transform(x_train)
x_test = std1.transform(x_test)
# 目标值标准化
std2 = StandardScaler()
y_train = std2.fit_transform(y_train.reshape(-1, 1))
y_test = std2.transform(y_test.reshape(-1, 1))
# 4.estimator估计器测试
# 4.3岭回归求解预测
rd = Ridge()
# 输入数据一直不断用训练数据建立模型
rd.fit(x_train, y_train)
print("岭回归系数为", rd.coef_)
# 预测测试集房子价格
y_rdPredict = rd.predict(x_test)
y_rdPredict = std2.inverse_transform(y_rdPredict)
print("sgd测试集每个样本的预测价格:", y_rdPredict)
print("梯度下降均方根误差", mean_squared_error(std2.inverse_transform(y_test), y_rdPredict))
输出为:
In[2]: runfile('E:/09-code/06-Turbulent_flow_spectrum/test/test1.py', wdir='E:/09-code/06-Turbulent_flow_spectrum/test')
岭回归系数为 [[-0.11548147 0.14449317 0.01528829 0.08927949 -0.23691287 0.22893065
0.04618857 -0.3680326 0.30615914 -0.19857008 -0.23237951 0.11767539
-0.47189179]]
sgd测试集每个样本的预测价格: [[21.3501014 ]
[15.9881228 ]
[12.75299688]
[24.90261784]
……
[14.74345117]
[23.01862931]]
梯度下降均方根误差 21.856498106333305
线性回归 LinearRegression与Ridge对比:
相同
:
不同
:
feature selection
,而 ridge 不行。或者说,lasso 更容易使得权重变为 0,而 ridge 更容易使得权重接近 0。也许会有个疑问,线性回归还会有过拟合问题?
加入 L1
或 L2
正则化,让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。
可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什幺影响,一种流行的说法是『抗扰动能力强』。具体参见博客 浅议过拟合现象(overfitting)以及正则化技术原理。
[1] https://www.cnblogs.com/wuliytTaotao/p/10837533.html ;
[2] https://www.cnblogs.com/Belter/p/8536939.html ;
[3] https://blog.csdn.net/weixin_43786255/article/details/100568133;