专栏名称: 爱数据原统计网
中国统计网(www.itongji.cn),国内最大的数据分析门户网站。提供数据分析行业资讯,统计百科知识、数据分析、商业智能(BI)、数据挖掘技术,Excel、SPSS、SAS、R等数据分析软件等在线学习平台。
目录
相关文章推荐
51好读  ›  专栏  ›  爱数据原统计网

最全的线性回归算法库总结—— scikit-learn篇

爱数据原统计网  · 公众号  · BI  · 2017-07-03 17:00

正文



本文建议收藏后食用更加美味



scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析, 本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景。


线性回归的目的是要得到输出向量YY和输入特征XX之间的线性关系,求出线性回归系数θθ,也就是 Y=XθY=Xθ。其中YY的维度为mx1,XX的维度为mxn,而θθ的维度为nx1。m代表样本个数,n代表样本特征的维度。


为了得到线性回归系数θθ,我们需要定义一个损失函数,一个极小化损失函数的优化方法,以及一个验证算法的方法。损失函数的不同,损失函数的优化方法的不同,验证方法的不同,就形成了不同的线性回归算法。 scikit-learn中的线性回归算法库可以从这三点找出各自的不同点。理解了这些不同点,对不同的算法使用场景也就好理解了。



1. LinearRegression


损失函数:


LinearRegression类就是我们平时说的最常见普通的线性回归,它的损失函数也是最简单的,如下:


J(θ)=12(Xθ−Y)T(Xθ−Y)J(θ)=12(Xθ−Y)T(Xθ−Y)


损失函数的优化方法:


对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit中的LinearRegression类用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θθ为:


θ=(XTX)−1XTYθ=(XTX)−1XTY


验证方法:


LinearRegression类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,然后训练优化。


使用场景:


一般来说,只要我们觉得数据有线性关系,LinearRegression类是我们的首先。如果发现拟合或者预测的不好,再考虑用其他的线性回归库。如果是学习线性回归,推荐先从这个类开始第一步的研究。



2. Ridge


损失函数:


由于第一节的LinearRegression没有考虑过拟合的问题,有可能泛化能力较差,这时损失函数可以加入正则化项,如果加入的是L2范数的正则化项,这就是Ridge回归。损失函数如下:


J(θ)=12(Xθ−Y)T(Xθ−Y)+12α||θ||22J(θ)=12(Xθ−Y)T(Xθ−Y)+12α||θ||22


其中αα为常数系数,需要进行调优。||θ||2||θ||2为L2范数。


Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对而言比较的稳定,不至于过拟合。


损失函数的优化方法:


对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit中的Ridge类用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θθ为:


θ=(XTX+αE)−1XTYθ=(XTX+αE)−1XTY


其中E为单位矩阵。


验证方法:


Ridge类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数αα。然后训练优化。


使用场景:


一般来说,只要我们觉得数据有线性关系,用LinearRegression类拟合的不是特别好,需要正则化,可以考虑用Ridge类。但是这个类最大的缺点是每次我们要自己指定一个超参数αα,然后自己评估αα的好坏,比较麻烦,一般我都用下一节讲到的RidgeCV类来跑Ridge回归,不推荐直接用这个Ridge类,除非你只是为了学习Ridge回归。



3. RidgeCV


RidgeCV类的损失函数和损失函数的优化方法完全与Ridge类相同,区别在于验证方法。


验证方法:


RidgeCV类对超参数αα使用了交叉验证,来帮忙我们选择一个合适的αα。在初始化RidgeCV类时候,我们可以传一组备选的αα值,10个,100个都可以。RidgeCV类会帮我们选择一个合适的αα。免去了我们自己去一轮轮筛选αα的苦恼。


使用场景:


一般来说,只要我们觉得数据有线性关系,用LinearRegression类拟合的不是特别好,需要正则化,可以考虑用RidgeCV类。不是为了学习的话就不用Ridge类。为什么这里只是考虑用RidgeCV类呢?因为线性回归正则化有很多的变种,Ridge只是其中的一种。所以可能需要比选。如果输入特征的维度很高,而且是稀疏线性关系的话,RidgeCV类就不合适了。这时应该主要考虑下面几节要讲到的Lasso回归类家族。



4.  Lasso


损失函数:


线性回归的L1正则化通常称为Lasso回归,它和Ridge回归的区别是在损失函数上增加了的是L1正则化的项,而不是L2正则化项。L1正则化的项也有一个常数系数αα来调节损失函数的均方差项和正则化项的权重,具体Lasso回归的损失函数表达式如下:


J(θ)=12m(Xθ−Y)T(Xθ−Y)+α||θ||1J(θ)=12m(Xθ−Y)T(Xθ−Y)+α||θ||1


其中n为样本个数,αα为常数系数,需要进行调优。||θ||1||θ||1为L1范数。


