第十三节多项式回归之维度爆炸和过拟合html
接下来咱们进入下一个问题,叫多项式回归,它其实一点都不复杂。假如对于非线性的数据点,咱们如何用现有你已经知道的知识来拟合?算法
举个例子,人的年龄跟去医院的次数是一条线性的这么一个规律吗?应该不是,由于年轻的时候很长一段时间不怎么去医院,随着年龄增大,可能慢慢重视身体了,或者身体有一些小问题了,去医院的频率愈来愈高,相似线性增加的关系。网络
但生活中的状况它并非一个非线性的关系。随着时间的增加,有可能会造成一个抛物线的形式往上走,对于这样的数据点,它在抛物线的左右有一点震荡。假如用线性回归来拟合,只能作出这么一个线性的凑凑合合的结果来,而不可能获得一个真正这事物自己的规律,那怎么办呢?算法不许变,你有没有什么好办法?app
好比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,性能
如今须要增长出三个特征来,组合特征即X1^2,X2^2,X1*X2。即:学习
这就是二阶多项式升维。因此经过多项式回归,能够将现有的特征进行一些组合。假如你原来就有X1,X2,X3,你须要多加几项,能够看看有多种组合方式,X1X2,X2X3,X1X3,X1^2,X2^2,X3^2 ,这是几种?加了六个。假设说二次方不够用,我把它升级到三次方,X1*X2*X3,X1^2 * X2,X1^2 * X3,多了去了,三个维度尚且如此,一般有几百个维度,又要怎么升?因此说多项式回归是一个看起来很美好的故事。可是实际上随着数量的增多,阶数的升高,它是爆炸式的增加的。因此说虽然升维是一个最简单的,处理非线性数据集的问题,可是怎么升才能有操做性呢?一般是经过某种方法来评估哪些特征对最后的影响最大。保留好比前十个影响最大的特征,让他们彼此组合去升一些维度,而不是用所有的特征互相随机组合这样升维,但即便这样效果也不必定好,因此说升维只是一个最简单的处理非线性问题的方式。url
再举一个升维的例子, 假如你如今桌子上有红豆和绿豆,红豆攒了一个圈,在里边攒成一个圆形,绿豆都围在红豆的外边,这会画一条线,把红豆绿豆分开,直接划线是没法分开的,可是若是你用力拍了一下桌子,红豆和绿豆都被你拍起来了,由于它们的重量不一样,红豆飞得高一点,绿豆飞得低一点,再飞起来的这一瞬间,时间定格了,你差一张纸进去,在三维空间中它是否是就可分了?spa
因此每每在低维空间中线性不可分的数据集在高维空间中必定是可分的,可是取决于你怎么给它升到一个最好的高维空间里面是很麻烦的。假如利用多项式回归的话,它是可分,可是升维的代价太大了,会有维度爆炸的问题,因此只可以选择一些各类各样的间接的方式,好比刚才说的选择最重要的数据的维度,给它们进行特征的组合进行升维。但怎么知道哪些维度重要,哪些维度不重要?咱们在从此会讲一系列决策树的算法,自己可以输出这个维度对于最终结果的影响是大仍是小,它能把全部维度的重要性排一个顺序,会让你优先选择那些真真正正更大程度上影响最终结果的那些维度,把它们进行组合进行升维来达到解决非线性数据不可分的问题。
多项式回归自己不多使用,虽然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正则。下一节,咱们会讲解正则的概念。