前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 11-5 SVM中使用多项式特征和核函数

机器学习入门 11-5 SVM中使用多项式特征和核函数

作者头像
触摸壹缕阳光
发布2020-07-08 15:24:24
3.1K0
发布2020-07-08 15:24:24
举报
文章被收录于专栏:AI机器学习与深度学习算法

全文字数:2022字

阅读时间:10分钟

前言

本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍两种能够使SVM算法解决非线性数据集的方法,使用多项式特征以及使用多项式核函数。

a

构造非线性数据集

解决非线性数据集的分类问题最典型方法是使用多项式特征,简单来说就是为原始的样本点添加多项式特征。比如在逻辑回归算法中使用多项式特征以解决非线性数据集的分类问题。类似的,如果想让SVM算法能够解决非线性数据集的分类问题同样可以使用添加多项式特征的方式。

为了简单直观的模拟非线性数据集,本小节使用sklearn提供的make_moon函数来生成非线性数据集。sklearn中提供很多能够生成数据集的函数,这些函数统一放在datasets包下并以make_xx函数命名。

既然make_moon是生成数据集的函数,我们可以传入参数来生成指定的数据集。比如想要生成1000个样本点,可以使用下面的代码:

代码语言:javascript
复制
n[1] X, y = datasets.make_moons(n_samples=1000, shuffle=True, noise=None, random_state=None)
In[2] print(X.shape)
In[3] print(y.shape)

(1000, 2)
(1000, )

make_moon函数有很多参数:

  • n_samples: 整型,可选,默认为100,产生样本点的数量;
  • shuffle: 布尔型,可选,默认为True,是否将样本打乱;
  • noise: 浮点型或None,可选,默认为None,加到数据集里面的高斯噪声的标准差;
  • random_state:可选, 随机种子;

绘制make_moon函数生成的100个样本点:

通过绘制的结果可以看出数据集的分布呈现两个半月形状,这也是make_moon函数名的由来。不过此时数据集呈现的半月形分布太过于规则,我们希望数据集有一定的扰动,所以在使用make_moon函数生成数据集的时候传入noise参数为数据集添加高斯噪声。如果将noise参数设置为0.15表示为数据集添加标准差为0.15的高斯噪声。同时为了保证每次实验结果都一致,设置随机种子random_state参数值为666。

样本点整体分布依然呈现半月形,但是由于添加了高斯噪声,生成了比较随机的样本点,因此整个样本点看起来比较混乱。添加高斯噪声的数据集就是我们本小节实验要使用的非线性数据集。

b

使用多项式特征的SVM

SVM算法处理非线性数据集可以使用多项式特征。首先为数据集添加多项式特征,然后使用线性SVM算法对添加多项式特征后的数据集进行分类。

sklearn中的多项式特征PolynomialFeature和标准化StandardScaler都在preprocessing预处理包下,对于SVM算法依然使用上一小节使用的线性SVM分类算法LinearSVC。由于这几个步骤需要顺序执行,因此为了方便使用sklearn封装的Pipeline管道。

定义一个名为PolynomialSVC的函数,由于这种多项式特征需要指定阶数degree,并且对于LinearSVC还有一个比较重要的超参数C,因此将degree和C作为函数的参数。这个函数直接返回Pipeline的实例对象,在pipeline数组中传入元组,每一个元组对应一个步骤,每一个元组中又有两个元素,分别对应着步骤的名称(任意命名,不过最好有意义)以及具体步骤的实例化对象。为线性SVM算法添加多项式项具体分为三个步骤:

  • 实例化多项式类,将构造多项式的步骤命名为"poly";
  • 实例化标准化类,将数据标准化的步骤命名为"std_scaler";
  • 实例化线性SVM类,将使用LinearSVC的步骤命名为"linearSVC";

调用PolynomialSVC函数,传入degree阶数为3,并将返回的Pipeline对象命名为poly_svc,使用poly_svc的fit函数对数据集进行训练,由于这里只是为了演示,所以不使用train_test_split方法对数据集进行划分。

使用plot_decision_boundary函数绘制决策边界,与此同时绘制出原始样本点。

使用多项式特征的线性SVM分类算法处理非线性数据集得到的决策边界不再是一根直线,而是一条曲线。

c

使用多项式核函数的SVM

对于SVM算法来说,可以不使用多项式特征的方式,即先将原始数据集转换为高维的且有多项式特征的数据集,然后使用线性SVM算法对转换后的数据集进行分类。SVM算法有一个特殊的方式可以直接使用这种多项式的特征,这种特殊的方式就是多项式核函数。

如果使用多项式核函数的SVM算法处理分类任务,需要从sklearn.svm包下import导入SVC类,SVC相较于sklearn中封装的线性SVM分类算法LinearSVC只是少了Linear线性这个单词。当然无论是LinearSVC还是SVC的核心思想都是SVM算法,而SVM算法对距离敏感,因此依然需要对数据集进行标准化的处理。

定义PolynomialKernelSVC函数,函数的参数包括degree多项式阶数以及超参数C,函数的返回值为Pipeline对象。使用多项式核函数的SVC算法具体分为两个步骤:

  • 实例化标准化类,将数据标准化的步骤命名为"std_scaler";
  • 实例化SVC类,在实例化的时候传入kernel参数,并将kernel参数设置为"poly"字符串,"poly"可以使SVM算法将传入的数据自动进行多项式的转换,进而进行训练,不过这个过程和使用多项式特征的SVM算法有所不同;

调用PolynomialKernelSVC函数,将degree参数设置为3,将函数返回的Pipeline对象命名为poly_kernel_svc,最后使用poly_kernel_svc对全部的数据集进行拟合训练。

绘制使用多项式核函数的SVM算法的决策边界。

使用多项式特征的SVM算法和使用多项式核函数的SVM算法对应的决策边界不一样,说明两种方法的实现有所不同。不过无论是那种方法得到的决策边界都不再是直线,而是一条曲线。

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

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

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

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

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