大白话5分钟带你走进人工智能-第十三节多项式回归之维度爆炸和过拟合

                                                                    第十三节多项式回归之维度爆炸和过拟合

接下来我们进入下一个问题,叫多项式回归,它其实一点都不复杂。假如对于非线性的数据点,我们如何用现有你已经知道的知识来拟合?

举个例子,人的年龄跟去医院的次数是一条线性的这么一个规律吗?应该不是,因为年轻的时候很长一段时间不怎么去医院,随着年龄增大,可能慢慢重视身体了,或者身体有一些小问题了,去医院的频率越来越高,类似线性增长的关系。

但生活中的情况它并不是一个非线性的关系。随着时间的增长,有可能会形成一个抛物线的形式往上走,对于这样的数据点,它在抛物线的左右有一点震荡。假如用线性回归来拟合,只能做出这么一个线性的凑凑合合的结果来,而不可能得到一个真正这事物本身的规律,那怎么办呢?算法不准变,你有没有什么好办法?

比如X轴是年龄,Y轴是次数,因为原来数据集是不是就一个X是age?,我建模出来是Y=W*age+b,算法不去变的抢矿下,你怎么样能够让它去拟合这种非线性的数据?我们对数据做一些手脚,我们偷梁换柱一下,我原来拿到的是一列age,我把age平方一下,把平方完了的结果线性回归的算法里。此时它的建模实际上还是y=w1*x1+b,虽然它形式上还是线性的,但是此时的X1是什么?age的平方,实质上就变成了W*age^2+b。假如这个坐标轴不是age是X1的话,它是不是仍然是一条直线?但是你把它映射到age这个空间里面去,它实际上是不是就变成了一条曲线了? 这就是一种升维的方式。增加了一个维度,人为构造出来的一个维度。它令你这个模型能拟合非线性的数据了。

其实非线性这个东西特别的讨厌,各种各样的算法,在如何处理非线性数据集上想尽了自己的办法,火爆到现在的深度神经网络,就是通过非线性的激活函数,把这个非线性能力赋予给了模型,让它能拟合一些非线性数据,既然多项式回归这么好,干嘛还要发明深度神经网络呢? 为什么不通通的都是这种多项式的方式来做,因为它会遇到另一个机器学习这个世界里面特别让人讨厌的,并且又避不开的问题,叫做维度爆炸(Curse of Dimensionality)。Curse什么意思?诅咒,说明维度数量给你带来的这种挥之不去的缠绕在你身边的烦恼。

我们回到多项式回归上面来。上面的例子实际上是一种偷梁换柱,把X变成X平方。比如有一个X1,1个特征,现在需要弄出两个特征来,一个是X1,一个是原来的X1的平方,你给它改个名叫X2。假如原来有两个特征,X1,X2,

                                         \hat{y}(w, x)=w_{0}+w_{1} x_{1}+w_{2} x_{2}

现在需要增加出三个特征来,组合特征即X1^2,X2^2,X1*X2。即:

                                      \hat{y}(w, x)=w_{0}+w_{1} x_{1}+w_{2} x_{2}+w_{3} x_{1} x_{2}+w_{4} x_{1}^{2}+w_{5} x_{2}^{2}

这就是二阶多项式升维所以通过多项式回归,可以将现有的特征进行一些组合。假如你原来就有X1,X2,X3,你需要多加几项,可以看看有多种组合方式,X1X2,X2X3,X1X3,X1^2,X2^2,X3^2 ,这是几种?加了六个。假设说二次方不够用,我把它升级到三次方,X1*X2*X3,X1^2 * X2,X1^2 * X3,多了去了,三个维度尚且如此,通常有几百个维度,又要怎么升?所以说多项式回归是一个看起来很美好的故事。但是实际上随着数量的增多,阶数的升高,它是爆炸式的增长的。所以说虽然升维是一个最简单的,处理非线性数据集的问题,但是怎么升才能有操作性呢?通常是通过某种方法来评估哪些特征对最后的影响最大。保留比如前十个影响最大的特征,让他们彼此组合去升一些维度,而不是用全部的特征互相随机组合这样升维,但即使这样效果也不一定好,所以说升维只是一个最简单的处理非线性问题的方式。

再举一个升维的例子, 假如你现在桌子上有红豆和绿豆,红豆攒了一个圈,在里边攒成一个圆形,绿豆都围在红豆的外边,这会画一条线,把红豆绿豆分开,直接划线是无法分开的,但是如果你用力拍了一下桌子,红豆和绿豆都被你拍起来了,因为它们的重量不同,红豆飞得高一点,绿豆飞得低一点,再飞起来的这一瞬间,时间定格了,你差一张纸进去,在三维空间中它是不是就可分了?

所以往往在低维空间中线性不可分的数据集在高维空间中一定是可分的,但是取决于你怎么给它升到一个最好的高维空间里面是很麻烦的。假如利用多项式回归的话,它是可分,但是升维的代价太大了,会有维度爆炸的问题,所以只能够选择一些各种各样的间接的方式,比如刚才说的选择最重要的数据的维度,给它们进行特征的组合进行升维。但怎么知道哪些维度重要,哪些维度不重要?我们在今后会讲一系列决策树的算法,本身能够输出这个维度对于最终结果的影响是大还是小,它能把所有维度的重要性排一个顺序,会让你优先选择那些真真正正更大程度上影响最终结果的那些维度,把它们进行组合进行升维来达到解决非线性数据不可分的问题。

