岭回归和Lasso回归
0.前提概述
线性回归的一般形式,损失函数又叫代价函数,是用来评判一个模型的好坏的。任何能够衡量模型预测出来的值 与真实值 之间的差异的函数都可以叫做代价函数。

线性回归中可能遇到的问题:
- 求解损失函数的最小值有两种方法:梯度下降法以及正规方程。

- 特征缩放:即对特征数据进行归一化操作,进行特征缩放的好处有两点,一是能够提升模型的收敛速度,因为如果特征间的数据相差级别较大的话,以两个特征为例,以这两个特征为横纵坐标绘制等高线图,绘制出来是扁平状的椭圆,这时候通过梯度下降法寻找梯度方向最终将走垂直于等高线的之字形路线,迭代速度变慢。但是如果对特征进行归一化操作之后,整个等高线图将呈现圆形,梯度的方向是指向圆心的,迭代速度远远大于前者。二是能够提升模型精度。
- 学习率α的选取:如果学习率α选取过小,会导致迭代次数变多,收敛速度变慢;学习率α选取过大,有可能会跳过最优解,最终导致根本无法收敛。
过拟合问题及其解决方法
- 丢弃一些对我们最终预测结果影响不大的特征,具体哪些特征需要丢弃可以通过PCA算法来实现;
- 使用正则化技术,保留所有特征,但是减少特征前面的参数θ的大小,具体就是修改线性回归中的损失函数形式即可,岭回归以及Lasso回归就是这么做的。
1.岭回归和Lasso回归:
岭回归与Lasso回归的出现是为了解决线性回归出现的过拟合以及在通过正规方程方法求解θ的过程中出现的x转置乘以x不可逆这两类问题的,这两种回归均通过在损失函数中引入正则化项来达到目的,具体三者的损失函数对比见下图:

岭回归(ridge regression)
岭回归其实就是在标准线性回归的基础上加入L2 正则化(regularization),L2约束就是一个圆,要求的就是在约束的条件下寻找最小的损失。所以其实就是找约束的图形和等值线的交点。
ridge 更容易使得权重接近 0,但由于交点在坐标轴(某维度值为零)的概率较小,所以没有让参数稀疏化的作用,但可以让参数变小,减缓过拟合。
Lasso(最小绝对收缩和选择算子)
Lasso是以缩小变量集(降阶)为思想的压缩估计方法。它通过构造一个惩罚函数,可以将变量的系数进行压缩并使某些回归系数变为0,进而达到变量选择的目的。
lasso回归其实就是在标准线性回归的基础上加入L1 正则化(regularization),而L1损失的交点更容易在坐标轴上,所以更容易让参数稀疏化正是由于 lasso 容易使得部分权重取 0,所以可以用其做 feature selection,lasso 的名字就指出了它是一个 selection operator。权重为 0 的 feature 对回归问题没有贡献,直接去掉权重为 0 的 feature,模型的输出值不变。
2.小结
岭回归与Lasso回归最大的区别在于岭回归引入的是L2范数惩罚项,Lasso回归引入的是L1范数惩罚项,Lasso回归能够使得损失函数中的许多θ均变成0,这点要优于岭回归,因为岭回归是要所有的θ均存在的,这样计算量Lasso回归将远远小于岭回归。
Lasso回归最终会趋于一条直线,原因就在于好多θ值已经均为0,而岭回归却有一定平滑度,因为所有的θ值均存在。
3.代码实现
# 导入波士顿房价的数据集 from sklearn.datasets import load_boston #导入分割,标准化,均方误差和R^2 from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score #对数据集进行处理 Boston_Price = load_boston() # 对数据集分割为训练集和测试集 x_train,x_test,y_train,y_test = train_test_split(Boston_Price.data, Boston_Price.target, test_size = 0.2) # 对数据进行标准化处理处理,消除量纲对结果的影响 std_x = StandardScaler() x_train = std_x.fit_transform(x_train) x_test = std_x.transform(x_test) std_y = StandardScaler() y_train = std_y.fit_transform(y_train.reshape(-1,1)) #reshape(-1,1)是为了将数据转化为列向量 y_test = std_y.fit_transform(y_test.reshape(-1,1)) #使用岭回归进行预测 #from sklearn.linear_model import Ridge from sklearn.linear_model import RidgeCV # RidgeCV可以自动选择alpha # rd = Ridge(alpha=1.0) rd = RidgeCV() rd.fit(x_train,y_train) y_rd_predict = rd.predict(x_test) y_rd_predict = std_y.inverse_transform(y_rd_predict) #使用Lasso回归进行预测 from sklearn.linear_model import LassoCV #from sklearn.linear_model import Lasso #LassoCV能自动选择alpha值 ls = LassoCV() ls.fit(x_train,y_train) y_ls_predict = ls.predict(x_test) y_ls_predict = std_y.inverse_transform(y_ls_predict) print("岭回归的MSE是: ",mean_squared_error(std_y.inverse_transform(y_test),y_rd_predict)) print("岭回归的R^2是: ",r2_score(std_y.inverse_transform(y_test),y_rd_predict)) print("Lasso回归的MSE是: ",mean_squared_error(std_y.inverse_transform(y_test),y_ls_predict)) print("Lasso回归的R^2是: ",r2_score(std_y.inverse_transform(y_test),y_ls_predict))
参考链接:https://blog.csdn.net/hzw19920329/article/details/77200475
https://blog.csdn.net/u010986753/article/details/105911767

浙公网安备 33010602011771号