《两日算法系列》之第五篇:SVM

1. 支持向量机理论

支持向量机(Support Vector Machine:SVM)

支持向量机的目的是什么?

利用训练数据集的间隔最大化找到一个最优分离超平面

你可能有两个名词不太懂,间隔?分离超平面?

别紧张,没有人刚开始学习SVM的时候就知道这两个东西


先来看个例子,现在有一些人的身高和体重数据,将它们绘制成散点图,是这样的:

文章首发:公众号『知秋小一』

如果现在给你一个未知男女的身高和体重,你能分辨出性别吗?

这个简单,我直接将已知的点划分为两部分,这个点落在哪一部分就对应相应的性别

ok,那就可以画一条直线,直线以上是男生,直线以下是女生

文章首发:公众号『知秋小一』

问题来了,现在这个是一个二维平面,我们可以画直线,如果是三维的呢?该怎么画?

小时候就学过,一维平面是点,二维平面是线,三维平面是面

对的,那么注意,今天的第一个概念:

超平面是平面的一般化:

  • 在一维的平面中,它是点
  • 在二维的平面中,它是线
  • 在三维的平面中,它是面
  • 在更高的维度中,我们称之为超平面

为了大家更快的适应超平面这种说法,后面的直线、平面都直接叫超平面了

继续刚才的问题,我们刚才是通过一个分离超平面分出了男和女,这个超平面唯一吗?

文章首发:公众号『知秋小一』

很明显,并不唯一,这样的超平面有若干个

那么问题来了,既然有若干个,那我肯定要最好的,这里最好的叫最优分离超平面

如何在众多分离超平面中选择一个最优分离超平面?

下面这两个分离超平面,你选哪个?绿色的还是黑色的?

文章首发:公众号『知秋小一』

对,当然是黑色的。

黑色的我懂,可是原理是什么?

很简单,原理有两个,分别是:

  • 正确的对训练数据进行分类
  • 对未知数据也能很好的分类

黑色的分离超平面能够对训练数据很好的分类,当新增未知数据时,黑色的分离超平面泛化能力也强于绿色。

深究一下,为什么黑色的要强于绿色?原理又是什么?

其实很简单:最优分离超平面其实是和两侧样本点有关,而且只和这些点有关。

怎么理解这句话呢,我们看张图:

文章首发:公众号『知秋小一』

其中当间隔达到最大,两侧样本点的距离相等的超平面为最优分离超平面。

注意,今天的第二个概念:

对应上图,Margin对应的就是最优分离超平面的间隔,此时的间隔达到最大

一般来说,间隔中间是无点区域,里面不会有任何点(理想状态下)

给定一个超平面,我们可以就算出这个超平面与和它最接近的数据点之间的距离。那么间隔(Margin)就是二倍的这个距离

我还是不理解为什么这个分离超平面就是最优分离超平面

那你在看这张图

文章首发:公众号『知秋小一』

在这张图里面间隔MarginB小于上张图的MarginA

当出现新的未知点,MarginB分离超平面的泛化能力不如Margin

你可能不理解泛化能力这个词,那换个说法:当出现未知点时,用MarginB的分离超平面去分类,错误率大于MarginA


总结一下

支持向量机是为了通过间隔最大化找到一个最优分离超平面

而之所以叫做支持向量,是因为在决定分离超平面的时候,只有极限位置的那两个点有用,其他点根本没有大作用,因为只要极限位置离得超平面的距离最大,就是最优的分离超平面了。


怎么样,一口气学了这么多,甚至还了解了SVM的深奥意义,是不是有点点小激动?

趁着现在还激动想一个问题:如何确定最大化间隔?


2. 如何确定最大化间隔

如果我们能够确定两个平行超平面,那么两个超平面之间的最大距离就是最大化间隔。

看个图你就都明白了:

文章首发:公众号『知秋小一』

左右两个平行超平面将数据完美的分开,我们只需要计算上述两个平行超平面的距离即可。

所以,我们找到最大化间隔:

  • 找到两个平行超平面,可以划分数据集并且两平面之间没有数据点
  • 最大化上述两个超平面

2.1. 确定两个平行超平面

怎么确定两个平行超平面?

我们知道一条直线的数学方程是:y-ax+b=0,而超平面会被定义成类似的形式:

w T x − b = 0 \mathbf{w}^T \mathbf{x} -b = 0 wTxb=0

