本系列是《玩转机器学习教程》一个整理的视频笔记。本章主要介绍多项式回归的相关知识,并通过多项式回归引入模型泛化的相关概念。本小节主要介绍解决非线性回归问题非常简单的改进方式多项式回归,并通过编程实践来看看如何实现多项式回归。
01
多项式回归
前面介绍线性回归的时候,对数据有一个很强的假设,假设处理的数据背后存在线性关系,这就导致了线性回归模型很大的局限性,因为在实际应用场景中,具有线性关系这样强的假设的数据集相对来说还是比较少的,更多的时候数据集之间拥有非线性的关系。
接下来使用非常简单的手段改进线性回归算法,使得线性回归算法可以对非线性的数据进行回归分析,进而进行回归预测,这种方法就是所谓的多项式回归。
先来简单回顾一下线性回归模型:
之前学习线性回归的过程中,对于这些线性关系比较强的数据集,想要寻找一条直线,这条直线能够尽可能多的拟合这些数据。如果在只有一个特征的简单示例中,相应的这根直线我们管它叫做y = ax b,其中x就是样本特征,而a和b就是线性回归模型需要求出的参数。如果是下面这种分布的数据集:
上面的数据很明显具有很强的非线性关系,虽然我们可以直接使用线性回归的方式来拟合这些数据,但是很明显拟合的效果不会太好。如果我们使用一个二次曲线来拟合这些拥有非线性关系的数据集,可能效果会更好。
对于一个二次曲线而言,假设所有样本也只有一个特征,相应的方程可以写成y = ax^2 bx c。
对于y = ax^2 bx c这个式子,我们称为二次方程,这是从x的角度来理解。如果我们从另一个角度理解的话,把x^2理解成一个特征,x理解成另外一个特征,换句话说,原来我们的样本特征只有一个x,现在把这个样本看成是拥有x^2和x两个特征的数据集,多添加了一个x^2的特征,如果从这个角度理解的话,其实y = ax^2 bx c依然本身就是一个线性回归的式子,当然这是把x^2和x都当成了样本的特征。但是从x角度来说,y = ax^2 bx c依然是一个二次的非线性方程,这种方式就是所谓的多项式回归。
其实简单来说就是为样本增加了一些特征,这些特征是原来样本中某些特征的多项式项,上面为了方便仅仅引入了二次项。由于前面的例子仅仅有一个特征,因此增加的二次项特征,仅仅是这个单一特征的平方的结果。增加了这些特征之后,就可以使用线性回归的思路来拟合原来的数据,但是本质上,相当于求出了对于原来特征而言这种非线性曲线。
02
编程实现多项式回归
首先创建一些虚拟的数据集:
很显然样本特征与输出值之间是非线性的关系,通过前面的介绍知道,在处理这种非线性的数据集的时候使用线性回归模型的话,效果会非常差,接下来,先使用前面章节介绍的线性回归解决非线性数据集:
接下来使用多项式回归的思路,也就是添加多项式特征的方式。由于例子中的样本都是单个特征的,因此引入这个特征的平方作为新的特征,新的样本不仅具有原来的单一特征,而且还具有了新的平方项特征。
接下来用这个新的数据集进行线性回归的训练。
出现上面这种乱序是因为在创建数据集的时候生成特征x是随机生成的,而plt.plot(x, y)绘制的是点x到点y的直线。如果想要绘制一条拟合曲线的话,将x从小到大绘制即可,最终就可以绘制成一条拟合曲线。
我们将原来的X数据集添加了一个特征,这个特征是我们自己造的特征,这个新的特征就是原来样本特征进行平方的结果,当我们添加了这个特征之后,从x角度来看就形成了一条曲线,显然这条曲线对数据集的拟合程度是更好的。
接下来,输出一些系数:
对于新的样本来说,第一列是原来样本的特征,第二列是平方后的特征项,因此通过coef_打印出的系数,第一个系数是原来样本特征的系数,第二列是平方后的样本特征的系数,对于y = ax^2 bx c而言,coef_打印出的第一个系数就是b,第二个系数就是a。我们生成数据的方程和拟合的结果基本上是吻合的,当然其中会有一个偏差,这是因为我们在生成数据的过程中添加了一些噪音,在拟合的时候有可能考虑到了这些噪音,所以并不完全等于创建数据集时候的方程系数。
其实多项式回归在机器学习算法上并没有新的地方,完全是使用线性回归的思路。关键在于为原来的数据样本添加了一些新的特征,而这些新的特征是在原来样本特征的基础上相应的多项式组合的结果,采用这样添加特征的方式我们就可以解决非线性的问题。
与此同时这个思路也需要注意,在上一小章中PCA算法对数据集进行降维处理,而在这一章的多项式回归,很显然是做一件相反的事情,多项式回归是将原来的数据集添加一些特征,也就是升维的操作,这样可以更好的拟合高维的数据。这种升维的思路在后面学习SVM的时候还会看到,在机器学习中有的时候需要降维有的时候需要升维。