LASSO回归与Ridge回归方法及Python实现总结

Posted SSyangguang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LASSO回归与Ridge回归方法及Python实现总结相关的知识,希望对你有一定的参考价值。

LASSO回归与Ridge回归

       在线性回归算法中一般使用普通最小二乘法Ordinary Least Squares进行参数估计,这种方法进行参数估计时依赖于特征的独立性。如果样本的特征相关并且设计矩阵各列近似线性相关时,设计矩阵近似奇异,使用普通的最小二乘法估计模型参数会对观测目标的随机误差高度敏感,参数估计的方差过大,求解出来的模型很不稳定。在具体取值与真实值之间有较大偏差时,有时候会出现与实际意义不符的正负号。线性回归中如果参数过大、特征过多就容易出现过拟合现象,如图所示。给定的数据中往往很有噪声,利用模型直接去拟合这些带有噪声的数据会造成过拟合,使得模型学习了噪声的特性,一方面增加了模型的复杂程度,另一方面也使得模型的泛化能力降低。

       线性回归中的参数通过来求得,LASSO回归和Ridge回归是为了解决线性回归中的两类问题:1.过拟合问题;2.通过正规方程方法求解参数过程中出现的不可逆问题。如果样本的特征数量多于样本数量,在线性回归中容易出错。Ridge回归最先用来处理特征多于样本数量的情况,现在也用于在估计中加入偏差,从而得到更好的估计,它通过引入惩罚项来较少不重要的参数,在统计学上也称为缩减(shrinkage)。

       为防止参数过大,在目标函数后添加正则项(即惩罚项)来防止过拟合。LASSO回归中采用的正则项为L1-norm,Ridge回归中采用的正则项为L2-norm,ElasticNet回归则是结合了L1-norm和L2-norm。在线性回归中他们的目标函数表示形式分别如下:

       对于不带有正则项的线性回归问题,使用Ordinary Least Squares进行求解,即。对于Ridge回归,,因此岭回归中的“岭”就是在矩阵的对角线加上了大于0的常数。

1 LASSO回归和Ridge回归的问题提出

在考虑一般的线性回归问题,给定n个数据样本点,其中每个都是一个n维向量,每个是一个实数。根据所得输入,寻找到一个映射,使得误差平方和最小,优化目标为:

       其中,是待优化的参数。现在假设固定值,通过一阶导数为0处来寻找的最小值。对上式求导得:

       将得到的优化结果代入原优化目标得:

       假设给定的样本点是零均值的,即,那么上式优化目标可以写为:

       用矩阵形式可以表示为:

       而LASSO回归和Ridge回归就是分别在上式中加入L1正则项和L2正则项,分别用下式表示:

2 LASSO回归与Ridge回归的原理

2.1 几何解释

       L1和L2正则化项分别是在目标函数中加入L1-norm和L2-norm项,即。对Ridge回归的等价优化问题,将L2正则化项从目标函数中移除转变为约束条件,将参数限制在一个半径为t的超球里面得:

       利用Lagrangian乘子将上述带有约束的问题转为无约束问题得:

       因为求解的问题是线性回归属于凸优化问题,所以给定之后,可以看出就是带有L2正则化项的Ridge回归,常数项和参数没有关系,所以有无皆可。由于是凸优化问题,由强对偶性可以得到两者等价。同理可得LASSO回归的无约束问题为:

       以两个参数为例解释L1和L2正则化的几何意义,左图表示L1正则化,右图表示L2正则化。

       图中红色椭圆线条是优化目标关于参数的等值线,假设没有约束没有约束条件,则最小值时椭圆的中心点,加入正则化项后相当于对参数施加约束,L1正则化参数被限制在菱形中,L2正则化参数被限制在圆中。两个区域的切点就是所求目标函数的最优值点。从图中可以看出L1正则化施加的约束会使得最优值在菱形顶点处取得,即。L2正则项则是容易在圆周上任意点相切。因此,L1正则项的结果容易产生稀疏解,常用来做特征选择。再次提醒,这个坐标轴和特征(数据)没关系,它完全是参数的坐标系,每个红色椭圆等值线上,可以取无数个,这些 有个共同的特点:用它们计算的目标函数值是相等的。

