机器学习入门 8-2 scikit-learn中的多项式回归与pipeline

2019-12-16 15:09:52 浏览数 (1)

本系列是《玩转机器学习教程》一个整理的视频笔记。在上一小节介绍了多项式回归的基本思想,本小节主要介绍sklearn是如何对多项式进行封装的,之后介绍一种类似Linux中"|"管道的Pipeline类。

01

sklearn中的多项式回归

同样使用上一小节具有一个特征的虚拟数据集,X以及对应的y。

在上一小节介绍的多项式回归中,我们只是在调用线性回归之前改造了我们的数据集X,在原来样本特征的基础上添加了一些多项式特征,根据sklearn的封装原则将添加多项式特征这个过程添加到了sklearn的preprocessing这个包中,在前面对数值进行归一化的时候也使用了preprocessing包,这个包中包含了对样本数据进行预处理的方法。从上一小节中也可以看出,其实多项式本质上就是为样本添加一些特征,当然这也是对样本数据集的预处理过程,因此如果想在sklearn中使用多项式回归,需要导入sklearn中的preprocessing包。

同样是对数据进行预处理的过程,因此与之前进行归一化的StandardScaler类使用方法一样。

这里需要注意创建对象的时候需要指定degree参数,这个参数表示的是要对原本的数据集最多添加几次幂的特征,在上一小节添加多项式特征的过程相当于最多添加了二次幂,因此将degree参数设置为2,原来特征是一次幂特征,之后添加二次幂的特征。

接下来打印输出看一下添加的多项式特征。

打印转换添加多项式后样本的shape,并不是100 * 2的矩阵,而是100 * 3的矩阵,打印添加多项式后样本X2的前5行:

  1. 第一列为一排1,这一排1可以看成是加入了0次方的样本特征;
  2. 第二列就是我们原来的样本特征,这一列代表的是一次方的特征;
  3. 第三列就是二次方对应的特征;

通过sklearn的PolynomialFeatures,获得了多项式特征相应的数据集。有了多项式数据集,下面的过程就非常简单了,只需调用线性回归模型对添加多项式的数据集进行回归分析即可。

这里需要注意的打印输出的系数中第一个值为0,表示样本特征中第一列所有的数据拟合的结果为0,最终得到的系数以及截距和我们生成数据时基本吻合。

这里还需要注意一下,PolynomialFeatures这个类的使用的方式是fit之后transform,在前面StandardScaler以及PCA使用的也使用fit,transform这样类似的方式,他们的本质其实都是针对现有的样本数据X,进行相应的变形。这种类似的过程都被sklearn封装成了fit,transform的使用方法。

到现在为止举的所有例子都是针对拥有一个特征的样本数据,现在稍微复杂一下,假设此时样本数据中有两个特征。

将数据集转X换成最多包含二次幂的数据集X2。接下来打印输出一下新的数据集。

数据集的shape从原来的(5, 2)变成了现在的(5, 6)。对于这6个特征列而言:

  1. 第一列依然是1,它对应的其实就是0次幂;
  2. 第二列以及第三列对应的是原来的样本矩阵X中的两个特征,也就是他有两个一次幂的项,这是和之前介绍的有所不同,因为之前所举的例子都是拥有一个特征的样本,因此添加多项式之后仅有一列为一次幂项,但是此时由于原始样本中有两个特征,因此添加多项式后会有两列一次幂项。简单来说,一次幂项个数就是原始样本中的特征数;
  3. 第四列和第六列,第四列是原始样本X中第一列特征的平方结果,第六列是原始样本X中第二列特征的平方结果;
  4. 第五列其实是原来样本X中的两个特征相乘的结果;

因此对于二次幂的特征,如果原来样本中有x1和x2两个特征的话,那么最终会生成三列二次幂的特征,分别是x1的平方,x2的平方以及x1* x2。

如果量degree参数设置为3的话,添加的多项式特征就会越多。

下面来分析一下会有那些项:

也就是说原始样本经过PolynomialFeatures之后,生成的样本数据中的多项式特征将呈现指数级的增长,这样的特性本身会使PolynomialFeatures非常的强大,因为他涉及到了所有可能的多项式特征,不过与此同时也会带来一些问题,在下一小节中会介绍。

02

pipeline管道

本小模块介绍一个在具体编程实践的时候,可以非常方便的使用多项式回归的方式,也就是所谓的Pipeline。Pipeline的中文是"管道"的意思,有点类似于Linux中的"|"管道符号。

使用多项式回归的过程:

  1. 首先对于原始的样本数据,使用PolynomialFeatures类生成多项式样本的数据;
  2. 进行数据的归一化处理。之前进行多项式回归,都是将生成的多项式样本数据直接传给了LinearRegression,当生成多项式degree参数设置比较大的话,比如100,生成样本的特征之间的差距就会非常的大,之前介绍的在线性回归中使用梯度下降的过程中,如果数据的分布太不均衡,会导致梯度下降搜索的过程非常的慢,此时第二个步骤最好进行一下数据的归一化处理,也就是使用Standardscaler;
  3. 最后使用线性回归模型进行回归分析。

多项式回归分为多项式的特征,数据的归一化以及线性回归三个步骤。而Pipeline可以帮助我们将这三个步骤合在一起,使得我们每一次在具体的调用的时候,不需要不停的重复着三个步骤。

创建Pipeline对象的时候传入的参数是一个列表,这个列表传入的就是这个管道相应的每一个步骤对应的那个类,这个类是以元组的形式传入的,元组对应着两个元素:

  1. 元组第一个元素是一个字符串,可以随便命名,但是最好能够表达对应的实例化类的名称;
  2. 元组第二个元素是实例化的类;

使用Pipeline创建了一个多项式回归poly_reg的管道,传给poly_reg管道的数据就会沿着三步依次的进行下去,Pipeline的使用方式和sklearn中的其他算法是一样的,直接使用fit函数就可以了。使用这种管道的方式,将多项式回归的三个步骤合在了一起,可以非常方便的直接这样调用,而不用每一次都依次的进行三个步骤,相对来说还是非常方便的。

sklearn中并没有提供多项式回归相应的类,而通过Pipeline这个方式可以很方便直接的创建我们自己的多项式回归的类。在后面的课程中为了让代码更加简洁,对于多项式回归很多时候会直接使用Pipeline这种方式。有了多项式回归,就可以对非线性数据进行拟合,不过这个拟合的过程是有陷阱的,下一小节会介绍这个陷阱具体是什么,从而引出对于机器学习中最为重要的~模型泛化相关的知识。

0 人点赞