图解机器学习 | 支持向量机模型详解
作者:韩信子@ShowMeAI
教程地址:https://www.showmeai.tech/tutorials/34
本文地址:https://www.showmeai.tech/article-detail/196
声明:版权所有,转载请联系平台与作者并注明出处
引言
本篇我们要讲解的模型是大名鼎鼎的支持向量机SVM,这是曾经在机器学习界有着近乎「垄断」地位的模型,影响力持续了好多年。直至今日,即使深度学习神经网络的影响力逐渐增强,但SVM在中小型数据集上依旧有着可以和神经网络抗衡的极好效果和模型鲁棒性。
支持向量机学习方法,针对不同的情况,有由简至繁的不同模型:
-
线性可分支持向量机(linear support vector machine in linearly separable case):训练数据线性可分的情况下,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器,即线性可分支持向量机(亦称作硬间隔支持向量机)。
-
线性支持向量机(linear support vector machine):训练数据近似线性可分的情况下,通过软间隔最大化(soft margin maximization),学习一个线性的分类器,称作线性支持向量机(又叫软间隔支持向量机)。
-
非线性支持向量机(non-linear support vector machine):训练数据线性不可分的情况下,通过使用核技巧(kernel trick)及软间隔最大化,学习非线性分类器,称作非线性支持向量机。
支持向量机可以借助核技巧完成复杂场景下的非线性分类,当输入空间为欧式空间或离散集合、特征空间为希尔贝特空间时,核函数(kernel function)表示将输入从输入空间映射到特征空间得到的特征向量之间的内积。
通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机。这样的方法称为核技巧。
1.最大间隔分类器
1)分类问题与线性模型
分类问题是监督学习的一个核心问题。在监督学习中,当输出变量取有限个离散值时,预测问题便成为分类问题。实际生活中,有很多问题的本质都是分类,如识别某种模式:文本分类、分词、词性标注、图像内容识别和目标检测等。
分类问题的数学理解是空间划分(或者寻找不同类别的决策边界),如下图所示是一个简单的线性分类器(这部分更详细的讲解参考ShowMeAI文章 图解机器学习 | 机器学习基础知识 和 图解机器学习 | 逻辑回归算法详解)。
2)最大间隔分类器
不同的模型在解决分类问题时,会有不同的处理方式,直观上看,我们会使用不同的决策边界对样本进行划分。
如下图中「冰墩墩」与「雪容融」两类样本点,我们对其进行分类,可以完成该分类任务的决策边界有无数个。而我们这里介绍到的SVM模型,要求更高一些,它不仅仅希望把两类样本点区分开,还希望找到鲁棒性最高、稳定性最好的决策边界(对应图中的黑色直线)。
这个决策边界与两侧「最近」的数据点有着「最大」的距离,这意味着决策边界具有最强的容错性,不容易受到噪声数据的干扰。直观的理解就是,如果决策边界抖动,最不容易「撞上」样本点或者进而导致误判。
2.支持向量机详解
1)线性可分SVM与硬间隔最大化
我们要找到把下图中红蓝两色的图标点分开的最优分界线。令红色的图标点 \(=+1\) ,蓝色的图标的点 \(=-1\) ,直线 \(f(x) = \boldsymbol{w}\cdot \boldsymbol{x} + b\) ,这里 \(w、x\) 是向量,其实公式等价于 \(f(x) = w_1x_1 + w_2x_2 +…+ w_nx_n + b\) 。
-
当向量 \(x\) 为二维向量时, \(f(x)\) 表示二维空间中的一条直线。
-
当向量 \(x\) 为三维向量时, \(f(x)\) 表示三维空间中的一个平面。
-
当向量 \(x\) 的 \(n\) 维向量( \(fn>3\) )时, \(f(x)\) 表示 \(n\) 维空间中的 \(n-1\) 维超平面。
当有一个新的点 \(x\) 需要预测属于哪个分类的时候,我们用 \(sgn(f(x))\) 就可以预测了。 \(sgn\) 表示符号函数:
-
当 \(f(x)>0\) 的时候, \(sgn(f(x)) = +1\) 。
-
当 \(f(x) < 0\) 的时候 \(sgn(f(x)) = –1\) 。
回到重点,我们怎样才能取得一个最优的划分直线 \(f(x)\) 呢?下图的直线表示几条可能的 \(f(x)\) :
我们希望这条直线满足「最大间隔」原则,也就是如下图的形态。图中位于红色和蓝色线上的图标就是所谓的支持向量(support vector)。
决策边界就是 \(f(x)\) ,红色和蓝色的线是支持向量(support vector)所在的面,红色、蓝色线之间的间隙就是我们要最大化的分类间的间隙M(Margin Width)。
这里直接给出间隔M的计算公式: \(M=\frac{2}{\left \| w \right \| }\) 。
SVM要求解能够正确划分训练数据集并且「几何间隔」最大的分离超平面。
如下图所示, \(\boldsymbol{w} \cdot \boldsymbol{x}+b=0\) 即为分离超平面。对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。
我们先做一些定义,假设给定一个特征空间上的训练数据集: \(T={(x_1, y_1),(x_2, y_2), \ldots,(x_N, y_N)}\) 。且训练数据集是线性可分的,其中:
-
\(x_i \in \mathbb{R}^{n}\) , \(y_{i} \in \left \{+1,-1 \right \}\) , \(i=1,2, \ldots N,x_{i}\) 为第 \(i\) 个特征向量。
-
\(y_{i}\) 为类标记,当它等于 \(+1\) 时为正例;为 \(-1\) 时为负例。
(1)几何间隔
对于给定的数据集 \(T\) 和超平面 \(wx+b=0\) 。
-
定义超平面关于样本点 \((x_{i}, y_{i})\) 的几何间隔为: \(\gamma_{i} = y_i(\frac{w}{\left \| w \right \| } \cdot x_i + \frac{b}{\left \| w \right \| })\)
-
超平面关于所有样本点的几何间隔的最小值为: \(\gamma = \min _{i=1,2 \ldots, N} \gamma_{i}\) ,实际上这个距离就是我们所谓的「支持向量到超平面的距离」。
① 根据以上定义,SVM模型的「求解最大分割超平面问题」可以表示为以下约束最优化问题:
- 上面公式中s.t是subject to的缩写,也就是限制条件的意思。
② 将约束条件两边同时除以 \(\gamma\) 得到:
③ 因为 \(\left \| w \right \|\) 、 \(\gamma\) 都是标量,所以为了表达式简洁,令: \(w=\frac{w}{\left \| w \right \| \gamma}\) 、 \(b=\frac{b}{\left \| w \right \| \gamma}\) 得到:
④ 又因为最大化 \(\gamma\) ,等价于最大化 \(\frac{1}{\left \| w \right \|}\) ,也就等价于最小化 \(\frac{1}{2}\left \| w \right \|^{2}\) ,最终SVM模型的求解最大分割超平面问题又可以表示为以下约束最优化问题:
(2)对偶算法
求解线性可分支持向量机的最优化问题,我们很多时候会将它转化为对偶问题(dual problem)来求解,也就是应用「拉格朗日对偶性」,通过求解「对偶问题(dual problem)」得到「原始问题(primal problem)」的最优解,即线性可分支持向量机的对偶算法(dual algorithm)。
这样做有一些优点:
-
对偶问题往往更容易求解。
-
引入自然核函数,进而可以推广到非线性分类问题。
① 我们首先构建拉格朗日函数(Lagrange function)。为此,对每一个不等式约束引进拉格朗日乘子(Lagrange multiplier) \(\alpha_i\geq 0,i=1,2,…,N\) ,定义拉格朗日函数:
根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题: \(\max_{\alpha}\min_{w,b}L(w, b, \alpha)\) 。所以,为了得到对偶问题的解,需要先求 \(L(w, b, \alpha)\) 对 \(w、b\) 的极小值,再求对 $\alpha $ 的极大值。
② 求 \(L(w, b, \alpha)\) 对 \(w、b\) 的极小值
将拉格朗日函数 \(L(w, b, \alpha)\) 分别对 \(w、b\) 求偏导,并令其值为0。
将上式代入拉格朗日函数,即得:
③ 求 \(\min_{w,b}L(w, b,\alpha)\) 对 \(\alpha\) 的极大值,即对偶问题
将式中的目标函数由求极大转换成求极小,就得到下面与之等价的对偶最优化问题:
**④ 对线性可分训练数据集,假设对偶最优化问题对 \(\alpha\) 的解为 \(\alpha^*=(\alpha_1^*,\alpha_2^*,…,\alpha_N^*)^ T\) ,可以由 \(\alpha^*\) 求得原始最优化问题的解 \(w^*、b^*\) **。
有下面的定理:设 \(\alpha^*=(\alpha_1^*,\alpha_2^*,…,\alpha_N^*)^T\) 是对偶最优化问题的解,则存在下标 \(j\) ,使得 \(\alpha_j^*>0\) ,并可按下式求得原始最优化问题的解 \(w^*,b^*\) :
证明:根据定理,KKT条件成立,即得:
由此得 \(w^*=\sum_{i=1}^{N} \alpha_i^*y_ix_i\)
\其中至少有一个 \(\alpha_j^*>0\) (用反正法,假设 \(\alpha_j^*=0\) ,由式可知 \(w^*=0\) ,而 \(w^*=0\) 不是原始最优化问题的解,产生矛盾),由此对 \(j\) 有: \(y_j(w^*\cdot x_j+b^*) – 1 = 0\)
将式代入并注意到 \(y_j^2=1\) ,即得: \(b^* = y_j – w^*{}x_j = y_j – \sum_{i=1}^{N} \alpha_i^*y_i(x_ix_j)\)
⑤ 由此定理可知,分离超平面可以写成
⑥ 分类决策函数可以写成
也就是说,这里的决策函数只依赖于输入 \(x\) 和训练样本输入的内积。上式亦称作线性可分SVM的对偶形式。
综上所述,对于给定得线性可分训练数据集,可以首先求对偶问题的解 \(\alpha^*\) ;再利用公式求得原始问题的解 \(w^*,b^*\) ;从而得到分离超平面及分类决策函数。这种算法称为线性可分支持向量机的对偶学习算法,是线性可分支持向量机学习的基本算法。
2)线性SVM与软间隔最大化
我们前面提到的是线性可分的情况,但实际应用中完全线性可分的情况太少见了。如下图就是一个典型的线性不可分的分类图(我们没有办法找到一条直线,把空间划分为2个区域,一个区域只有黑点,一个区域只有白点)。
要对其进行切分,有2种方案:
方案1:用曲线去将其完全分开,即非线性的决策边界,这会和之后谈到的核函数关联。
方案2:还是使用直线,不过不追求完全可分,会适当包容一些分错的情况,在这个过程中我们会在模型中加入惩罚函数,尽量让分错的点不要太多太离谱。对分错点的惩罚函数就是这个点到其正确位置的距离,如下图所示:
图上黄色、蓝色的直线分别为支持向量所在的边界,黑色的线为决策函数,那些绿色的线表示分错的点到其相应的决策面的距离,这样我们可以在原函数上面加上一个惩罚函数,并且带上其限制条件为:
上述公式为在线性可分问题的基础上加上的惩罚函数部分,当 \(x_i\) 在正确一边的时候, \(\varepsilon = 0\) ,R为全部的点的数目,C是一个由用户去指定的系数,表示对分错的点加入多少的惩罚:
- 当C很大的时候,分错的点就会更少,但是过拟合的情况可能会比较严重。
- 当C很小的时候,分错的点可能会很多,不过可能由此得到的模型也会不太正确。
实际我们也会调整和选择合适的C值。
经过这个变换之后,我们可以同样求解一个拉格朗日对偶问题,得到原问题的对偶问题的表达式:
在线性不可分情况下得到的对偶问题,不同的地方就是α的范围从[0, +∞),变为了[0, C],增加的惩罚 \(\varepsilon\) 没有为对偶问题增加太多复杂度。
3)非线性SVM与核函数
如果我们要处理的分类问题更加复杂,甚至不能像上面一样近似线性可分呢,这种情况下找到的超平面分错的程度太高不太可接受。
对于这样的问题,一种解决方案是将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分,然后再运用SVM求解,如下图所示:
比如下图中的典型线性不可分的情况:
当我们使用映射函数 \(z_{1}=x_{1}^{2}, z_{2}=x_{2}^{2}, z_{3}=x_{2}\) 把这两个类似于椭圆形的点映射到三维空间 \((z_1,z_2,z_3)\) 后,对映射后的坐标加以旋转之后就可以得到一个线性可分的点集了。
我们回忆一下之前得到的对偶问题表达式:
做一点小小的改造,令: \(x_{i}^{T} x_{j}=\kappa\left(x_{i}, x_{j}\right)\) 。这个式子所做的事情就是将线性的空间映射到高维的空间, \(\kappa\left(x_{i}, x_{j}\right)\) 有很多种,下面是比较典型的两种:
上述两个核函数分别为多项式核和高斯核,高斯核甚至是将原始空间映射为无穷维空间,另外核函数有一些比较好的性质,比如说不会比线性条件下增加多少额外的计算量,等等,此处我们不深入。对于一个问题,不同的核函数可能会带来不同的结果,我们需要做一些尝试来支撑选择(关于这个部分,大家可以看最下方的python实现部分)。
3.SVM总结
1)模型总结
支持向量机(Support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,他的学习策略就是间隔最大化,同时该方法可以形式化为一个求解图二次规划。
SVM由简至繁可分为三类:线性可分支持向量机、硬间隔(hard-margin svm);线性支持向量机、软间隔(soft-margin svm);非线性支持向量机、Kernel SVM。
SVM中存在三宝:间隔、对偶、核技巧。
2)模型优缺点
(1)SVM模型优点
-
SVM是一个凸优化问题,求得的解一定是全局最优而不仅仅是局部最优。
-
不仅适用于线性问题,还适用于非线性问题(借助核技巧)。
-
模型鲁棒性好,决策边界只取决于支持向量而不是全部数据集。
-
中小样本量数据集上效果优异。
-
无需依赖整个数据。
-
泛化能力比较强。
(2)SVM模型缺点
-
二次规划问题求解将涉及n阶矩阵的计算(其中n为样本的个数),计算量随样本量上涨厉害,因此SVM不适用于超大数据集。
-
原始SVM仅适用于二分类问题。(当然,SVM的推广SVR也适用于回归问题;我们也可以通过one-vs-one,one-vs-rest等思路组合SVM来解决多分类问题)。
-
对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数。
-
对于核函数的高维映射解释力不强,尤其是径向基函数。
-
SVM对缺失数据敏感。
更多监督学习的算法模型总结可以查看ShowMeAI的文章AI知识技能速查 | 机器学习-监督学习。
4.基于Python的SVM代码实践
1)算法包说明
我们这里直接借助于python机器学习工具包sklearn来演示SVM的应用,sklearn中对SVM的算法实现都包在sklearn.svm下面,具体见sklearn官方文档,其中SVC类是用来进行进行分类的任务,SVR是用来进行数值回归任务的。
不同的核函数需要指定不同的参数。
-
针对线性函数,只需要指定参数C,它表示对不符合最大间距规则的样本的惩罚力度。
-
针对多项式核函数,除了参数C外,还需要指定degree,它表示多项式的阶数。
-
针对高斯核函数,除了参数C外,还需要指定gamma值,这个值对应的是高斯函数公式中 \(\frac{1}{2\sigma ^2}\) 的值。
2)使用线性核函数
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两维特征,方便可视化
y = iris.target
svc = svm.SVC(kernel='linear', C=1).fit(X, y)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min) / 100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()
3)使用多项式核函数
初始化svm对象的代码替换为下面这行
svc = svm.SVC(kernel='poly', degree=3).fit(X, y)
4)使用rbf核函数(高斯核函数)
初始化svm对象的代码替换为下面这行
svc = svm.SVC(kernel='rbf', C=1).fit(X, y)
gamma 值越大,SVM 就会倾向于越准确的划分每一个训练集里的数据,这会导致泛化误差较大和过拟合问题。
C:错误项的惩罚参数C。它还控制平滑决策边界和正确分类训练点之间的权衡。
参考链接
视频教程
可以点击 B站 查看视频的【双语字幕】版本
【双语字幕+资料下载】斯坦福CS229 | 机器学习-吴恩达主讲(2018·完整版)
机器学习【算法】系列教程
- 图解机器学习 | 机器学习基础知识
- 图解机器学习 | 模型评估方法与准则
- 图解机器学习 | KNN算法及其应用
- 图解机器学习 | 逻辑回归算法详解
- 图解机器学习 | 朴素贝叶斯算法详解
- 图解机器学习 | 决策树模型详解
- 图解机器学习 | 随机森林分类模型详解
- 图解机器学习 | 回归树模型详解
- 图解机器学习 | GBDT模型详解
- 图解机器学习 | XGBoost模型最全解析
- 图解机器学习 | LightGBM模型详解
- 图解机器学习 | 支持向量机模型详解
- 图解机器学习 | 聚类算法详解
- 图解机器学习 | PCA降维算法详解
机器学习【实战】系列教程
- 机器学习实战 | Python机器学习算法应用实践
- 机器学习实战 | SKLearn入门与简单应用案例
- 机器学习实战 | SKLearn最全应用指南
- 机器学习实战 | XGBoost建模应用详解
- 机器学习实战 | LightGBM建模应用详解
- 机器学习实战 | Python机器学习综合项目-电商销量预估
- 机器学习实战 | Python机器学习综合项目-电商销量预估<进阶方案>
- 机器学习实战 | 机器学习特征工程最全解读
- 机器学习实战 | 自动化特征工程工具Featuretools应用
- 机器学习实战 | AutoML自动化机器学习建模