数据科学 | 第10讲:支持向量机
Posted 狗熊会
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据科学 | 第10讲:支持向量机相关的知识,希望对你有一定的参考价值。
支持向量机(support vector machine, SVM)是90年代中期发展起来的、基于统计学习理论的一种能够同时用于分类和回归的方法。支持向量机的理论出发点十分简单直观,在分类问题上,它就是通过寻求将特征空间一分为二的方法来进行分类的。
本章将以最常用的二分类问题为例,介绍支持向量机的原理。首先介绍基于超平面和间隔的最大间隔分类器(maximal margin classifier)。这种方法设计巧妙,原理简单,对大部分数据都容易应用。但是,由于超平面是由少数训练观测,即支持向量所确定,这就使得最大间隔分类器对样本的局部扰动反应灵敏。所以,进一步介绍了引入软间隔(soft margin)的支持向量分类器(support vector classifier)。然而,在实际问题中,不同类别观测之间常常是线性不可分的,面对这种情况,我们就需要使用支持向量机方法。支持向量机是将低维特征空间投影到高维中,从而在高维特征空间中实现线性可分,并且,在计算中使用了核函数技巧的一种方法。最后,我们将讨论支持向量机与Logistic回归的关系,以及支持向量回归问题。
例10.1 假设有10个观测,它们分属于两个类别,其中观测1~5是一类,观测6~10是另一类,如表10-1所示。现在想建立一个分类器,使得对给定的任意一个新的观测,都能将它正确分类。那么,除了前面几章介绍的方法,例如Logistic回归、判别分析、树模型外,还有没有其他方法可以用于建立这样的分类器呢?
表10-1 两个类别的10个观测数据
首先介绍超平面(hyperplane)的概念。一个p维空间的超平面就是它的一个维的线性子空间。例如,二维空间的超平面是它的一维子空间,即一条直线,三维空间的超平面是它的二维子空间,即一个平面。如果用数学定义来表示,那么一个p维空间的超平面可定义为:
(10.1)
其中,为参数。例如,图10-1给出的直线即为二维空间的一个超平面。
所以,任何满足式(10.1)的点X都会落在超平面上。那么,对于不满足式(10.1)的点X,若
(10.2)
说明此时的X位于超平面的一侧。若
(10.3)
则此时的X位于超平面的另一侧。因此, 可以说超平面是将空间分成了两个部分,
图10-1 超平面
对于任意给定的一个点X,我们只需要将其代入式(10.1)的等号的左边项,就可以根据它的符号来判断X是位于超平面的哪一侧。
那么,上述的这种思想是不是可以运用到一个二分类问题当中呢?答案是肯定的,这就是我们接下来要介绍的基于分割超平面的分类方法。
假设我们有n个p维训练样本数据:,,它们分属于两个类别,即,,其中-1和1代表两个不同的类别。注意,在支持向量机的问题中,我们一般都用“-1”和“1”来表示两个类别。我们的目标是根据这些训练数据建立一个分类器,使得对于新的测试数据我们能准确地识别它们属于哪一类。
假设我们可以构造一个超平面把上述不同类别的观测完全分割开来:
(10.4)
所以,如果满足式(10.4)的超平面存在,那么我们就可以利用它来构造分类器:测试观测属于哪一类就取决于它落在超平面的哪一侧。例如对于例10.1给出的观测,如图10-2(左)所示,黑色实线就是我们构造的一个超平面,它使得不同类别的红色观测1~5和蓝色观测6~10分别位于超平面的两侧。
图10-2 左:例10.1观测的分割超平面;右:例10.1观测可能的多个分割超平面
另外,对于落在超平面两侧的观测点,我们还可以根据它们到超平面的距离来定义这种分类的准确性。由几何 知识可知,点到超平面的距离为:
,
其中是该超平面的单位法向量,是超平面上的一个点。如果观测点距离超平面很远,那么我们就能肯定对该观测点的分类判断,但如果观测点离超平面很近,那么我们就不大确定对该观测点的判断是否正确。
一般来说,若对于给定的不同类别的观测,我们可以构造某个超平面将他们分割开来,那么我们将这个超平面稍微地上移或下移或旋转,只要不碰到原有的那些观测,那么我们就能得到另外的超平面。例如在图10-2(右)中,我们就画出了三个不同的超平面(理论上可以画出无穷多个这样的超平面),它们均可以把不同类别的数据完美地分割开来。所以,为了合理地构造分类器,有必要选择一个“最合适”的超平面。那么哪一个超平面才是“最合适”的呢?这就是我们要介绍的最大间隔超平面(maximal margin hyperplane)。
首先,把位于超平面两侧的所有训练观测到超平面的距离的最小值称作观测与超平面的间隔(margin)。前面提到,若观测点离超平面距离越远,则对于该观测点的判断会更加有信心,这也表明了,间隔实际上是代表了误差的上限。基于此,就应该选择与这些观测具有最大间隔的超平面作为分类器,称它为最大间隔分类器(maximal margin classifier)。
图10-3给出了例10.1中观测的最大间隔超平面,即图中的黑色实线。另外,
两条虚线称为边界,它们到最大间隔超平面的距离是一样的,所以任意一条虚线到黑色实线的距离就是观测与超平面的间隔。从图中可以看出,处于虚线上的观测4、7、9确定了最大间隔超平面,换句话说,观测4、7、9中任意一个观测点只要靠实线稍移动了都会导致最大间隔超平面发生变化,而其余观测不管怎么移动,只要不越过各自的边界,就不会对超平面造成影响。所以,把4、7、9这样的观测称为支持向量(support vector),相当于超平面是由这些点支撑(持)的,而每个点都是自变量空间中的一个向量。
下面就用数学表达式来描述如何构建一个最大间隔分类器。以10.2.1中提到的分类问题为例,构造的最大间隔超平面是如下优化问题的解:
(10.5)
对于这个最优化问题,第一个约束条件是令参数的2-范数为1,这个条件实际上是保证了求解上述最优化问题时能得到参数的唯一解。因为我们知道,若定义了一个超平面,那么对于任意的,也都是超平面。另外,在第一个约束成立的条件下,就可以用来表示观测到超平面的距离了,所以此时第二个约束的意思就是使得每一个观测到超平面的距离大于等于M,这里的M其实就是前面介绍的间隔,默认它是大于0的。
对于最优化问题(10.5),转化为求解它的对偶问题会更加容易些。这里,为了使求解得到的参数的唯一性,采用另一种约束,于是可以得到最优化问题(10.5)的对偶问题为:
(10.6)
这是一个凸规划问题,由于所有观测线性可分,故可行域非空,该问题有解。
现在考虑一种情况,如图10-4(左),我们改变了例10.1中观测点9的位置,那么这个时候将找不到任何一个超平面可以完美地将不同类别的观测分割开来,当然更不存在最大间隔超平面了,换句话说,此时最优化问题(10.5)在时是无解的,那么该如何处理呢?这个时候,就需要对超平面的概念进行扩展,即只要求超平面能将大部分不同类别的观测区别开来就好,称这样的超平面为软间隔(soft margin),相应的将由软间隔建立的分类器称为支持向量分类器(support vector classifier)。
图10-4 左:改变观测点9的位置,此时最大间隔超平面不存在;右:轻微移动观测点9的位置,此时最大间隔超平面发生巨大变化,由黑色实线变为虚线
正如图10-4(左)所示,当两种类别观测不能被一个超平面完全分割开来时,此时最大间隔超平面就不存在了。其实,就算最大间隔超平面存在,但它也经常是不可取的。最大间隔超平面其实是由少数几个训练观测,即支持向量所决定的,所以它对这些观测的局部扰动的反应是非常灵敏的。例如我们同样轻微移动观测点9的位置,这个时候就会使最大间隔超平面发生巨大变化,如图10-4(右)所示。此外,也正是由于超平面对观测的局部扰动的反应非常灵敏,所以它很有可能会对训练数据过拟合,导致对测试数据的划分效果并不好。
所以基于这样的情况,为了提高分类器的稳定性以及对测试数据分类的效果,有必要对超平面的概念进行扩展,即只要求超平面能将大部分不同类别的观测区别开来就好,这样的超平面就称为软间隔(soft margin)。软间隔的这个定义又包含两种情况,一是允许部分观测穿过边界(图10-5中的5、9),但此时对观测数据的分类仍然是正确的;二是允许部分观测数据分类错误(图10-5中的9)。
同样的,从图10-5可以看出,只有落在边界上的观测4、7和穿过边界的观测5、9会影响超平面,我们只需要这几个观测就能建立一个分类器。所以,这几个观测就是我们所建立的分类器的支持向量。
由软间隔建立的分类器就是支持向量分类器,它同样是通过建立超平面将训练观测分为两侧,以测试观测落入哪一侧来判断归属于哪一类,不同的只是这时的超平面是允许部分观测穿过边界,或者部分观测分类错误的。用数学表达式来描述如何构建一个支持向量分类器,对于10.2.1的分类问题,我们构造的软间隔是如下优化问题的解:
(10.7)
可以发现,最优化问题(10.7)与(10.5)的最大区别就在于多了松弛变量(slack variable),。松弛变量的作用在于允许训练观测中有小部分观测可以穿过边界,甚至是穿过超平面。
现在来分析一下最优化问题(10.7)中的各个约束条件。同最优化问题(10.5)一样,第一个约束条件保证了求解上述最优化问题时能得到参数的唯一解,以及此时可以用表示观测到超平面的距离。对于第二个约束条件,现在不等号右边不再是简单的间隔M,而是多乘了一项。可以根据的值判断第i个观测的位置。如果,即,此时不等号右边还是等于M,则观测i是落在边界正确的一侧(图10-6中除点5、9、11以外的点);如果即,此时不等号右边的值小于M,则说明此时允许观测i穿过边界,但是分类还是正确的(图10-6中的点11);如果即,此时不等号右边的值小于0,则此时允许观测i穿过超平面,即分类是错误的(图10-6中的点5、9)。对于第三个约束,C是所有松弛变量和的上界,也就是能容忍观测穿过边界的数量或者说程度。随着C增大,能容忍观测点穿过边界的程度增大,则此时间隔越宽。
图10.6 观测位置与松弛变量的关系
那么,C一般要怎么选择呢?其实这又涉及了偏差-方差的权衡问题。当C越大时,我们能容忍观测穿过边界的程度增大,间隔越宽,则此时能够降低方差,但却可能因拟合不足而产生较大的偏差;相反,C越小,间隔越窄,这时分类器很有可能会过度拟合数据,即虽然降低了偏差,但可能产生较大的方差。所以在实际问题中,一般也是通过交叉验证的方法来确定C。
最后,再来讨论最优化问题(10.7)的求解。同样的,转化为对偶问题的求解会更容易些,这里依然采用约束来控制求解得到的参数的唯一性,所以,最优化问题(10.7)的对偶问题为:
(10.8)
还可将(10.8)写成下面的形式
(10.9)
其中是调节参数,在最小化目标函数处加了这项相当于对松弛变量施加了一个惩罚,它与将放在约束条件处的作用类似。当越大时,对惩罚越大,即被压缩得越小,所以解出的越大,即间隔越小,这就意味着允许观测穿过边界的程度越小。
最优化问题(10.9)是一个凸二次规划问题,可以通过构造拉格朗日函数对其进行求解。
一般情况下,如果两个类别的观测之间存在线性边界,那么建立一个支持向量分类器可以得到不错的效果。但是有些情况下,如果边界是非线性的,那么支持向量分类器往往效果很差。先看一个简单的例子,如图10-7(左),在一个一维空间中有几个观测点,它们分属于两个类别,分别用红色和蓝色表示不同的类别。在这种情况下,无法用一个点(即一维空间的超平面)来将不同类别的观测分开,而只有用一条复杂的曲线才能将它们分开。也就是说,在这种情况下,边界不是线性的,因此,支持向量分类器是无效的。
为了解决上述问题,尝试将自变量的二次项添加到超平面中,即此时的超平面是:
(10.10)
对于式(10.10),为了更好地理解,其实可以将x看作是一个变量,看作是另一个变量,这样它就变成了一个二维空间的问题。如图10-7(右),在构造的这个二维空间中,观测点之间就可以用一个线性超平面(即图中的黑色实线)来分割开来了,因此,在这个二维空间中,支持向量分类器是有效的。
图10-7 左:在一维空间中,观测无法用一个线性边界分割开来;右:将空间
扩展到一个二维空间中,此时可以用一个线性超平面将观测分割开来
把这个问题扩展到p维空间中,可以类似处理,还可以考虑使用观测的不同多项式,如二次、三次甚至是更高阶多项式,或者是不同观测的交互项来扩大特征空间,进而在这个扩大的特征空间中构造一个线性超平面。例如对于p维观测,使用2p个特征,,,,…来构造支持向量分类器,此时的最优化问题(10.7)就变成:
(10.11)
求解最优化问题(10.11)就能得到一个线性的边界,这个边界在原始特征空间中是一个二次多项式,通常它的解是非线性的。
前面介绍的这种方法看似非常合理,但是扩展特征空间的方法是有很多的,如果处理不当,就会得到庞大的特征空间,这时候的计算量将是惊人的。所以有必要找到合适的扩展特征空间的方法,使得在这个新的特征空间中能有效求解得到线性的超平面,这其实就是我们接下来要介绍的支持向量机方法。
支持向量机是支持向量分类器的一个扩展,它的基本思想通过将特征空间进行扩展,在扩展后的特征空间中求解线性超平面。但这里,支持向量机是通过核函数(kernel)来扩展特征空间的,这种扩展方式使得在新的特征空间中能有效求解得到线性的超平面。
在介绍核函数之前,有必要先对内积的概念进行介绍。两个观测和的内积定义为:
(10.12)
可以证明,支持向量分类器的解可以描述为内积的形式:
(10.13)
这个式子有n个参数,,每个训练观测对应一个参数。所以,要估计出所有的,只需要计算个成对组合的内积即可。另外,为了计算f(x)的值,需要计算的是新的观测点x与每个训练观测的内积。但事实证明,有且仅有支持向量对应的是非零的,所以,若用S表示支持向量观测点的指标的集合,那么(10.13)可以改写成:
(10.14)
这样,式(10.14)的求和项就比式(10.13)要少得多。
总而言之,为了估计系数进而得到线性分类器f(x),所需的仅仅是内积。
现在,用一种一般化的形式
来代替内积,这就是前面提到的核函数。此时,f(x)变为:
(10.15)
核函数其实是一类用来衡量观测之间的相似性的函数,表10-2列出了三种最常使用的核函数。
表10-2 三种最常使用的核函数
在表10-2列出的三种核函数中,线性核函数是一类最简单的核函数,若使用这种核函数,就等于是建立支持向量分类器。而对于多项式核函数来说,当时,所建立的支持向量机其实也就是支持向量分类器。最后对于径向核函数,表示的是p维空间中两个观测的欧式距离,而是一个正的常数,它通常也是通过交叉验证法来确定。
本节的最后,再简单说明两个问题:
(1)关于核函数的选择一直以来都是支持向量机研究的热点,但是学者们通过大量的研究并没有形成定论,即没有最优核函数。通常情况下,径向核函数是使用最多的。
(2)采用核函数而不是类似10.4.1节提到的直接扩展特征空间的方式的优势在于,使用核函数,仅需要计算个成对组合的,而若采取直接扩展特征空间的方式,是没有明确的计算量的;另外,对于某些核函数,例如径向核函数来说,它的特征空间是不确定的,并且可以扩展到无限维,所以是无法对这样的特征空间进行计算的。
在R中,能实现支持向量机的包有很多,其中最常用的就是e1071包中的svm()函数。svm()函数可以利用支持向量机的原理实现分类和预测,如果因变量为因子型数据的分类变量,则自动执行标准的支持向量分类,如果因变量为数值型数据,则自动执行支持向量回归,特定的训练方式可以通过函数中的type参数进行选择。该函数中各参数的具体含义可以参考e1071包的说明文档,这里只介绍与核函数的设置相关的参数,见表10-3。
表10-3 svm()核函数解释
在svm()函数中,最重要的两个参数是cost和gamma。cost是对松弛变量的惩罚,即式(10.9)中的调节参数,cost参数值设置越大,则间隔会越窄,就会有更少的支持向量落在边界上或穿过边界;cost参数值设置越小,则间隔会越宽,就会有更多的支持向量落在边界上或穿过边界。gamma是除线性核函数外其余核函数都需要的参数,不同的参数设定对分类效果影响很大。e1071包中的tune.svm()可以帮助我们自动选择最优的参数,常用于正式建模前。
另外,由于支持向量机是一种有监督的机器学习方法,通常对训练集进行学习后,要用测试集进行分类效果检验。与svm()函数搭配使用的函数有predict()与plot.svm(),可用于建模后的预测和可视化。
不过,对于高维数据,svm()函数并不是很理想。在高维甚至超高维情况下,通过核函数进行更高维的映射的效果与原空间直接做线性支持向量机差别不大。因此,在高维数据中,LiblineaR包效果更好。
先展示在二维空间上观测线性可分或近似线性可分的情况下,svm()函数的应用。先随机生成两个属于不同类别的观测集。
> set.seed ( 123 )
> x <- matrix ( rnorm ( 40 * 2 ) , ncol = 2 )
> y <- rep ( c ( -1 , 1 ) , each = 20 )
> x [ y == 1 , ] <- x [ y == 1 , ] + 3
用plot()函数将这些观测画出来,观测它们的分布情况。
> plot ( x , col = y + 5 , xlab = "x1" , ylab = "x2" )
图10-8 随机生成的两类具有线性决策边界的观测
从图10-8中可以看出,两个类别的观测是线性可分的,所以接下来考虑两种情况,即对两种类别的观测建立两种分类器:支持向量分类器和最大间隔分类器。
首先建立支持向量分类器,这个时候kernel应该设置为linear,cost此处先设置为1。注意svm()函数处理分类问题时要求响应变量必须为因子型,所以将y转化为因子型,并与预测变量一起建立一个数据框。
> y <- as.factor ( y )
> dat <- data.frame ( x = x , y = y )
> svm1 <- svm ( y ~. , data = dat , kernel = "linear" , cost = 1 )
可以通过summary()函数查看拟合的这个分类器的基本信息。
> summary ( svm1 )
Call:
svm(formula = y ~ ., data = dat, kernel = "linear", cost = 1 )
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 1
gamma: 0.5
Number of Support Vectors: 6
( 3 3 )
Number of Classes: 2
Levels:
-1 1
summary()函数指出了这个分类器共有6个支持向量。我们可以通过以下命令具体查看哪几个观测是支持向量。
> svm1 $ index
[1] 4 11 16 24 26 32
进一步地,我们还可以使用plot.svm()函数画出决策边界,如图10-9(左)。plot.svm()有两个参数,一个是调用的函数的结果,另一个是所使用的数据。
> plot ( svm1 , dat )
图10-9 左:cost = 1的支持向量分类器;右:cost = 0.1的支持向量分类器
图中标“×”的是支持向量,其余观测都使用圆圈表示,可以看出,确实有6个支持向量。另外蓝色和粉色区域分别表示两个类别,它们的分割是一条直线,即线性的决策边界。
注:由于微信排版限制,部分公式未对齐,书籍中均正常。
作者简介
方匡南,厦门大学经济学院教授、博士生导师、耶鲁大学博士后、厦门大学数据挖掘研究中心副主任。入选国家“万人计划”青年拔尖人才,国际统计学会推选会士(ISI Elected member),全国工业统计学会常务理事、数据科学与商业智能学会常务理事,中国青年统计学家协会常务理事等。主要研究方向为 数据科学,机器学习,应用统计。先后与华为、华星光电、厦门国际银行、南方电网、普益标准、北京诺信创联等众多企业有联合研究,先后为联通、华星光电、建设银行、农业银行、国元集团等众多企业提供培训。
欢迎选购作者新作《数据科学》
了解更多详情
京东自营
当当自营
以上是关于数据科学 | 第10讲:支持向量机的主要内容,如果未能解决你的问题,请参考以下文章