超平面的方程中,加粗的字体w、x表示向量, w T x \mathbf{w}^T \mathbf{x} wTx表示向量的内积。

这个我觉得应该不用多说了,平面方程公式,默认都懂哈

推广到n维空间,则超平面方程中的w、x分别为:

等等,还有一个问题,如何确保两超平面之间没有数据点?

我们的目的是通过两个平行超平面对数据进行分类,那我们可以这样定义两个超平面:

对于每一个向量xi:满足:

w ⋅ x i − b ≥ 1      f o r    x i 属 于 类 别 1 \mathbf{w} ·\mathbf{x}_i -b \ge 1 \;\; for \; \mathbf{x}_i属于类别1 wxib1forxi1
或者

w ⋅ x i − b ≤ − 1      f o r    x i 属 于 类 别 − 1 \mathbf{w} ·\mathbf{x}_i -b \le -1 \;\; for \; \mathbf{x}_i属于类别-1 wxib1forxi1
也就是这张图:

文章首发:公众号『知秋小一』

所有的红点都是1类,所有的蓝点都是−1类。

整理一下上面的两个超平面:

w ⋅ x i − b ≥ 1      f o r    x i 属 于 类 别 1 \mathbf{w} ·\mathbf{x}_i -b \ge 1 \;\; for \; \mathbf{x}_i属于类别1 wxib1forxi1

w ⋅ x i − b ≤ − 1      f o r    x i 属 于 类 别 − 1 \mathbf{w} ·\mathbf{x}_i -b \le -1 \;\; for \; \mathbf{x}_i属于类别-1 wxib1forxi1

不等式两边同时乘以 yi,-1类的超平面yi=-1,要改变不等式符号,合并后得

y i ( w ⋅ x i − b ) ≥ 1      f o r    a l l    1 ≤ i ≤ n y_i(\mathbf{w} ·\mathbf{x}_i -b) \ge 1 \;\; for \; all \; 1\le i\le n yi(wxib)1forall1in
ok,记住上面的约束条件。


2.2. 确定间隔

如何求两个平行超平面的间隔呢?

我们可以先做这样一个假设:

  • h 0 h_0 h0是满足约束 w ⋅ x i − b = 1 \mathbf{w} ·\mathbf{x}_i -b = 1 wxib=1的超平面
  • h 1 h_1 h1是满足约束 w ⋅ x i − b = − 1 \mathbf{w} ·\mathbf{x}_i -b = -1 wxib=1的超平面
  • x 0 x_0 x0 h 0 h_0 h0上的一点

则x0到平面h1的垂直距离m就是我们要的间隔。

文章首发:公众号『知秋小一』

这个间隔是可以通过计算算出来的,推导还需要一些步骤,直接放结果了就:

m = 2 ∣ ∣ w ∣ ∣ m = \frac{2}{||\mathbf{w}||} m=w2
其中||w||表示w的二范数,求所有元素的平方和,然后在开方。比如,二维平面下:

∣ ∣ w ∣ ∣ = w 1 2 + w 2 2 2 ||\mathbf{w}||=\sqrt[2]{w_1^2+w_2^2} w=2w12+w22
可以发现,w 的模越小,间隔m 越大


2.3. 确定目标

我们的间隔最大化,最后就成了这样一个问题:

在 约 束 条 件 y i ( w ⋅ x i − b ) ≥ 1      ( 对 于 i = 1 , . . . , n ) 的 情 况 下 在约束条件y_i(\mathbf{w} ·\mathbf{x}_i -b) \ge 1 \;\; (对于i=1,...,n)的情况下 yi(wxib)1(i=1,...,n)

找 到 使 ∣ ∣ w ∣ ∣ 最 小 的 w , b 找到使||\mathbf{w}||最小的\mathbf{w},b 使ww,b

了其中w和b,我们的最优分离超平面就确定了,目的也就达到了


上面的最优超平面问题是一个凸优化问题,可以转换成了拉格朗日的对偶问题,判断是否满足KKT条件,然后求解

上一句话包含的知识是整个SVM的核心,涉及到大量的公式推导。

但是既然是大话系列,那么涉及到推导的东西我们就略过了,你只需要知道它的目的就是为了找出一个最优分离超平面

就假设我们已经解出了最大间隔,找到了最优分离超平面,它是这样的:
文章首发:公众号『知秋小一』


ok,那我们的支持向量机的原理就说完了。

除去上面我们对最大间隔的推导计算,剩下的部分其实是不难理解的。