Lasso回归可以使得一些特征的系数变小,甚至还是一些绝对值较小的系数直接变为0。增强模型的泛化能力。


损失函数的优化方法:


Lasso回归的损失函数优化方法常用的有两种,坐标轴下降法和最小角回归法。Lasso类采用的是坐标轴下降法,后面讲到的LassoLars类采用的是最小角回归法


验证方法:


Lasso类并没有用到交叉验证之类的验证方法,和Ridge类类似。需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数αα。然后训练优化。


使用场景:


一般来说,对于高维的特征数据,尤其线性关系是稀疏的,我们会采用Lasso回归。或者是要在一堆特征里面找出主要的特征,那么Lasso回归更是首选了。但是Lasso类需要自己对αα调优,所以不是Lasso回归的首选,一般用到的是下一节要讲的LassoCV类。



5. LassoCV


LassoCV类的损失函数和损失函数的优化方法完全与Lasso类相同,区别在于验证方法。


验证方法:


LassoCV类对超参数αα使用了交叉验证,来帮忙我们选择一个合适的αα。在初始化LassoCV类时候,我们可以传一组备选的αα值,10个,100个都可以。LassoCV类会帮我们选择一个合适的αα。免去了我们自己去一轮轮筛选αα的苦恼。


使用场景:


LassoCV类是进行Lasso回归的首选。当我们面临在一堆高位特征中找出主要特征时,LassoCV类更是必选。当面对稀疏线性关系时,LassoCV也很好用。



6. LassoLars


LassoLars类的损失函数和验证方法与Lasso类相同,区别在于损失函数的优化方法。


损失函数的优化方法:


Lasso回归的损失函数优化方法常用的有两种,坐标轴下降法和最小角回归法。LassoLars类采用的是最小角回归法,前面讲到的Lasso类采用的是坐标轴下降法。


使用场景:


LassoLars类需要自己对αα调优,所以不是Lasso回归的首选,一般用到的是下一节要讲的LassoLarsCV类。



7. LassoLarsCV


LassoLarsCV类的损失函数和损失函数的优化方法完全与LassoLars类相同,区别在于验证方法。


验证方法:


LassoLarsCV类对超参数αα使用了交叉验证,来帮忙我们选择一个合适的αα。在初始化LassoLarsCV类时候,我们可以传一组备选的αα值,10个,100个都可以。LassoLarsCV类会帮我们选择一个合适的αα。免去了我们自己去一轮轮筛选αα的苦恼。


使用场景:


LassoLarsCV类是进行Lasso回归的第二选择。第一选择是前面讲到LassoCV类。那么LassoLarsCV类有没有适用的场景呢?换句话说,用最小角回归法什么时候比坐标轴下降法好呢?场景一:如果我们想探索超参数αα更多的相关值的话,由于最小角回归可以看到回归路径,此时用LassoLarsCV比较好。场景二: 如果我们的样本数远小于样本特征数的话,用LassoLarsCV也比LassoCV好。其余场景最好用LassoCV。


8. LassoLarsIC


LassoLarsIC类的损失函数和损失函数的优化方法完全与LassoLarsCV类相同,区别在于验证方法。


验证方法:


LassoLarsIC类对超参数αα没有使用交叉验证,而是用 Akaike信息准则(AIC)和贝叶斯信息准则(BIC)。此时我们并不需要指定备选的αα值,而是由LassoLarsIC类基于AIC和BIC自己选择。用LassoLarsIC类我们可以一轮找到超参数αα,而用K折交叉验证的话,我们需要K+1轮才能找到。相比之下LassoLarsIC类寻找αα更快。


使用场景:


从验证方法可以看出,验证ααLassoLarsIC比LassoLarsCV快很多。那么是不是LassoLarsIC类一定比LassoLarsCV类好呢? 不一定!由于使用了AIC和BIC准则,我们的数据必须满足一定的条件才能用LassoLarsIC类。这样的准则需要对解的自由度做一个适当的估计。该估计是来自大样本(渐近结果),并假设该模型是正确的(即这些数据确实是由假设的模型产生的)。当待求解的问题的条件数很差的时候(比如特征个数大于样本数量的时候),这些准则就会有崩溃的风险。所以除非我们知道数据是来自一个模型确定的大样本,并且样本数量够大,我们才能用LassoLarsIC。而实际上我们得到的数据大部分都不能满足这个要求,实际应用中我没有用到过这个看上去很美的类。


9.  ElasticNet


损失函数:


ElasticNet可以看做Lasso和Ridge的中庸化的产物。它也是对普通的线性回归做了正则化,但是它的损失函数既不全是L1的正则化,也不全是L2的正则化,而是用一个权重参数ρρ来平衡L1和L2正则化的比重,形成了一个全新的损失函数如下:







请到「今天看啥」查看全文