L2则是权重衰减,考虑一般优化问题:

       利用梯度下降求解上述问题:

       可以看出t+1步的参数在第t步的参数与相乘,所以会使得权重趋于0,即权重衰减。

       正则化可以降低模型复杂度,减少模型过拟合的风险,在回归问题中的解释是:当特征之间存在高度相关关系的时候,假设有两个特征高度负相关,那么不带正则化的回归问题可能会赋予二者近似相等的很大权重,这样加权起来的结果仍然较小,但是由于权重很大,就导致了过拟合问题。Ridge Regression会倾向于在相关特征之间均匀分布权重,Lasso则倾向于从相关特征中选取出一个,其余特征权值衰减为零。另外,正则化的目的也可以理解为使模型权重之间的方差较小。

2.2 贝叶斯解释

       贝叶斯学派中任何随机变量包括参数都是需要服从一定的分布,例如回归问题中给定参数和自变量后,观测值会服从高斯分布。假定参数也服从一个分布,即先验信息,那么回归问题就变为最大化后验概率,利用贝叶斯公式有:

       根据观测值会服从高斯分布,所以,可以看出已经得到线性回归问题的目标函数损失部分,这是利用高斯分布解决回归问题得到的。容易从拉普拉斯分布和高斯分布的表达式中看出来,假设参数服从的分布是拉普拉斯分布,可以得到LASSO回归,如果服从高斯分布,可以得到Ridge回归。若假设L1和L2中参数服从的是均值为0的分布,那么它们的表达式为:

       需要注意的一点是,上面给出的是单个参数的分布,而不是向量参数的分布

3 LASSO的求解方法

3.1 LARS

       最小角回归法(Least Angle Regression,LARS)算法是对前向梯度算法和前向选择算法的折中方法,保留前向梯度算法一定精确性的同时简化了前向梯度算法的迭代过程。具体算法如下。

       首先找到与因变量相关度最高的自变量,使用类似于前向梯度算法中的残差计算方法,得到新的目标,此时不用像前向梯度算法那样一步一步前进,而是直接前向走到下一个,使得的相关度和的相关度相同,此时残差就在的角平分线方向上,沿着该方向继续走,直到第三个特征的相关度和的相同,将这些等称为逼近特征集合,用该逼近特征集合的共同角分线作为新的逼近方向。以此循环直到足够小或者所有变量取完,算法停止,此时对应的系数为最终结果。

       该算法适合的情况有:1、特征数量远高于样本数量的情况;2、可以产生分段线性结果的完整路径,这在模型的交叉验证中极为有用;3、算法的最坏计算复杂度和最小二乘法类似,但是其计算速度几乎和前向选择算法一样。缺点是迭代方向根据目标的残差而定,对噪声极为敏感。

3.2坐标下降法

       梯度下降法是以梯度的负方向为下降方向进行迭代求得最优值的,坐标下降法则是以坐标轴方向,通过启发式的方式一步步迭代求解目标函数最小值。算法目标就是使得参数集在n个坐标轴上对目标函数做迭代下降,当n个坐标轴上的参数都收敛时目标函数最小,得最佳参数集。坐标下降法适合在单个维度上有闭式解,在整体维度上没有闭式解的问题,算法流程如下。

  • 首先初始化参数,初始化迭代次数k;
  • 对于第k轮迭代,对n个参数依次进行迭代,每次迭代时以单个参数为变量求得目标函数的最小值,其余固定为常量,最小值可以通过求导得到。迭代的公式如下:

  • 如果在各个维度上的变化都足够小,取为最终结果,否则转入2继续迭代。

       由于Lasso的目标函数是凸的,根据优化理论,只要函数可以收敛即可得到全局最小值,但是由于Lasso不是严格凸的,所以可以会得到多个局部最小值,有时候得到的解会不同。在迭代过程中可能会得到稀疏解,即可能会被迭代为0。

