sklearn-使用多项式特征建立分类模型

举报
Yin-Manny 发表于 2021/11/22 18:49:09 2021/11/22
【摘要】 使用sklearn搭建了分类模型,进行了如下分析: (1)描述10折交叉验证对数据集的处理; (2)描述所使用的线性模型; (3)描述训练模型所使用的算法; (4)分析模型训练结果,包括训练误差和测试误差; (5)总结模型训练过程中的收获。
  • 描述10折交叉验证对数据集的处理:

首先将数据集分为训练集和测试集。10折交叉验证则是将训练集分为10个均等的更小的集,对于10个集(折叠)中的每一个,选其作为验证集,用来计算性能度量,例如准确性,MSE,R2等,而其余9个集作为训练集,用来训练模型。10折交叉验证报告的性能度量则是循环中计算值的平均值。当实验似乎成功时(比如参数已经调地使性能度量平均值比较可观),就可以在测试集上进行最终评估。

如果直接在训练集上训练模型,在测试集上计算性能度量,就会存在测试集过度拟合的风险,因为可以调整参数直到估计器达到最佳性能。这样,有关测试集的知识可能会“泄漏”到模型中,并且评估指标和性能度量不再体现泛化性能。而在数据集上除了分出训练集和测试集,还单独分出验证集,会大大减少可用于学习模型的样本数量,还会导致结果可能取决于对(训练、验证)集的特定随机选择。因此使用10折交叉验证的方法对数据进行处理,解决了上述2个缺点。

手写处理代码为:

1.png

返回值为score和MSE,可以通过比较不同模型参数的这两个返回值来得到最佳参数,从而实现10折验证法。

然而在需要调参的线性回归函数里,都内嵌了10折交叉验证法,而且经过了优化,比自己写代码效率更高,消耗内存更少,所以我们最终使用的是内嵌的10折交叉验证法。

2.png

  • 描述所使用的线性模型:

先对数据进行预处理,再调用PolynomialFeatures()函数产生多项式特征,再放到线性函数中去训练线性回归模型。

下面举一个具体的例子:

预处理:调用PowerTransformer(method='box-cox')函数进行预处理,由于该函数需要特征都为正数,而所给数据集的特征里有几个为0,因此将数据集都加上1e-9就可以调用该函数,由于1e-9很小,所以几乎不产生误差。

产生多项式特征: 调用PolynomialFeatures(3,interaction_only=False)函数产生多项式非线性特征。

从X=(1  X1  X2  X3)

转变为:X=(1  X1  X2  X3  X1X22  X32  X1X2  X1X3  X2X3  X13  X23  X33  X12X2  X1X22  X22X3  X2X32  X32X1  X3X12  X1X2X3)。

调用线性函数:由于特征数量多达20个,所以需要进行特征筛选,找出其中的主要特征,同时通过融入主要特征可以防止过拟合,因此在各种线性模型中选择了LassoCV(),它是一个带有附加正则化项的线性模型,它解决了带L1正则项的最小二乘法最小化问题,即

3.png

描述训练模型所使用的算法;

根据官方文档,使用的优化算法是坐标下降法(Coordinate descent. 坐标下降法是一种非梯度优化算法。算法在每次迭代中,在当前点处沿一个坐标方向进行一维搜索以求得一个函数的局部极小值。在整个过程中循环使用不同的坐标方向。坐标下降法基于的思想是多变量函数F(x)可以通过每次沿一个方向优化来获取最小值。与通过梯度获取最速下降的方向不同,在坐标下降法中,优化方向从算法一开始就予以固定。例如,可以选择线性空间的一组e1,e2…,en作为搜索方向。 在算法中,循环最小化各个坐标方向上的目标函数值。亦即,如果xk已给定,那么, xk+1的第i个维度为:

4.png

因而,从一个初始的猜测值x0以求得函数F的局部最优值,可以迭代获得x0,x1,x2,…的序列。通过在每一次迭代中采用一维搜索,可以很自然地获得不等式F(x0)>= F(x1)>= F(x2)>=…。可以知道,这一序列与最速下降具有类似的收敛性质。如果在某次迭代中,函数得不到优化,说明一个驻点已经达到。

LASSO函数推导过程:

由于LASSO在尖点是奇异的,因此传统的梯度下降法、牛顿法等无法使用。因为坐标下降法基于的思想很简单,就是当面对最小化一个多元函数的问题时,我们每一次迭代的时候只改变一个目标变量的值。也就是固定其他变量不动,只在该变量的维度上寻找一个使函数最小的值,所以在此使用坐标下降法。

5.png

  • 分析模型训练结果,包括训练误差和测试误差;

我们有4种预处理方法,4个线性函数,4种多项式非线性特征,通过排列组合的方式产生了64种线性模型。

4种预处理方法:

6.png

4个线性函数:

7.png

4种多项式非线性特征:

8.png

我们把数据集按照6:4分为训练集和测试集,在训练集上通过10折交叉验证法来拟合最佳参数,并分析训练误差。再在测试集上进行预测,并分析测试误差。有些模型效果显著,另一些泛化能力比较一般,下图展示了几种具有代表性的模型的误差分析,并可视化了真实数据和预测数据,通过散点的颜色来估计模型拟合的好坏。

效果最好的:

9.png

10.png

11.png

效果一般的:

12.png

13.png

14.png

效果最差的:

15.png

16.png

17.png

通过对比可以知道,不同模型的效果还是有显著的差别,而且测试误差会比训练误差大。

 

  • 总结模型训练过程中的收获。

选择使用什么样的特征比选择使用哪种回归模型更重要:最开始使用的是原始特征,换了很多种线性回归模型,结果无论是普通的LinearRegression(),还是带有正则项且自动选择超参数的LassoCV(),RidgeCV(),ElasticNetCV(),所得到的MSE差别不大,后者只比前者少0.1左右,MSE稳定在3.8左右。而当调用PolynomialFeatures()产生多项式特征时,MSE直接从3.8减少到0.9,可以说是质的飞跃!所以有时候与其在一个方向去做提高不大的优化,不如去找更加符合数据的模型,比如做一些特征工程,从不同的角度去完成任务,说不定可以有意想不到的突破。

预处理对特征进行缩放,映射等处理,可以提高代码的运行效率。如果选用的方法符合数据,也具有一定的减小MSE的能力;但是如果选用的方法不符合数据,那么可能还会导致MSE增大,因此需要先观察数据并尝试多种预处理方法。

经过很多试错和小的教训,我发现当需要调用一些库的函数时,阅读官方文档是最合适的方式,因为官方文档会把函数的参数,返回值,属性写的非常清楚,还会举例子,还会推荐类似的函数,这些都是写代码的一手资料,是最有价值的。而去StackOverflow或者CSDN上找需要的知识,可能会看到不同的blog有不同的理解,而且所使用的都是一些最常用的参数和属性,可能会遗漏一些自己想要的知识点,最后可能会做很多无用功。但是这些平台也会有更多的代码示例,借鉴好的代码示例也会使得工作事半功倍。因此学会权衡在官方文档和StackOverflow上找自己想要的知识是必要的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。