从上面过程,我们可以发现,其实最终分类超平面的确定依赖于部分极限位置的样本点,这叫做支持向量。

由于支持向量在确定分离超平面中起着决定性作用,所有将这类模型叫做支持向量机


我们在上面图中的点都是线性可分的,也就是一条线(或一个超平面)可以很容易的分开的

但是实际情况不都是这样,比如有的女生身高比男生高,有的男生体重比女生都轻

像这种存在噪声点分类,应该怎么处理?


3. 针对样本的SVM
3.1. 硬间隔线性支持向量机

上面例子中提到的样本点都是线性可分的,我们就可以通过分类将样本点完全分类准确,不存在分类错误的情况,这种叫硬间隔,这类模型叫做硬间隔线性SVM

3.2. 软间隔线性支持向量机

同样的,可以通过分类将样本点不完全分类准确,存在少部分分类错误的情况,这叫软间隔,这类模型叫做软间隔线性SVM

不一样的是,因为有分类错误的样本点,但我们仍需要将错误降至最低,所有需要添加一个惩罚项来进行浮动,所有此时求解的最大间隔就变成了这样:
在这里插入图片描述

3.3. 非线性支持向量机

硬间隔和软间隔都是对线性可分的样本点进行分类,那如果样本点本身就不线性可分?

举个例子:下面这幅图

文章首发:公众号『知秋小一』

样本点并不是线性可分的,这种问题应该怎么处理呢?

解决这个问题之前,先看一下这个小短视频:

SVM with polynomial kernel 可视化

视频中是将平面中的样本点映射到三维空间中,使用一个平面将样本线性可分

所以我们需要一种方法,可以将样本从原始空间映射到一个更高纬的空间中,使得样本在新的空间中线性可分。这,叫核函数

在非线性SVM中,核函数的选择关系到SVM的分类效果。

幸好的是,我们有多种核函数:线性核函数、多项式核函数、高斯核函数、sigmoid核函数等等,甚至你还可以将这些核函数进行组合,以达到最优线性可分的效果

核函数了解到应该就差不多了,具体的实现我们在下一节的实战再说



4. 多分类支持向量机

还有最后一个问题:多分类

我们前面提到的所有例子最终都指向了二分类,现实中可不止有二分类,更多的是多分类问题

那么多分类应该怎么分呢?

有两种方法:一对多和一对一

4.1. 一对多法

一对多法讲究的是将所有的分类分成两类:一类只包含一个分类,另一类包含剩下的所有分类

举个例子:现在有A、B、C、D四种分类,根据一对多法可以这样分:

  • ①:样本A作为正集,B、C、D为负集
  • ②:样本B作为正集,A、C、D为负集
  • ③:样本C作为正集,A、B、D为负集
  • ④:样本D作为正集,A、B、C为负集

文章首发:公众号『知秋小一』

4.2. 一对一法

一对一法讲究的是从所有分类中只取出两类,一个为正类一个为父类

再举个例子:现在有A、B、C三种分类,根据一对一法可以这样分:

  • ①分类器:样本A、B
  • ②分类器:样本A、C
  • ③分类器:样本B、C

文章首发:公众号『知秋小一』

可以看到,两种方法各有优缺点,具体的直接看思维导图(文末)



5. 实战之前你还需了解这些

我们知道针对样本有线性SVM和非线性SVM

同样的在sklearn 中提供的这两种的实现,分别是:LinearSVC和SVC

SVC?不应该时SVM吗?

SVC:Support Vector Classification 用作处理分类问题

那是不是意味着还可以处理回归问题?

是的,没错。但我们常用SVM来做分类问题

处理回归问题会用到LinearSVR和SVR(R代表Regression)


SVC和LinearSVC

LinearSVC是线性分类器,用于处理线性分类的数据,且只能使用线性核函数

SVC是非线性分类器,即可以使用线性核函数进行线性划分,也可以使用高维核函数进行非线性划分

SVM的使用

在sklearn 中,同样还是一句话调用SVM

from sklearn import svm 

如何创建SVM分类器呢?

主要说一下SVC的创建,因为它的参数比较重要

model = svm.SVC(kernel='rbf', C=1.0, gamma=0.001)

分别解释一下三个重要参数:

  • kernel代表核函数的选择,有四种选择,默认rbf(即高斯核函数)
  • 参数C代表目标函数的惩罚系数,默认情况下为 1.0
  • 参数gamma代表核函数的系数,默认为样本特征数的倒数

