前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 scikit-learn 玩转机器学习——支持向量机

使用 scikit-learn 玩转机器学习——支持向量机

作者头像
小小詹同学
发布2018-12-29 16:44:49
5370
发布2018-12-29 16:44:49
举报
文章被收录于专栏:小詹同学小詹同学

支持向量机(SVM)是监督学习中最有影响的方法之一。它的大致思想是找出距离两个类别(暂时以二分类问题为例)最近的点作为支持向量,然后找出一个最佳决策边界,以使从决策边界到支持向量的距离最大化。因为对于一个二分类问题来说,往往有无数个决策边界可以将两类数据分开,但我们只能选择一条作为我们的决策边界。

继续对上述问题进行讨论,SVM 最终还是转化为一个最值优化问题,它认为这样找的决策边界能够使两类事物区分的最好,将来对于未知种类的样本,它能够给出最正确的样本分类,即有着最好的泛化能力。用大白话翻译过来就是:苹果是苹果,梨就是梨,上帝在造苹果和梨的时候就在它们中间画了一条线,线的这边就是苹果,线的那边就是梨,我们要做的就是不断地逼近上帝画的那条线,这样能够更好地把梨和苹果分开。

上述讨论的问题是线性可分的,在 SVM 中对应着 hard margin 来解决,从名字可以看出来似乎还对应着 soft margin。的确,soft margin 的确存在,而且就像 softmax(不是强硬的直接输出最后分类结果0和1,而是给出属于对应结果的概率)和 softplus(softplus正是 ReLu 的圆角版)一样包含着缓冲和协调的作用。soft margin 引入了容错空间的的概念,从而允许原本属于不同类别的空间交叉重叠。

上述公式对应的是 hard margin 的损失函数和约束条件,w 表示各个特征的权重向量,在一个二分类问题中,标签值y取+1和-1, 表示我们求得的决策边界,表示经学习后分得的正类,表示经学习后分得的负类,表示的应该是经过支持向量且与决策边界平行的区域,在 hard margin 情形下,该区域是没有任何点的。又因为标签值 y 取值为+1和-1,则正负类可以用一个不等式表示,然后就可以用拉格朗日乘子法等来解决这类约束优化问题。

SVM 中另一个经常会出现的概念恐怕就是核了。通过核技巧,可以避免大量的点积运算,是计算更加高效,它同时保证了有效收敛的凸优化技术来学习线性模型。一般常用的核有高斯核(又叫做 RBF 核,radical basis function 的缩写)和多项式核(假装常用),高斯核函数如下所示:

代码演练(分类大作战)

我们会先实例化一个朴素的 SVM 分类器(不调任何超参数,全部取默认参数),看看其表现如何,然后会跟小伙伴们介绍下一些重要的超参数,并试着调参来优化 SVM 分类器的性能,顺便跟我们以往介绍过的分类器做下比较。

1、实例化一个朴素的 SVM 分类器,并看下其准确率

show一下数据集的几个数字样例:

2、介绍下 SVM 中一些重要的超参数(包含linear_svc 和 SVC 两个模型的部分超参数)

penalty: 字符串,可选‘l1’或’l2‘,默认’l2‘,指定模型的正则方式; loss: 字符串,可选’hinge‘或’squared_hinge‘,默认’squared_hinge‘,用于指定模型的损失函数; kenel: 字符串,可选‘linear’,'poly','rbf','sigmoid','precomputed'; degree: 整型数字,当使用多项式核时,用来确定多项式的阶次; dual: 布尔值,默认值为’True‘,选择算法以解决双优化或原始优化问题; tol: 浮点数,默认为 1e-4,用于判断是否停止迭代的容差; C: 浮点数, 默认为1.0,容错空间系数,用于调整容错空间在优化迭代中所占的重要性; multi_class: 字符串,可选’ovr‘和’crammer_singer‘,但面临多分类问题时,用于确定多分类策略,’ovr‘指定了使用 One VS Rest 策略进行多分类任务,而’crammer_singer‘则是在所有的类上建立一个联合的目标损失函数进行优化; verbose: 整型数字,默认值为0,若为大于0的整数,则会在训练过程中不断输入与训练相关的条件与参数; max_iter: 整型数字,默认值为1000,用于指定迭代的最大次数。

3、通过给 SVM 分类器调参,可以获得性能不错的分类器,如下:

4、看看其他的分类器都有什么样的表现呢

经过调参,都能达到很高的精度啦,但同样是达到99.11%的准确度,SVM 用了118ms,KNN 用了13.4s,当然了,这跟KNN 模型使用了网格搜索寻找部分最佳超参数也有关系了,再看看其他分类器的表现咯!

喔!逻辑回归这老哥简直不要太给力,仅使用朴素模型准确度就能达到95.6%,没必要再调参了。

那再用一个单层的神经网络模型试试(训练50个EPOCH,输入层128个神经元,输出层10个神经元):

结果好像还不错呢,训练集和测试集上都有着98%的精度。那么这次的分享就到这里了,小伙伴们下次再见!!!

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

本文分享自 小詹学Python 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码演练(分类大作战)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档