回归算法之线性回归(二)

本篇大纲:

1、多项式的由来

2、不可不知的Lasso回归、Ridge回归和Elastic Net算法

3、案例分析之“时间序列和家庭用电关系”

正题之前,让我们先愉快地回顾一下上篇内容:

1、我们通过“房价估计”引入示例,确定了线性关系的表达式,然后根据实际值与预测值之间存在的误差关系得到了误差项epsilon的表达式。

2、由中心极限定理确认了epsilon的概率表达式,通过对其极大似然估计,从而得到了“越小越好”的损失函数。

3、进一步的,通过一些简单的计算手段,包括对向量求导,二次型转换,矩阵的一些性质对损失函数进行求解,最终得到了“在损失函数最小时,theta的理论值”。

目前,我们已经知道,在损失函数loss最小时,theta的理论值为:

然而这里就存在一个问题。

由于X代表的是特征变量,源于日常业务中的数据,由于其不可控性,我们并没法保证X的转置点积X之后还是可逆的。

换一句话说,如果点积之后的矩阵是一个奇异矩阵,即行列式运算等于零的情况下,就无法求逆,从而也就无法直接套用公式而得到精确解了。

故而实际中,我们会对其添加上一个非常小的数使得它强行可逆。

因此,最后的theta实际上是长这样的:

这里的I是单位矩阵,这里的lambda一般是一个非常小的系数,比如0.01或者0.001等。

从数据的本身含义上来说,原始样本数据的特征变量在原来的基础上加上一个很小很小的数对其原来的值并不会有太多的意义丢失。

所以,这个时候,我们又可以愉快地进行公式求解了。

到这里,我们再回顾一下,我们的theta是解决了什么样的问题。

似乎看起来这个theta是从线性关系表达式得到的

虽然说对于平方项或者其他高次方特征变量,我们一样可以通过变量替换让它成为线性关系表达式。

但现实是,我们还需要先有对应的高次特征变量结果值才能进行转换啊,然而目前我们只有一次项的特征变量值。怎么办?

所以我们需要创造高次特征变量。

我们需要将 特征变量 从 低维空间 映射到 高维空间

也就能创造出我们需要的多项式。

举个例子,假定Y是关于x1,x2的一个多项式。

那么一阶的时候,我们有特征变量x1,x2以及常系数1。

二阶的时候,我们就能得到x1^2,x2^2,x1x2,x1,x2和1共6个维度上的特征变量。

那么三阶的时候,我们就能拓展到十个维度上的特征变量。

故而,哪怕我们原始的特征变量是一次项的x1和x2,但通过多项式拓展,我们依然可以很随意地得到多维高次的数据。

那实际中,我们使用多项式来进行低维到高维的映射能得到什么样的效果呢?

让我们用一幅图来简单说明:

当我们用一次函数来拟合数据时,如最左边所示,效果平平,准确度堪忧,通常我们也称之为欠拟合。

二次函数拟合时,如中间图所示,看起来不错,基本符合整体趋势,虽然不是处处精确,但对未来的估计似乎能有很好的把握。

我们称之为比较拟合,并且泛化能力强(即对未来测试集能很好运用)。

高次函数拟合时,如最右边所示,拟合堪称精准,然而似乎过于追求完美,并不能很好地预估未来走势。

我们称之为过拟合,并且泛化能力弱。

这种情况下,往往是训练集数据一跑,非常完美,测试集数据一跑,痛哭流涕,简直奔溃。

从本质上分析,因为数据总有噪音,高次函数拟合过程会去追逐每个噪声点。

从式子上来看,在过拟合的状态下,高次特征变量前面的系数theta会变得很大,从而导致最右图中所见的突兀性下降后又猛地回升的走势。

我们使用多项式的目的,是为了能更好地拟合真实情况,同时我们又不希望出现过拟合的现象,所以此时我们需要添加正则项来防止过拟合现象。

以表达式来说,我们通过上述多项式来拟合,并做简单的变量替换后,还是能得到如下表达式:

这里的x,我们理解为变量替换过后的x,也就是每个x本身可能是一个二次或者其他的高次项特征变量。

当过拟合时,本质上是表达式中theta会有过大或过小的现象(通常是过大)。

那么要消去theta过大带来的影响,故而我们需要添加正则项。

由于我们已经知道,我们的theta是在损失函数最小的情况下所得到的theta,故而,我们直接在损失函数中添加正则项。

因此,我们的正则项也就如下所示:

我们称添加了正则项L2-norm的损失函数所对应的线性回归模型为Ridge回归。

我们称添加了正则项L1-norm的损失函数所对应的线性回归模型为Lasso回归。

这里的lambda是一个超参,需要模型建立之后调整。

为什么此时能解决过拟合现象?

没有正则项的损失函数,当过拟合时,虽然某些theta很大,但是既和真实值很逼近,同时损失函数也会很小,故而也就可以停止迭代,获取结果。