其中kernel代表的四种核函数分别是:

  • linear:线性核函数,在数据线性可分的情况下使用的
  • poly:多项式核函数,可以将数据从低维空间映射到高维空间
  • rbf:高斯核函数,同样可以将样本映射到高维空间,但所需的参数较少,通常性能不错
  • sigmoid:sigmoid核函数,常用在神经网络的映射中

SVM的使用就介绍这么多,来实战测试一下



6. 实战项目
6.1. 数据集

SVM的经典数据集:乳腺癌诊断

医疗人员采集了患者乳腺肿块经过细针穿刺 (FNA) 后的数字化图像,并且对这些数字图像进行了特征提取,这些特征可以描述图像中的细胞核呈现。通过这些特征可以将肿瘤分成良性和恶性

本次数据一共569条、32个字段,先来看一下具体数据字段吧

文章首发:公众号『知秋小一』

其中mean结尾的代表平均值、se结尾的代表标准差、worst结尾代表最坏值(这里具体指肿瘤的特征最大值)

所有其实主要有10个特征字段,一个id字段,一个预测类别字段

我们的目的是通过给出的特征字段来预测肿瘤是良性还是恶性

准备好了吗?3,2,1 开始


6.2. 数据EDA

EDA:Exploratory Data Analysis探索性数据分析

先来看数据分布情况

文章首发:公众号『知秋小一』

一共569条、32个字段

32个字段中1个object类型,一个int型id,剩下的都是float 类型。

另外:数据中不存在缺失值

大胆猜测一下,object类型可能是类别型数据,即最终的预测类型,需要进行处理,先记下

再来看连续型数据的统计数据:

文章首发:公众号『知秋小一』

好像也没啥问题(其实因为这个数据本身比较规整)

那直接开始特征工程吧


6.3. 特征工程

首先就是将类别数据连续化

文章首发:公众号『知秋小一』

再来观察每一个特征的三个指标:均值、标准差和最大值。

优先选择均值,最能体现该指特征的整体情况

文章首发:公众号『知秋小一』

现在还有十个特征,我们通过热力图来看一下特征之间的关系

# 热力图查看特征之间的关系
sns.heatmap(df_data[df_data_X.columns].corr(), linewidths=0.1, vmax=1.0, square=True,
			cmap=sns.color_palette('RdBu', n_colors=256),
			linecolor='white', annot=True)
plt.title('the feature of corr')
plt.show()

热力图是这样的:

文章首发:公众号『知秋小一』

我们发现radius_mean、perimeter_mean和area_mean这三个特征强相关,那我们只保留一个就行了

这里保留热力图里面得分最高的perimeter_mean

最后一步

因为是连续数值,最好对其进行标准化

标准化之后的数据是这样的:

文章首发:公众号『知秋小一』


6.4. 训练模型

上面已经做好了特征工程,我们直接塞进模型看看效果怎么样

因为并不知道数据样本到底是否线性可分,所有我们都来试一下两种算法

先来看看LinearSVC 的效果

文章首发:公众号『知秋小一』

效果很好,简直好的不行

这个准确率就不要纠结了,后面真正做实际案例的时候再纠结准确率吧

ok,还有SVC的效果

因为SVC需要设置参数,直接通过网格搜索让机器自己找到最优参数

文章首发:公众号『知秋小一』

效果更好,小一我一时都惊呆了

可以看出,最终模型还是选择rbf高斯核函数,果然实至名归


好了,今天的项目就到这了

主要是通过数据EDA+特征工程完成了数据方面的工作,然后通过交叉验证+网格搜索确定了最优模型和最优参数



7. 写在后面的话

DataWhale四月学习的最后一个算法,其实SVM自己之前就看过,也写了相应的笔记,所以总结起来就比较游刃有余。

如果看了前几篇文章的同学应该会发现现在总结还有点早,因为第四篇就是一个凑数的,那个,其实我还在写,写完了会及时更上来的。

第四篇本来是关于条件随机场的内容,结果我发现HMM自己还不是很懂,于是,第四篇就成了HMM算法了,等到HMM写完我会继续更上条件随机场这一节的。

算法学起来确实很吃力,不过一个算法+一个项目的学,应该会比单纯推算法有意思些,也会有成就感些。

我是小一,第一步的一,我们下节见!

对了,思维导图奉上:

文章首发:公众号『知秋小一』


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值