regression:指研究一组随机变量(Y1 ,Y2 ,…,Yi)和另一组(X1,X2,…,Xk)变量之间关系的统计分析方法。
回归能干嘛?

一个例子:预测宝可梦进化后的CP值

step1:建立model
假设进化后的CP值由这个model得出:

这样的model可以有多少个呢?
由于b 和 W 可以为任意数,所以这样的model有无穷多个,构成一个model集合,但显然有些参数是不符合实际情况的,例如b和W都为负数。
上述model是一个linear model 什么是linear model?简单来说就是可以写成如下函数表达式的模型,函数图像能用一条线表示。Xi表示输入X的一个attribute,Wi表示权重,b表示bias,偏置。

step2:寻找function
现在我们抓来了10只宝可梦,编号1到10。

然后我们把收集到的这10只宝可梦的进化前的cp值和进化后的cp值在坐标系上画出来。

由于我们的model也就是function集合里有很多function,那么如何判断哪个function是最好的呢?这时我们需要另外设定一个Loss function L,他的input是一个function,output是一个数值,说明吃进去的function有多不好。

用L来衡量f的好坏,由于f只是w,b的不同,所以就等于衡量w,b的值的好坏。
那么怎么来定义损失函数L呢?可以根据喜好,但一般的定义是:

意思是用每一只宝可梦的实际cp值减去预测cp值的差的平方全部相加,称作估错误差,此误差越大说明input的f越差。
step3:寻找最好的function
只要找到一个f让L的值最小,那么这个f就是最好的function。公式如下:

但是问题又来了,怎么解上述function?一个好的办法就是梯度下降法 Gradient Descent,只要L是可微分的,都可以拿来处理。
Gradient Descent
现在我们举一个简单的例子,只考虑一个参数w的loss function,我们需要找到w取何值时function结果最小?
一个简单暴力的方法就是穷举,把所有的w从负无穷到正无穷都带入到L中看哪个结果最小。
但这样做效率太慢。梯度下降法是怎么找出最低点的呢?

开始随机初始一个w0点,计算他的微分,也就是切线的斜率,如果斜率是负的,那么说明左边高右边低,所以此时应该增加w的值,如果斜率是正的,说明左边低右边高,所以此时应该减少w的值。
上述例子中应增加w的值,那么应该增加多少呢?
取决于两个元素:
- 1.如果此时的斜率越大,说明越陡峭,则移动的距离就越大,若斜率越小,则移动的距离就越小。
- 2.还取决一个常数项 η(事先定好的数值),称为learning rate。
上述例子中,我们应向右移动,移动的长度为η·w0的斜率.
所以新的点w1 = w0 + η·w0的斜率。
image.png
然后一直重复上述的步骤,不断进行下去,最终将到达一个低谷,称为Local optimal 局部最优值,此点的微分为0,所以参数就不会再更新下去。所以有可能找不到全局最优解,但这个问题在regression中不是问题,因为在linear regression 线性回归上是没有局部最小值的。
image.png
那如果是有两个参数呢?How about two parameters?
其实跟一个参数是相同的,我们初始随机选择两个参数,一个为w0,一个为b0,分别计算w=w0时L对w0的偏微分,b=b0时L对b0的偏微分,然后分别更新w0参数得到w1,更新b0得到b1,反复重复此步骤。
拓展:两个参数的偏微分组成的向量,就是Gradient 梯度。

两个参数的函数图像为三维,如下图。

红色箭头其实就是等高线的法线方向。
但是梯度下降法有一个让人担心的地方,如果你的function长得是这样子?

但是在linear regression不需要但系这个问题,因为他没有局部最优解。
结果怎么样?
最终得出的结果 b = -188.4 w = 2.7,我们将此函数画出。

现在我们再抓新的10只宝可梦来测试这个model。

得出我们的训练误差为35.0 也就是每个点到红线的距离之和。
有没有办法做的更好?
我们重新设计一个model,表达式如下:

方法还是如上,最终结果


可见,效果比第一个model更好!
让我们再次优化上述model,我们再加入三次方。

结果:


我们发现,这个模型仅仅比上一个模型好那么一点点。让我们再将model变得更复杂一点。


此时我们的误差为14.9,但是拿新的10只宝可梦来测试发现误差达到了28.8,结果竟然变得更差了!

将模型再变得复杂一点!

此时我们会得到这么一张图像:

可见,为了使10只训练的宝可梦达到误差最小,图像竟然成了这个样子!但这个图像符合真实情况吗?如果用这个model来测试新的10只宝可梦,那结果却错的离谱!
到此,我们总结以下,如果把以上五个模型在训练集上的所有误差值画成一个图像,将得到以下图像:

但是在测试集上的结果却如下图:

所以我们的结论,虽然越复杂的model在train data上能得到更好的结果,但是在test data上却不一定得到好的结果,这个现象就叫做Overfitting 过拟合,所以我们应选一个不需要太复杂对测试集结果也刚刚好的model!由上图所只,对于这个例子我们应该选第三个model!
如果我们再多抓一点宝可梦呢?那么我们会发现之前的model又烂掉了,你会得到如下的规律图像:

所以设计model时候只考虑cp值是不够的,因为cp值受物种的很大影响,所以我们需要重新设计一下model了。
那么我们的model应该是这样子的:

对于不同的物种,我们就应该用不同的function,但问题又来了,这么多function,还能算linear function吗?该如何求微分呢?其实只要改下一下形式就能表示!

最重要的 δ 参数,意思是如果括号内的等式成立,那么他就为 1,否则就为0。
当我们考虑到宝可梦分类,也就是 feature时,得到的结果如下:

可见效果比之前的都要更好,但是有几个点还是离直线有点距离,造成这个现象也是有许多可以解释的原因的,比如说宝可梦进化时会加一个随机的值?或者进化后的CP值跟进化前hp有关?身高有关?又或体重有关?但具体是什么原因我们不得而知。

没关系,我们还有一招,就是把你所有觉得有关的feature都加进去

先对每个种类用不同的function,后再加上hp的参数,身高的参数以及体重的参数。此时这个模型看起来已经够完美了吧,这个模型在训练集上的误差只有1.9,但对于测试集,结果又爆掉了,误差竟然到了102.3。显示又是过拟合了。

此时我们该怎么办呢?此时我们又引入一个新的方法,叫做regularization。
Regularization 正则化
此方法是重新定义我们当初的Loss function,我们原来的Loss function只考虑了误差这一件事,现在我们把L改下成如下:

此时如果想让我们的L得到的结果最小,那么wi的值就应该很小,此时我们的function图像是更平滑的。为什么更平滑的会更好呢?这意味着这个function对输入的变化不敏感,因为如果输入xi出现变化,但wi很小,所以最后的结果y也不会差的很多。这样如果一些noise干扰到我们的输入,那么这个function受到的干扰程度会很小。
正则化后的模型结果如下:

如果λ,越大,说明function越平滑,但太平滑也不好,因为太平滑就是一条直线了,什么也干不成,所以我们需要一个合适的wi和一个合适的λ,不能太看重wi也不能太看重function的平滑程度,由上图可以看出,此时我们选λ=100时效果最好。
网友评论