多项式回归本身很少使用,虽然sklearn那里面也封装了polinomial多项式回归,但是在这儿咱们讲它只是提出升维的概念,以及接下来我要讲的更重要的一个过拟合的概念。

关于多项式回归,下面有一张图,蓝色的点是你采集到的数据,如果没有这些曲线的话,直接让你做一个线性回归,你这条线也许会是图中红色画的直线。

但是如果对它进行升维的话,我们看着不同颜色的线,三阶升维,相当于假如原来只有一个X,增加维度X^2和X^3,等于新创造了两个维度出来,会赋予它绿色线的能力,这是三阶升维能做到的最好的一条线。

四阶升维,比三阶升维已经更好一些了。如果你能达到五阶的升维,那么实际上你看,基本上是不是已经接近这条蓝线是什么?叫ground truth,是生成这些数据点用的真实的参数,它就越来越接近于真实的参数。其实它的背后也是泰勒展开,它的展开就是把一个东西展成一个X,X^2 ,X^3 。。。,所以任何一个函数甭管多复杂,它也可以展开为X的一直累下去次方的多项式,展开的越多越像原函数。也就是说无论你这个点有多复杂,只要我升维,只要我多项式的阶数升得足够高,我一定会完美的拟合原来的数据,这个是多项式升维。

所以多项式回归有这么几个问题,一是维度爆炸的问题。你通过多项式升维的方式处理的数据,是不是刚才只有一个X还好说,你X一旦多了,一定是行不通的。直接就溢出了,可能你得到一个荒唐的计算时间。另外一个就是过拟合问题。这个是在机器学习里面又一个非常讨厌,也没有完全解决,一直会跟到最后的一个问题,目前只能将就的减轻它的影响 。

比如对于房价来看,如果你不对它进行任何升维,直接画一条直线的话,其实对于房价曲线的感觉没有找到。如果你对它升维了一次,会发现虽然没有拟合的非常好,但是大概是这个趋势,如果再升维,升维升过了,或者说一些不相关的维度被弄进来了之后,你会发现它为了完美地在训练集上表现到最好,去刻意的讨好训练题上的数据了,反倒把真实的规律给搞掉了。 这个就相当于模型想多了。

再比如说有这么一个训练集,三个特征,一个是今天的湿度,一个是今天的温度,一个是今天我们家关没关窗户,来判断今天下雨不下雨,按理说下雨不下雨,跟你们家关窗户没关窗有关系吗?我们都知道是没关系的,但是你丢给计算机的话,计算机认为它是不是也是有可能有关系的?那么计算机做了一个什么事儿,虽然这一分类问题,它还是要追求损失函数最低,越低越好,哪怕损失函数只是一点点的改变,也会朝着这个方向而去。假如关没关窗的权重设为零的话,此时损失函数是0.03,但当把关没关窗户的影响设为0.5的时候,损失函数从0.03减为了0.029999999。但你去观察训练集的话,就采集的数据来说,可能仅仅是因为偶然关窗户的比没关窗户的下雨的天数多了一天,所以也会给开关窗户配一个权重。 假如不幸多了20天,更厉害了,算法会认为这个窗户影响更大一点了。因为算法是朝着损失函数最小的目标去的,所以把开没开窗户这个特征配完权重之后,即使损失函数就减低了这么一点点,傻乎乎的计算机你告诉他,结果就是要把损失函数给我减到最低,所以梯度下降就开始梯度了,最后梯度了半天,发现关窗户的权重被设计大了,这种情况就叫做过拟合。因为算法过于的去追求损失函数一定要最低,而把模型搞复杂了,本来无关的一些东西也被它判定为有关系了。 也许模型就会搞出来更复杂的例子,当你们家关了窗户且你又没吃饭的时候,发现下雨的次数多了一点,是不是就会给关窗户一个比较大的+W,给吃饭一个比较大的-W,假如你维度更多,它是不是就想的越来越多了,最后把一些乱七八糟的没有用的这些东西全都给学出W了,假如又加了十个维度,吃没吃饭,穿了黄衣服,穿了绿衣服,然后今天开没开车,加了一堆无关的东西进来,最后模型在看的时候发现你今天没关窗户,又开了车,又穿了黄衣服的时候真下雨了。那么实际上它是无关的,但由于你的维度特多,他会把这些东西都配上权重,而且很有可能配的权重还不少。它发现当这些东西组合起来之后会很大程度的影响,最后下不下雨,它会把权重配的很大。

能够理解过拟合的本质怎么来的吗?从多项式的角度你可以考虑它升维升太高了,不从多项式的角度,即使你没做任何升维,你收集上来的这些数据,有一些跟最后的结果是无关的,这些无关就会产生过拟合。

那么我们怎么样避免这种错误,原因在于算法吗,肯定不是,你就让人家做梯度下降,把损失函数降到最低点了,怎么办?说明我们的这个东西有点太绝对了,我光让它考虑损失函数,你能不能在尽量保持损失函数小的同时,让模型简单一点,当然也别为了简单给我弄成瞎蒙瞎猜了,要做到尽量让损失函数小的同时让模型再给简单一点。这个是我们想要的东西。

于是我们有了解决过拟合的一个通用方法。L1,L2正则。下一节,我们会讲解正则的概念。

 

猜你喜欢

转载自www.cnblogs.com/LHWorldBlog/p/10748734.html