回归
给定一组数据
回归分析按照样本中特征的个数,分为一元回归和多元回归分析;按照目标变量的多少,可分为简单回归和多重回归;按照样本特征和目标变量之间的关系,可分为线性回归和非线性回归。
这篇文徵主要学习以广义线性模型为基础的最小二乘,和logistics回归。首先是最小二乘和由最小二乘衍生的线性回归,如Rigde,Lasso,OMP,局部加权线性回归和多项式回归,最后学习广义线性模型的一般形式,可以推导出最小二乘和logistic回归。
线性回归的一般模型为
最小二乘法
最小二乘法(Ordinary Least Squares)是所有线性回归的基础,之后学习的线性回归要么是在最小二乘的基础上对参数加上约束,要么是基于最小二乘的构造。一旦数据有很大噪声或者非线性,最小二乘失效。但是,最小二乘是一些高级算法的基础,例如sparse cording或者dictionary learing。
最小二乘法的损失函数是平方损失函数:
这个目标损失函数很简单。那么为什么要选择平方损失函数,而不是其他的损失函数呢?在Andrew Ng的机器学习公开课中有关于最小二乘法的概率解释,这里再回顾一下。
最小二乘法的模型需要满足3个假设:
- 对于每个样例
(x(i),y(i)) ,它们之间的关系可以表示为y(i)=wTx(i)+ϵ(i) ,其中ϵ(i) 表示模型与目标值的误差 -
ϵ(i) 服从正态分布:ϵ∼N(0,σ2) - 对于各个样例的误差
ϵ(i) ,他们是独立同分布的随机变量
假设1只是一种表示,表示样本特征和目标之间的线性关系。那么假设2如何成立呢?影响误差的因素有很多,这些因素都是随机分布的,根据中心极限定理,许多独立随机变量的和趋于正态分布,可以得到假设二。有了假设二之后,可以得到
这也表示当给定样本
再根据假设3,可以得到似然函数
似然函数的意义是找到使得目标值出现概率最大时的参数
所以极大化上式得到
加下来是求解以上目标函数。这里采用批量梯度下降。针对一个训练样例,更新规则为:
其中
上面的更新规则针对数据集中只有一个样本的情况。当数据集中有p个样本时,参数
所以批量梯度下降的过程如下:
输入:数据集
输出:训练好的参数
初始化参数
w0 -
从数据集中随机选择p个样本最为更新参数的子数据集,利用子数据集更新参数中的每一个分量
wj:=wj−α∑i=1p(y(i)−wTx(i))x(i)j 重复步骤2,直到循环次数达到maxIter或者参数变化很小
以上是批量梯度下降的过程。如果
最小二乘法目标函数的求解除了以上的数值方法,还有直接求解的方法,称为正规方程法。
首先将最小二乘法的目标函数表示为矩阵的形式:训练数据集为
其中
所以目标函数可以表示为
所以目标函数对参数的梯度为
上式的推导利用了以下性质:
-
trAB=trBA -
trAT=trA -
tr(A+B)=trA+trB -
▽AtrAB=BT -
▽AtrABATC=CAB+CTABT
令目标函数的梯度为0,得到
给定数据集后,当
Rigde回归
Ridge回归是在最小二乘法的目标函数中加上对参数
那么为什么要加上对参数的约束呢?最小二乘的目标函数
这里对参数的约束是2 范数,当然也可以采用其他的约束方式,比如1范数,0范数等。
和最小二乘一样,Ridge回归也有其概率解释。Ridge回归是在最小二乘的基础上,参数
在最小二乘的基础上,加上第4个假设:
根据最大后验估计
极大化以上式子,可得到Ridge的目标函数。也就是,Ridge回归是在最小二乘的基础上,使得参数服从正态先验分布。
同样,Ridge也可以使用梯度下降法求得最优解。这里主要说明使用类似正规方程的方法求解。将目标函数表示为矩阵的形式之后,对参数求梯度,并令梯度等于0.可以得到
根据上式,Ridge还有一种解释。岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘。本质是在自变量信息矩阵的主对角线元素上人为地加入一个非负因子(https://www.zhihu.com/question/28221429/answer/51527607)。和最小二乘的求解形式比较,只是在
另外,Ridge的解
Lasso回归
Ridge回归改良了最小二乘,针对共线性数据有很好的效果。虽然在目标函数中对参数做了约束,但是大多趋于0,不会等于0。Lasso也是对最小二乘的改进,是一个估计稀疏参数的线性模型。即在最小二乘的基础上,加上对参数的约束,得到稀疏的参数。
那么怎样对参数约束达到稀疏呢?一般和稀疏相对应的是0范数,但是加上0范数问题就变成NP难问题了,所以不直接使用0范数对参数约束,而是采用1范数。
Lasso回归的目标函数为:
与Ridge一样,Lasso也有概率解释,在最小二乘的基础上,参数服从Laplace先验分布。
在最小二乘的基础上,加上第4个假设:
根据最大后验估计
极大化以上式子,可得到Lasso的目标函数。
Lasso为什么能够产生稀疏解?参考监督学习–统计三要素
另外也可以通过可视化解释1范数比2更容易得到稀疏解。Ridge回归和Lasso回归可以写成以下的形式
Ridge:
Lasso:
作图如下
Lasso回归解释完之后,还有最重要的一部分,就是目标函数的求解。
由于Lasso目标函数不是连续可导的,所以不能用梯度下降求解,也不能求出闭式解。求解Lasso目标函数采用的是坐标轴下降法(coordinate descent)和最小角回归法( Least Angle Regression, LARS)。
-
坐标下降法
最表下降的依据是以下结论:
f(x)=g(x)+∑mi=1hi(x) ,如果g(x) 是可微的凸函数,hi(x),i=1,2,...,m 是凸函数,如果某一点x ,使得f(x) 在每一个坐标轴上都达到最小,则x 是全局最优解。也就是说坐标下降是在参数所在空间的每一个坐标轴上寻找最优解,当寻找某个坐标轴方向上的最优解时,其他坐标轴方向的参数作为常量(和SVM中的SMO算法类似,SMO中选择两个方向作为变量)。
Lasso坐标下降法的步骤为:
输入:数据集
{(x(1),y(2)),(x(2),y(1)),...,(x(n),y(n))} 输出:训练好的参数
w 初始化参数
w0=[w00,w01,...,w0m] ,上标表示迭代次数,当前次数为0-
对于第k轮的迭代,w的m个坐标方向上的迭代如下:
wk1=argminw1J(w1,wk−12,...,wk−1m)wk2=argminw1J(wk−11,w2,...,wk−1m)...wkm=argminw1J(wk−11,wk−12,...,wm) 检查
wk 和wk−1 向量在各个坐标方向上的差值,如果都足够小,wk 为最终结果
以上就是坐标轴下降法的求极值过程,可以和梯度下降做一个比较:
- 坐标轴下降法在每次迭代中在当前点处沿一个坐标方向进行一维搜索 ,固定其他的坐标方向,找到一个函数的局部极小值。而梯度下降总是沿着梯度的负方向求函数的局部最小值。
- 坐标轴下降优化方法是一种非梯度优化算法。在整个过程中依次循环使用不同的坐标方向进行迭代,一个周期的一维搜索迭代过程相当于一个梯度下降的迭代。
- 梯度下降是利用目标函数的导数来确定搜索方向的,该梯度方向可能不与任何坐标轴平行。而坐标轴下降法法是利用当前坐标方向进行搜索,不需要求目标函数的导数,只按照某一坐标方向进行搜索最小值。
- 两者都是迭代方法,且每一轮迭代,都需要O(mn)的计算量(n为样本数,m为系数向量的维度)
-
最小角回归法
最小角回归法常用于特征选择。所谓特征选择,当数据特征很多时,从中选择一些特征用作计算。而网络上详细极少Lasso回归求解目标函数的网页很少,大多都是介绍Lasso回归如何产生稀疏解,用Lasso和最小角回归做特征选择。可以参考的内容有
http://www.cnblogs.com/pinard/p/6018889.html
http://blog.****.net/xbinworld/article/details/44284293
对于Lasso的理解还需要继续,尤其是如何产生稀疏解以及求解目标函数的算法。
不过sklearn中关于Lasso的模块有很多,这里主要学习一下sklearn中关于Lasso的求解
OMP算法
Ridge和Lasso都是在最小二乘的基础上加上对参数
Ridge:
Lasso:
可以看到,Ridge是l2范数,lasso是l1范数,而利用OMP算法求解回归问题是在参数加上了l0范数。目标函数如下:
写成矩阵的形式为
具体的OMP算法可以参考http://blog.****.net/scucj/article/details/7467955
这里的X相当于OMP中的字典,每一列表示一个原子,而在数据集中表示所有数据的某个特征组成的列向量。利用OMP算法求解线性回归,可以得到稀疏解,解中非零元素的个数小于等于C。这也相当于在稀疏表示中给定字典,求解稀疏表示的问题。
局部加权线性回归
当使用最小二乘的时候,会产生欠拟合和过拟合的情况。要得到好的拟合效果,对特征的选择要求很高。而局部加权线性回归减小了模型对特征的依赖。
最小二乘的目标函数为:
局部加权线性回归的目标函数为:
其中
其中
局部加权线性回归的目标函数的优化和最小二乘法完全一致,可以使用梯度下降。这里给出闭式解:
其中矩阵
局部加权线性回归和样本距离较近的点求解参数,对于距离较远的点权值很小,对求解参数作用不大。其中的
局部加权线性回归每预测样本时,需要利用该样本附近的点重新计算参数,是非参数学习算法。对应的是参数学习算法,像最小二乘一样,计算完参数后,对于之后的预测,不用重新计算参数,使用之前训练好的参数即可。
多项式回归
多项式回归也是最小二乘的一种改进。像Ridge和Lasso,或者局部加权线性回归是在目标函数上做的改进,而多项式回归是在模型上做改进,更确切的说是在数据的特征上做改进。
给定训练数据集的特征
也就是说多项式回归在形式上和最小二乘完全一样,只是在模型建立时对数据的特征做了特殊的处理。
多项式回归是为了改善最小二乘容易欠拟合的问题,但是如果特征构造的过多,模型太复杂,又容易过拟合。所以在构造完特征之后,需要特征选择的步骤,比如可以使用Lasso回归,使得某些特征的系数为0。
总之多项式回归是对最小二乘的改进,最重要的还在于特征选择,避免过拟合。
广义线性模型
我们知道,利用最小二乘
那么广义线性模型具体是什么呢?首先需要了解指数分布族。
指数分布族是指可以表示为指数形式的概率分布。指数分布的行书如下:
上式表示在参数
实际上,大多数的概率分布可以表示成(1)的形式,例如:
- 伯努利分布(Bernoulli):对0,1问题建模,二分类问题
- 多项式分布(Multinomial):对K个离散结果的时间建模,多分类问题
- 高斯分布(Gaussian):对连续的呈高斯分布的结果建模
- 泊松分布(Poisson):对计数过程进行建模,比如网站访问量
- Gamma分布和指数分布:对有间隔的正数进行建模,比如公交车到站问题
以上是一些常用的概率分布,针对的是数据中目标值的分布。
下面利用高斯分布做具体说明:
高斯分布的概率函数为
为了方便,这里假设
对比(1)式,得到
下面再看伯努利分布
伯努利分布的概率函数为:
伯努利分布可以写作指数形式,如下
对比(1)式,得到
定义了指数分布族有什么用呢?可以通过指数分布族引出广义线性模型(Generalized Linear Model,GLM)。GLM的定义如下,有三个假设:
- 给定样本
x 和参数η ,目标值y 服从指数分布族中的某个分布 - 给定
x ,建立的模型或者假设为hθ(x)=E[T(y)|x] ,其中θ 是模型参数,T(y) 是指数分布族中的充分统计量 -
η=θTx
根据以上三个假设,试着推导最小二乘:
这个就是最小二乘中定义的模型
接下来推导logistics回归
这和logistics回归的模型一致。之前学习logistics时,直接给出模型的假设,然后利用最大似然函数导出目标函数,这里解释了模型假设的由来。
根据广义线性模型,利用多项式分布,还可以推导出softmax回归。集体参考Andrew Ng的公开课。
总结
这篇文章主要学习了广义线性模型,只要样本目标服从指数分布族中的某个分布,就可以利用广义线性模型的一般形式推导出模型假设,然后可以用极大似然估计得到目标函数,再利用合适的算法求得最优解。常用的分布是高斯分布,伯努利分布和多项式分布,对应的模型分别是最小二乘,logistics和softmax。最小二乘只能用于线性回归,而且当数据集中的特征强相关或者样本个数小于特征个数时,解不稳定或不唯一,需要在最小二乘的基础上对参数加上一定的约束,于是衍生出Ridge,lasso和OMP,分别对应的约束是l2,l1,l0范数。其中Ridge能够能够得到稳定的解,但是当特征很多或者相关时,特征的系数会很小,但不能达到0,这对模型的解释没有帮助。而Lasso利用了l1范数,能够得到稀疏的解,求解简单,而且可以用来做特征选择。OMP是可以限制参数的非零个数,也可以做特征选择。logistics和softmax虽然称为回归,实际上是分类算法。
除了文中学习的模型,还有很多模型可以用作回归,比如CART树,SVM,KNN,集成方法等。
sklearn.linear_model
sklearn.linear_model中有很多类用来做线性回归,旨在寻找样本数据X和目标Y之间的关系,即求解
LinearRegression:即最小二乘。损失函数:
J(w)=12tr((Xw−Y)T(Xw−Y)) ,损失函数的优化方法采用的是正规方程组。没有交叉验证方法,只能通过自己把数据集分成训练集和测试集,然后训练优化。一般来说,只要觉得数据是线性的,LinearRegression是首选。如果发现拟合或者预测的不好,可以考虑其他的方法。Ridge:损失函数是
J(w)=12tr((Xw−Y)T(Xw−Y))+λ||w||22 ,其中λ 是正则化系数,需要经过调优。Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型比较稳定,不至于过拟合。损失函数的优化方法时正规方程数组,可以得到回归系数为w=(XTX+λI)−1XTY 。Ridge没有参数验证方法,需要自己设置训练集和测试集调整正则化系数λ 。一般来说,只要觉得数据是线性的,如果用LinearRegression得到的效果不好,可以考虑Ridge。但是这个类最大的缺点是每次都要指定一个超参数λ ,然后自己评估参数的好坏,比较麻烦。一般使用下面的RidgeCV类。RidgeCV:RidgeCVC中的损失函数和优化方法和Ridge一样,区别在于验证方法。RidgeCV类对超参数
α 使用了交叉验证,帮助选择一个合适λ 。在初始化RidgeCVC类时,乐意传递一组备选的λ 值。RidgeCV会在其中选择一个合适的超参数,免去了自己加上交叉验证的麻烦。一般,如果要使用Ridge回归时,首先考虑RidgeCV类。Lasso:即Lasso回归。损失函数是
J(w)=12tr((Xw−Y)T(Xw−Y))+λ||w||1 。其中λ 是正则化系数,需要经过调优。Lasso回归可以使一些比较小的系数直接变为0,增加模型的泛化能力。这里目标函数的优化采用坐标下降法,后面的LassoLars采用最小角回归法。Lasso类中没有交叉验证,和Ridge类似。一般,对于高维数据,尤其线性关系是稀疏的,会采用Lasso回归。或者需要进行特征选择,Lasso回归更是首选。但是更多使用的类库是下面的LassoCV。LassoCV:损失函数和优化方法和Lasso一致,这个类库加上了对超参数
λ 的交叉验证,和RidgeCVC一样。LassoCV是Lasso回归的首选,可用作特征选择。LassoLars:LassoLars也是Lasso回归模型,损失函数和Lasso一样,但是使用的优化方法时最小角回归(lars)。没有自带的交叉验证。
LassoLarsCV:损失函数和优化方法和LassoLars一样,有知道的交叉验证的可以选择合适的超参数。LassoLarsCV是Lasso回归的第二选择,第一选择是前面的LassoCV。那么最小角回归什么时候比坐标下降好呢?首先最小角回归可以看到回归路径,如果想要探索超参数
λ 跟多相关值的话,可以用lassoLaraCV;其次,如果样本个数远远小于样本特征的话,LassoLarsCV比lassoCV 好。其余时候用LassoCV比较好。LassoLarsIC:LassoLarsIC类的损失函数和损失函数的优化方法完全与LassoLarsCV类相同,区别在于验证方法。LassoLarsIC类对超参数
λ 没有使用交叉验证,而是用 Akaike信息准则(AIC)和贝叶斯信息准则(BIC)。此时我们并不需要指定备选的λ 值,而是由LassoLarsIC类基于AIC和BIC自己选择。用LassoLarsIC类我们可以一轮找到超参数而用K折交叉验证的话,我们需要K+1轮才能找到。相比之下LassoLarsIC类寻找λ 更快。从验证方法可以看出,验证λ LassoLarsIC比LassoLarsCV快很多。那么是不是LassoLarsIC类一定比LassoLarsCV类好呢? 不一定!由于使用了AIC和BIC准则,我们的数据必须满足一定的条件才能用LassoLarsIC类。这样的准则需要对解的*度做一个适当的估计。该估计是来自大样本(渐近结果),并假设该模型是正确的(即这些数据确实是由假设的模型产生的)。当待求解的问题的条件数很差的时候(比如特征个数大于样本数量的时候),这些准则就会有崩溃的风险。所以除非我们知道数据是来自一个模型确定的大样本,并且样本数量够大,我们才能用LassoLarsIC。而实际上我们得到的数据大部分都不能满足这个要求,实际应用中我没有用到过这个看上去很美的类。OrthogonalMatchingPursuit:OMP算法的损失函数为
J(w)=12tr((Xw−Y)T(Xw−Y))s.t.||w||0≤C 。其中C 是参数中非零系数的个数,是一个超参数。使用前行选择算法优化损失函数,是最小角回归的退化版本,虽然精度不如lars,但是速度很快。这个类中没有自带的交叉验证。如果需要使用l0范数限制参数是,可以使用这个类,但是由于没有自带的交叉验证,一般会选择下面的OrthogonalMatchingPursuitCV。OrthogonalMatchingPursuitCV和OrthogonalMatchingPursuit有一样的损失函数和优化方法,但是这个类中有自带的交叉验证机制,可以选择最佳的
C .OrthogonalMatchingPursuitCV类通常用在稀疏回归系数的特征选择上,这点和LassoCV有类似的地方。不过由于它的损失函数优化方法是前向选择算法,精确度较低,一般情况不是特别推荐用,用LassoCV就够,除非你对稀疏回归系数的精确个数很在意,那可以考虑用OrthogonalMatchingPursuitCV。-
ElasticNet:可以看做Ridge和Lasso结合的产物,也是对最小二乘做了正则化,但是损失函数不全是l1或l2正则化,而是用一个权重系数平衡两个正则化的比重,形成一个全兴的损失函数:
J(w)=12tr((Xw−Y)T(Xw−Y))+λρ||w||1+λ(1−ρ)2||w||22 其中
λ 是正则化超参数,ρ 是权重系数超参数。采用的优化方法是坐标下降法。没有自带的交叉验证。 ElasticNetCV:损失函数和优化方法和ElasticNet一样,有自带的交叉验证。当我们发现Lasso回归太多参数为0,而用Ridge回归参数衰减太慢的时候,可以使用ElasticNetCV。一般不推荐直接使用。
-
MultiTaskLasso:MultiTask是指对个线性回归目标一起训练。具体的线性回归模型是
Y=XW ,其中Xn∗m 是数据集,每一行代表一个样本,Wm∗k 是参数矩阵,每一列是一个回归任务得到的参数,Yn∗k 是目标矩阵,每一列是一个任务的目标向量。也就是说多个回归任务共享一个数据集,每个任务的目标值不一样,一起训练,每个任务得到的参数也不一样。MultiTaskLasso色损失函数如下:J(W)=12n||XW−Y||2+α||W||21 其中
||W||21=∑i∑jw2ij−−−−−−√ ,表示先对各列平方和求平方根,然后在相加。损失函数的优化方法时坐标下降。没有自带的交叉验证。
MultiTaskLassoCV:MultiTaskLassoCV类的损失函数和损失函数的优化方法完全与MultiTaskLasso类相同,有自带的交叉验证,可以选择合适的
α 。MultiTaskLassoCV是多个回归模型需要一起共享样本特征一起拟合时候的首选。它可以保证选到的特征每个模型都用到。不会出现某个模型选到了某特征而另一个模型没选到这个特征的情况。-
MultiTaskElasticNet:和MultiTaskLasso需要解决的问题一样,但是损失函数的不一样。损失函数为:
J(W)=12n||XW−Y||2+αρ||W||21+α(1−ρ)2||W||2F 其中
||W||21=∑i∑jw2ij−−−−−−√,||W||F 表示Frobenius范数。优化损失函数的方法时坐标下降法。没有自带的验证超参数的方法。
MultiTaskElasticNetCV:MultiTaskElasticNetCV类的损失函数和损失函数的优化方法完全与MultiTaskElasticNet类相同,有自带的交叉验证方法。MultiTaskElasticNetCV是多个回归模型需要一起共享样本特征一起拟合时候的两个备选之一,首选是MultiTaskLassoCV。如果我们发现用MultiTaskLassoCV时回归系数衰减的太快,那么可以考虑用MultiTaskElasticNetCV。
LogisticRegression,LogisticRegressionCV和Logistic_regression_path:和logistics回归有关,具体参考logistics回归章节。