4 使用Scikit-learn进行LASSO变换

       使用Scikit-learn进行LASSO变换时可以使用多种函数,它的目标函数为:

       使用时惩罚参数需要预置,分别是数据集的特征向量和类别。Scikit-learn提供以下函数供进行LASSO变换。因为篇幅所限,这里仅对函数作用做以陈述,不解释函数中的各项参数,实际使用前推荐阅读Scikit-learn的官方文档,非常详细。

  • sklearn.linear_model.Lasso:基于坐标下降法求解LASSO模型,需要自己调节惩罚参数
  • sklearn.linear_model.lasso_path:基于坐标下降法计算LASSO系数路径;
  • sklearn.linear_model.LassoCV:基于坐标下降法,通过交叉验证法来选择LASSO变换最佳惩罚参数,在初始化类的时候可以设置多个待选值,最终LassoCV会选出最合适的惩罚参数
  • sklearn.linear_model.lars_path:基于最小角回归法来计算LASSO系数路径;
  • sklearn.linear_model.LassoLars:基于最小角回归法求解LASSO模型;
  • sklearn.linear_model.LassoLarsCV:基于最小角回归法,通过交叉验证法来选择LASSO变换最佳惩罚参数,如果样本数量相对于特征数量少很多,它的速度要高于LassoCV。如果想探索惩罚参数更多相关值的话,由于最小角回归可以看到回归路径,此时适合使用LassoLarsCV;
  • sklearn.linear_model.LassoLarsIC:基于Akaike信息准则(AIC)和贝叶斯信息准则(BIC)寻找最佳惩罚参数,不需要预置参数。使用K折交叉验证法需要K+1轮才能找到最佳参数,而LassoLarsIC只需一轮,相比于前面的方法更快。但是该方法使用条件是估计是来自大样本,并假设该模型是正确的(即这些数据确实是由假设的模型产生的)。当待求解的问题的条件数很差的时候(比如特征个数大于样本数量的时候),这些准则就会有崩溃的风险。所以除非我们知道数据是来自一个模型确定的大样本,并且样本数量够大,我们才能用LassoLarsIC,所以实际中使用较少;
  • sklearn.linear_model.MultiTaskLasso:基于坐标下降法拟合多元线性回归模型,多个线性回归模型共享样本特征,回归系数和输出不同。线性回归模型为是n×k矩阵,是m×n矩阵,是m×k矩阵,m为样本个数,n为样本的特征数量,k为线性回归模型的数量。使用的目标函数形式为:

其中,的Frobenius范数,各列的跟平方和之和。使用时需要自行设置惩罚参数

  • sklearn.linear_model.MultiTaskLassoCV:基于坐标下降法,通过交叉验证法来选择最佳惩罚参数,在初始化类的时候可以设置多个待选值,最终MultiTaskLassoCV会选出最合适的惩罚参数

 

参考:

https://www.biaodianfu.com/ridge-lasso-elasticnet.html

https://zhuanlan.zhihu.com/p/46999826

https://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares

https://scikit-learn.org/stable/modules/linear_model.html#lasso

https://www.cnblogs.com/pinard/p/6026343.html

https://www.cnblogs.com/pinard/p/6018889.html

 

以上是关于LASSO回归与Ridge回归方法及Python实现总结的主要内容,如果未能解决你的问题,请参考以下文章

线性回归——lasso回归和岭回归(ridge regression)

Ridge和Lasso回归

Ridge和Lasso回归

有人计算过 Lasso/Ridge 回归的泊松损失吗?

使用正则化 (L1 / L2) Lasso 和 Ridge 的逻辑回归模型

r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现