添加了正则项的损失函数,当过拟合时,由于添加了正则项,虽然和真实值很接近,即损失函数前半段值很小,但由于theta很大,故而对应的损失函数还是会很大,还无法达到停止计算的条件,故而只能继续迭代。

为什么L1-Norm需要加绝对值?

因为每个特征变量前面的系数可正可负,若单纯的数值相加,有可能出现两两相加抵消的效果,并不能反映出现在整体的theta是否大或者小。故而要去除由符号带来的影响,所以,如果想要尝试,你也可以选择更高阶的偶数次方来创立新的正则项,但次数越高,其影响就会越大,其控制力度即越大,但理论可行,可以尝试。

那么对于LASSO和Ridge而言,孰优孰劣,孰好孰坏呢?

以二维图像示例,左图为LASSO,右图为Ridge。

蓝色部分是我们添加的正则项,红色部分为原始损失函数的等势图。

我们的最终目的是让损失尽可能小。

可以看出L1-norm对应的正则项在二维图中,展示的是一个以原点为中心的菱形。

损失函数从过拟合状态往外寻找拟合且theta值小的平衡时,更容易和菱形的四个顶点碰到。

也就是说对于L1-norm而言,更容易出现某些维度的参数为的情况,也就是获得的theta结果中更容易获得稀疏解。

对实际情况而言,也就是能比较高效地抹去一些噪音和冗余项,求解速度也会比较快。

而对于L2-norm,其在二维情况下展示的是以原点为圆心的一个圆。

损失函数从过拟合状态往外寻找损失小且theta值也小的平衡时,对于圆的各个点,看起来都是等概率接触的。

因而也就很难会遇到某个维度参数为的情况,相比L1-norm也就不会那么容易获得稀疏解。

对实际情况而言,也就是会充分利用起现实中噪声数据的微弱贡献,从而进一步提高预测的准确性和鲁棒性。

当然,由于其并不会很容易地产生稀疏解,故而相对LASSO模型而言,Ridge模型的求解速度自然也会慢下许多。

现实中,无论是精确性,鲁棒性还是时间效率,都是比较重要的参考因素。能两全其美,自然最好,不能两全其美,就看业务第一需求了。

在这里,我们知道了

LASSO回归 能有效去除噪音,获得稀疏解,因而求解速度快。

Ridge回归 精确度高,稳定性强。

那能不能取长补短,互补一下呢?

这即是Elastic Net(弹性网络算法)

既使用了L1-norm,也使用了L2-norm。

这里的lambda依然是大于的系数,但p的取值为[0,1],也就是对于L1和L2,可以自由指定相应的比例。

特殊的,当p=0时,即Ridge回归模型,而当p=1时,即LASSO回归模型了。

所以,这里我们大概能感觉到,集速度和精确度于一身的弹性网络算法简直是龙头老大的地位啊,还是看需求吧。

当然,多补充一句。

因为多项式的出发点是为了更加拟合。

正则化的出发点是为了防止过拟合。

由于出自不同的目的,故而两者可以并存。

到这里,理论已经差不多让人有点飘了,那便用一点实践来让我们落地吧。

这里,贴上一个使用多项式前后的关于“时间和电压的关系模型”的实例代码。

数据来源:家庭用电预测(household_power_consumption)

UCI Machine Learning Repository Data Sets,具体链接可从上篇底部查阅。

话不多说,直接上源码:

引入该引入的包,Numpy和Pandas必不可少,matplotlib是为了画图,time是为了转换时间,下面的sklearn相关包则是对应的模型部分。

加载数据的同时,简单去除无效数据。

因为本身数据比较干净,也不需要特征工程和降维相关的处理,故而整体流程很清晰。

获取数据,做简单转换,得到我们想要的自变量和因变量。

数据分割,这里我们以二八比例划分。

标准化数据,去除量纲,消除数据本身范围造成的影响。

训练模型,直接代入训练数据。

模型检验,获得测试集R^2评分,观察效果。当然你也可以查看mse等。

画图看效果,看起来似乎并不是很拟合,准确率有点低,效果略微有点糟糕。

同样的流程再来一遍,只是这时我们先使用了多项式的转换,具体需要达到多少阶,我们后面设置,使用多项式之后,再进行线性回归模型的代入。

模型训练之前,做一些简单的准备,包括画图要用的配色,要画的图形个数,以及多项式的阶数。

关于每阶的最后系数结果,这里就不放了,但是拟合的效果图,可以感受一下。

从一阶到六阶,精确度也从0.48提升到了0.84,提升还是相当明显的。

好了,到这里,对于线性回归也就大概知道个七七八八了。

学习没有那么难,但需要你能在喧嚣焦躁中寻找到让自己静谧平和下来的那个平衡点。

让我们坚实地迈好每一步,坚定地在热爱中前行吧。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180518G0NQPT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券