在上一篇文章中,掌柜分别介绍了什么是支持向量机以及如何通过sklearn来完成整个SVM的建模过程;然后还介绍了什么是线性不可分与核函数。在接下来的这节内容中,掌柜将继续介绍SVM中的软间隔与sklearn相关SVM模型的实现,以及SVM中的软间隔与对偶问题。
1 SVM中的软间隔1.1 软间隔定义1.2 最大化软间隔1.3 SVM软间隔示例代码1.4 小结2 拉格朗日乘数法2.1 条件极值2.2 求解条件极值2.3 小结3 对偶性与KKT条件3.1 广义拉格朗日乘数法3.2 原始优化问题3.3 对偶优化问题3.4 KKT条件3.5 计算示例3.6 小结引用
1 SVM中的软间隔
1.1 软间隔定义
在上一篇文章中,掌柜分别介绍了以下两种情况的分类任务:①原始样本接线性可分;②原始样本线性不可分,但通过
在图1中 ,实线为相应的决策面,黑色方块和黑色圆点分别为两个类别的样本。在图(a)中,通过SVM建模得到的决策面已经完美的将两种类别的样本点进行了区分。但是,如果此时训练样本中加入一个异常点,并且继续用SVM建模求解,那么将会得到图(b)中所示的分类决策面。可以发现,虽然此时决策面也成功的区分开了每一个样本点,但是相较于(a)中的决策面却发生了剧烈的摆动,决策面到支持向量的距离也变得十分狭窄。 在SVM中,将图(a)和(b)中决策面到支持向量的间隔称之为硬间隔(Hard Margin),即不允许任何样本出现错分的情况,即使可能导致过拟合。当然,理想情况下期望的应该是图(c)中的这种情况,容许少量样本被错分从而得到一个次优解,而这个容忍的程度则通过目标函数来调节。或者再极端一点就是根本找不到一个超平面能够将样本无误的分开,必须得错分一些样本点。此时图(c)中决策面到支持向量的间隔就被称之为软间隔(Soft Margin)。
1.2 最大化软间隔
从上面的介绍可知,如数据集中出现了异常点那么必将导致该异常点的函数间隔小于1。所以,可以为每一个样本引入一个松弛变量(
那么此时的目标函数可以重新改写为如下形式
其中
1.3 SVM软间隔示例代码
在1.1节内容中,掌柜大致列出了SVM分类器中常见的几个重要参数,如下所示:
xxxxxxxxxx
61def init(self,
2 C=1.0,
3 kernel='rbf',
4 degree=3,
5 gamma='scale',
6 coef0=0.0):
在上述代码中,其中kernel='poly'
时可以用参数degree
来选择多项式的 次数。但是通常情况下都会选择效果更好的高斯核(kernel=’rbf’
)来作为核函数,因此该参数用得比较少。参数gamma
为核函数系数,使用默认值即可;coef0
为多项式核和sigmoid核中的常数
下面掌柜将采用网格搜索来选择一个最佳的SVM分类器对数据集iris进行分类。从上面对sklearn中SVM的API的介绍可知,SVC中需要用到的超参数有5个,其取值这里分别设为:'C': np.arange(1, 10, 5)
, 'kernel': ['rbf', 'linear', 'poly']
, 'degree': np.arange(1, 10, 2)
,'gamma':[ 'scale', 'auto']
,'coef0': np.arange(-10, 10, 5)
。由此便有
- 模型选择
首先,需要根据列举出的超参数在数据集上根据交叉验证搜索得到最优超参数组合,代码如下:
xxxxxxxxxx
111def model_selection(x_train, y_train):
2 model = SVC()
3 paras = {'C': np.arange(1, 10, 5),
4 'kernel': ['rbf', 'linear', 'poly'],
5 'degree': np.arange(1, 10, 2),
6 'gamma': ['scale', 'auto'],
7 'coef0': np.arange(-10, 10, 5)}
8 gs = GridSearchCV(model, paras, cv=3, verbose=2, n_jobs=3)
9 gs.fit(x_train, y_train)
10 print('best score:', gs.best_score_,'best
11 parameters:', gs.best_params_)
在完成超参数搜索后,便能够得到一组最优的参数组合,如下所示:
xxxxxxxxxx
71Fitting 3 folds for each of 240 candidates, totalling 720 fits
2[CV] END ..C=1, coef0=-10,degree=1,gamma=scale,kernel=rbf;total time= 0.0s
3[CV] END ..C=1, coef0=-10,degree=1,gamma=scale,kernel=rbf;total time= 0.0s
4…
5[CV] END ...C=6, coef0=5, degree=9,gamma=auto,kernel=rbf; total time= 0.5s
6best score: 0.986
7best parameters: {'C': 6, 'coef0': -10, 'degree': 1, 'gamma': 'scale', 'kernel': 'rbf'}
从上面的结果可以看出,当惩罚系数 C=6
,以及选取高斯核函数时对应的模型效果最好,准确率为0.986。并且由于最后选取的是高斯核,所以此时coef0
和degree
这两个参数无效。
- 训练与预测
在通过网格搜索找到对应的最优模型后,可以再次以完整的训练集对该模型进行训练,代码如下:
xxxxxxxxxx
61def train(x_train, x_test, y_train, y_test):
2 model = SVC(C=6, kernel='rbf',gamma='scale')
3 model.fit(x_train, y_train)
4 score = model.score(x_test, y_test)
5 y_pred = model.predict(x_test)
6 print("测试集上的准确率: ", score)# 0.985
可以看出,此时模型在测试集上的准确率为0.985左右。当然,如果有需要的话还可以将训练好模型进行保存以便于后期复用,具体方法将在第7章中进行介绍。
1.4 小结
在本节中,掌柜首先介绍了什么是软间隔及其原理;然后以iris分类数据集为例,再次介绍了在 sklearn中如何用网格搜索来寻找最佳的模型参数。到此,掌柜就介绍完了SVM算法第一阶段的主要内容,可以发现内容不少并且也有相应的难度。在接下来的几节内容中,掌柜将首先和读者朋友们一起回顾一下好久不见的拉格朗日乘数法;然后再介绍求解模型参数需要用到的对偶问题;最后便是SVM的整个优化求解过程。
2 拉格朗日乘数法
在正式介绍SVM算法的求解过程之前,掌柜先来带着各位读者回顾一下拉格朗日乘数法,因为这同时也是第10章中用来对聚类算法求解的工具。可能对于一部分读者来说,使用拉格朗日乘数法已经是很多年前的事情了,其中的细节也自然是慢慢模糊了起来。但是对于拉格朗日乘数法的作用几乎是大家都不会忘记的,那就是用来求解条件极值。既然大多数读者的记忆都停留在这个地方,那么掌柜下面就从条件极值开始来简单的介绍一下拉格朗日乘数法。
这里首先以一个例题来重温条件极值的求解过程。求解目标函数
首先作拉格朗日函数
由式
求解方程组
由此便可以知道,目标函数
2.1 条件极值
在数学优化问题中,拉格朗日乘数法(Lagrange multipliers )是一种用于求解等式约束条件下局部最小(最大)值的策略。它的基本思想是通过将含约束条件的优化问题转化为无约束条件下的优化问题,以便于得到各个未知变量的梯度,进而求得极值点[1]。因此,一句话总结就是拉格朗日乘数法是一种用来求解条件极值的工具。那么什么又是条件极值呢? 所谓条件极值是指,在一定约束条件下(通常为方程)目标函数的极值就称为条件极值。
如图3所示,目标函数
现在,相信各位读者朋友对条件极值已经有了一个直观上的理解,那么接下来要探究的就是怎么才能求得这个极值。
2.2 求解条件极值
通常来说,对于包含有等式约束条件目标函数的条件极值可以通过拉格朗日乘数法(Lagrange Multipliers)来进行求解。因此,对于多元函数
1) 作拉格朗日函数
其中
2) 求多元函数
解如下方程组求得驻点
那么此时
2.3 小结
在本节中,掌柜首先介绍通过一个引例介绍了如何通过拉格朗日乘数法来求解条件极值;然后总结了如何用拉格朗日乘数法来求解多元函数的条件极值。对于拉格朗日乘数法,我们在后续介绍聚类算法的求解过程中同样也会用到,因此有必要知道其具体求解步骤。
3 对偶性与KKT条件
在上一节内容中,掌柜介绍了什么是拉格朗日乘数法以及它的作用。同时掌柜还特意说到,拉格朗日乘数法只能用来求解等式约束条件下的极值。但是当约束条件为不等式的时候又该如何进行求解呢?
3.1 广义拉格朗日乘数法
由拉格朗日乘数法可知,对于如下等式条件的约束问题
其中
从式
其中
此时,我们接着看如下优化问题
从式
其中
3.2 原始优化问题
根据式
式
则此时有
同时,我们现在来做这样一个假设,如果存在
进一步,结合上述两种情况就能得到下面这个式子:
再进一步,在满足约束条件的情况下最小化
同时,将式
3.3 对偶优化问题
接下来继续定义
式
并将
那么原始问题和对偶问题有什么关系呢? 为什么又要用对偶问题? 通常情况下两者满足以下关系
证明
由式
所以有
进一步根据式
由此便得到了式
3.4 KKT条件
在3.3节中掌柜介绍到,要想用对偶问题的解来代替原始问题的解,就必须使得两者等价。对于原始问题和对偶问题,假设函数
其中式
因此,若存在
3.5 计算示例
在介绍完对偶问题的相关求解原理后,下面再通过一个示例来进行说明。试求解以下优化问题:
由于式
如图4所示,黑色虚线圆环为目标函数
根据式
进一步,式
因此,接下来便可以通过
1) 最小化
此时将