前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 8-2 scikit-learn中的多项式回归与pipeline

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

作者头像
触摸壹缕阳光
发布2019-12-16 15:09:52
1.7K0
发布2019-12-16 15:09:52
举报
文章被收录于专栏:AI机器学习与深度学习算法

本系列是《玩转机器学习教程》一个整理的视频笔记。在上一小节介绍了多项式回归的基本思想,本小节主要介绍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这种方式。有了多项式回归,就可以对非线性数据进行拟合,不过这个拟合的过程是有陷阱的,下一小节会介绍这个陷阱具体是什么,从而引出对于机器学习中最为重要的~模型泛化相关的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档