1 概述
支持向量机(SVM,也称为支持向量网络),是机器学习中获得关注最多的算法。它源于统计学习理论,是除了集成学习算法之外,接触到的第一个强学习器。
从算法的功能来看,SVM囊括了很多其他算法的功能:
从分类效力来讲,SVM在无论线性还是非线性分类中,都是明星般的存在。
在实际应用来看,SVM在各种实际问题中都表现非常优秀。它在手写识别数字和人脸识别中应用广泛,在文本和超文本的分类中举足轻重,因为SVM可以大量减少标准归纳(standard inductive)和转换设置(transductive settings)中对标记训练实例的需求。同时,SVM也被用来执行图像的分类,并用于图像分割系统。实验结果表明,在仅仅三到四轮相关反馈之后,SVM就能实现比传统的查询细化方案(query refinement schemes)高出一大截的搜索精度。除此之外,生物学和许多其他科学都是SVM的青睐者,SVM现在已经广泛被用于蛋白质分类,在化合物分类的业界平均水平可以达到90%以上的准确率。在生物科学的尖端研究中,还使用支持向量机来识别用于模型预测的各种特征,以找出各种基因表现结果的影响因素。
从学术的角度来看,SVM是最接近深度学习的机器学习算法。线性SVM可以看成是神经网络的单个神经元(虽然它的损失函数与神经网络不同),非线性的SVM则与两层的神经网络相当,非线性的SVM中如果添加多个核函数,就可以模仿多层的神经网络。从数学的角度来看,SVM的数学原理是公认的对初学者来说很难,对于没有数学基础和数学逻辑熏陶的人来说,探究SVM的数学原理是很难的。
1.1 支持向量机分类器是如何工作的
支持向量机的分类方法,是在一组数据分布中找出一个超平面作为决策边界,使模型在数据上的分类误差尽量小,尤其是在未知数据集上的分类误差(泛化误差)尽量小。
关键概念:超平面 |
---|
在几何中,超平面是一个空间的子空间,它是维度比所在空间小一维的空间。如果数据空间本身是三维的,则其超平面是二维平面,而如果数据空间本身是二维的,则其超平面是一维的直线。在二分类问题中,如果一个超平面能够将数据划分为两个集合,其中每个集合中包含单独的一个类别,就说这个超平面是数据的“决策边界”。 |
决策边界一侧的所有点分类属于一个类,而另一侧的所有点分类属于另一个类。如果能够找出决策边界,分类问题就可以变成探讨每个样本对于决策边界而言的相对位置。如果把数据当作训练集,只要直线的一边只有一种类型的数据,就没有分类错误,训练误差就为0。但是,对于一个数据集来说,让训练误差为0的决策边界可以有无数条。
在此基础上,无法保证决策边界在未知数据集(测试集)上的表现也会优秀。对于现有的数据集来说,有 B 1 B_1 B1和 B 2 B_2 B2两条可能的决策边界,并且两条决策边界在数据集上的训练误差都是0,没有一个样本被分错。可以把决策边界 B 1 B_1 B1向两边平移,直到碰到离这条决策边界最近的方块或圆圈后停下,形成两个新的超平面,分别是 b 11 b_{11} b11和 b 12 b_{12} b12,并且将原始的决策边界移动到 b 11 b_{11} b11和 b 12 b_{12} b12的中间,确保 B 1 B_1 B1到 b 11 b_{11} b11和 b 12 b_{12} b12的距离相等。在 b 11 b_{11} b11和 b 12 b_{12} b12中间的距离,叫做 B 1 B_1 B1这条决策边界的边际(margin),通常记作 d d d,并称 b 11 b_{11} b11和 b 12 b_{12} b12为“虚线超平面”。对 B 2 B_2 B2也执行同样的操作。
引入与原本的数据集相同分布的测试样本(如图中红色方块和圆圈),平面中的样本变多了。可以发现,对决策边界 B 1 B_1 B1而言,依然没有一个样本被分错,这条决策边界上的泛化误差还是0。但是对于 B 2 B_2 B2而言,有三个方块被误分类为圆圈,而有两个圆被误分类为方块,这条决策边界上的泛化误差就远远大于 B 1 B_1 B1了。说明拥有更大边际的决策边界在分类中的泛化误差更小,这一点可以由结构风险最小化定律来证明(SRM)。如果边际很小,任何轻微的扰动都会对决策边界的分类产生很大的影响。边际很小的情况,是一种模型在训练集上表现很好,在测试集上表现糟糕的情况,所以会“过拟合”。因此,在寻找决策边界时,希望边际越大越好。
支持向量机就是通过找出边际最大的决策边界,来对数据进行分类的分类器。也因此,支持向量机分类器又叫做最大边际分类器。
1.2 支持向量机原理的三层理解
目标是“找出边际最大的决策边界”,这是一个最优化问题。而最优化问题往往与损失函数联系在一起。和逻辑回归中的过程一样,SVM也是通过最小化损失函数来求解一个用于后续模型使用的信息:决策边界。
1.3 sklearn中的支持向量机
类 | 含义 | 输入 |
---|---|---|
svm.LinearSVC | 线性支持向量分类 | [penalty, loss, dual, tol, C, …] |
svm.LinearSVR | 线性支持向量回归 | [epsilon, tol, C, loss, …] |
svm.SVC | 非线性多维支持向量分类 | [C, kernel, degree, gamma, coef0, …] |
svm.SVR | 非线性多维支持向量回归 | [kernel, degree, gamma, coef0, tol, …] |
svm.NuSVC | Nu支持向量分类 | [nu, kernel, degree, gamma, …] |
svm.NuSVR | Nu支持向量回归 | [nu, C, kernel, degree, gamma, …] |
svm.OneClassSVM | 无监督异常值检测 | [kernel, degree, gamma, …] |
svm.l1_min_c | 返回参数C的最低边界,使得对于C in (l1_min_c, infinity),模型保证不为空 | X, y[, loss, fit_intercept, …] |
除了本身所带的类之外,sklearn还提供了直接调用libsvm库的几个函数。libsvm是易于使用和快速有效的英文的SVM库,提供了大量SVM的底层计算和参数选择,也是sklearn的众多类背后所调用的库。下载官网为:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
因此,也可以直接使用libsvm的函数(函数直接输入参数返回结果,不需要实例化,不需要fit;类需要实例化,需要训练,然后使用接口来导出结果)
直接使用libsvm的函数 | |
---|---|
svm.libsvm.cross_validation | SVM专用的交叉验证 |
svm.libsvm.decision_function | SVM专用的预测边际函数(libsvm名称为predict_values) |
svm.libsvm.fit | 使用libsvm训练模型 |
svm.libsvm.predict | 给定模型预测X的目标值 |
svm.libsvm.predict_proba | 预测概率 |
注意:除了特别标明是线性的两个类LinearSVC和LinearSVR之外,其他的所有类都是同时支持线性和非线性的。NuSVC和NuSVR可以手动调节支持向量的数目,其他参数都与最常用的SVC和SVR一致。其中OneClassSVM是无监督的类。
2 sklearn.svm.SVC
sklearn.svm.svc(C = 1.0, kernel = ‘rbf’, degree = 3, gamma = ‘auto_deprecated’, coef0 = 0.0, shrinking = True, probability = False, tol = 0.001, cache_size = 200, class_weight = None, verbose = False, max_iter = -1, decision_function_shape = ‘ovr’, random_state = None)
2.1 线性SVM用于分类的原理
2.1.1 线性SVM的损失函数详解
要理解SVM的损失函数,先定义决策边界。假设现在数据中总计有 N N N个训练样本,每个训练样本 i i i可以被表示为 ( x i , y i ) ( i = 1 , 2 , . . . . . . , N ) (\textbf{x}_i,y_i)(i=1,2,......,N) (xi,yi)(i=1,2,......,N),其中 x i \textbf{x}_i xi是 ( x 1 i , x 2 i , . . . . . . , x n i ) T (x_{1i},x_{2i},......,x_{ni})^T (x1i,x2i,......,xni)T这样的一个特征向量,每个样本总共含有 n n n个特征。二分类标签 y i y_i yi的取值是 − 1 , 1 {-1,1} −1,1
如果n等于2,则有 i = ( x 1 i , x 2 i , y i ) T i = (x_{1i},x_{2i},y_i)^T i=(x1i,x2i,yi)T,分别由特征向量和标签组成。此时可以在二维平面上,以 x 2 x_2 x2为横坐标, x 1 x_1 x1为纵坐标, y y y为颜色,来可视化所有 N N N个样本。
其中紫色点的标签为1,红色点的标签为-1。要在这个数据集上寻找一个决策边界,在二维平面上,决策边界(超平面)就是一条直线。而二维平面上的任意一条线可以被表示为:
x 1 = a x 2 + b x_1 = ax_2 + b x1=ax2+b
将表达式变换一下: 0 = w T x + b 0 = \textbf{w}^T\textbf{x}+b 0=wTx+b
其中[ a a a,-1]就是参数向量 w \textbf{w} w, x \textbf{x} x就是特征向量, b b b是截距。这个表达式很像线性回归的公式: y ( x ) = θ T x + θ 0 y(x) = {\theta}^T\textbf{x}+\theta_0 y(x)=θTx+θ0
线性回归中等号的一边是标签,回归过后会拟合出一个标签,而决策边界的表达式中却没有标签的存在,全部是由参数、特征和截距组成的一个式子,等号的一边是0。
在一组数据下,给定固定的 w \textbf{w} w和 b b b,这个式子就是一条固定直线,在 w \textbf{w} w和 b b b不确定的状况下,这个表达式 w T x + b = 0 \textbf{w}^T\textbf{x}+b=0 wTx+b=0就可以代表平面上的任意一条直线。如果在 w \textbf{w} w和 b b b固定时,给定一个唯一的 x x x的取值,这个表达式可以表示一个固定的点。在SVM中,就使用这个表达式来表示决策边界。目标是求解能够让边际最大化的决策边界,所以要求解参数向量 w \textbf{w} w和截距 b b b。
如果在决策边界上任意取两个点 x a x_a xa、 x b x_b xb,并代入决策边界的表达式中,则有:
w T x a + b = 0 \textbf{w}^T\textbf{x}_a+b = 0 wTxa+b=0
w T x b + b = 0 \textbf{w}^T\textbf{x}_b+b = 0 wTxb+b=0
将两式相减,可以得到:
w T ∗ ( x a − x b ) = 0 \textbf{w}^T*(\textbf{x}_a - \textbf{x}_b) = 0 wT∗(xa−xb)=0
一个列向量的转置乘以另一个列向量,可以得到两个向量的点积(dot product),表示为 < w . ( x a − x b ) > <w.(\textbf{x}_a-\textbf{x}_b)> <w.(xa−xb)>。两个向量的点积为0表示两个向量的方向是互相垂直的。 x a \textbf{x}_a xa与 x b \textbf{x}_b xb是一条直线上的两个点,相减后得到的向量方向是由 x b \textbf{x}_b xb指向 x a \textbf{x}_a xa,所以 x a − x b \textbf{x}_a - \textbf{x}_b xa−xb的方向是平行于它们所在的直线——决策边界的。而 w \textbf{w} w与 x a − x b \textbf{x}_a - \textbf{x}_b xa−xb相互垂直,所以参数向量 w \textbf{w} w的方向必然是垂直于决策边界的。
任意一个紫色的点 x p x_p xp可以被表示为: w ∗ x p + b = p \textbf{w}*\textbf{x}_p+b = p w∗xp+b=p。由于紫色的点所代表的标签 y y y是1,所以规定 p > 0 p>0 p>0。同样的,对于任意一个红色的点 x r x_r xr而言,可以将其表示为: w ∗ x r + b = r \textbf{w}*\textbf{x}_r+b = r w∗xr+b=r,由于红色点所表示的标签 y y y是-1,所以规定 r < 0 r<0 r<0。由此,如果有新的测试数据 x t \textbf{x}_t xt,则 x t \textbf{x}_t xt的标签就可以根据以下式子来判定:
y = { 1 , i f w ∗ x t + b > 0 1 , i f w ∗ x t + b < 0 y = \begin{cases} 1,if \textbf{w}*\textbf{x}_t+b>0 \\ 1,if \textbf{w}*\textbf{x}_t+b<0 \end{cases} y={
1,ifw∗xt+b>01,ifw∗xt+b<0
核心误区:p和r的符号 |
---|
在这里,p和r的符号是人为规定的。存在这样的误解:认为p和r的符号是由原本的决策边界上下移动得到的(向上平移应该是截距增加,即在b后加上一个正数,变换到等号的另一边就是一个负数,与p>0不吻合,所以,p和r的符号不完全是平移的结果),或是认为“直线以上的点代入直线为正,直线以下的点代入直线为负”是直线的性质(一个点在直线的上方究竟会返回什么符号,是和直线的表达式的写法有关的,不是直线上的点都为正,直线下的点都为负)。p和r的符号主要是为了后续计算和推导的简便,这种规定不会影响对参数向量 w \textbf{w} w和截距 b b b的求解。 |
决策边界的两边要有两个超平面,这两个超平面在空间中就是两条平行线,他们之间的距离就是边际 d d d。这条决策边界位于两条线的中间,所以这两条平行线必然是对称的。令这两条平乡线表示为:
w ∗ x + b = k , w ∗ x + b = − k \textbf{w}*\textbf{x}+b = k,\textbf{w}*\textbf{x}+b = -k w∗x+b=k,w∗x+b=−k
两个表达式同时除以 k k k,则可以得到:
w ∗ x + b = 1 , w ∗ x + b = − 1 \textbf{w}*\textbf{x}+b = 1,\textbf{w}*\textbf{x}+b = -1 w∗x+b=1,w∗x+b=−1
这就是平行于决策边界的两条线的表达式,表达式两边的1和-1分别表示了两条平行于决策边界的虚线到决策边界的相对距离。可以让这两条线分别过两类数据中距离决策边界最近的点,这些点被称为“支持向量”,而决策边界永远在这两条线的中间,所以是可以被调整的。令紫色类的点为 x p x_p xp,红色类的点为 x r x_r xr,可以得到:
w ∗ x p + b = 1 , w ∗ x r + b = − 1 \textbf{w}*\textbf{x}_p+b = 1,\textbf{w}*\textbf{x}_r+b = -1 w∗xp+b=1,w∗xr+b=−1
两式相减,可得:
w ∗ ( x p − x r ) = 2 \textbf{w}*(\textbf{x}_p-\textbf{x}_r) = 2 w∗(xp−xr)=2
如图所示, ( x p − x r ) (\textbf{x}_p-\textbf{x}_r) (xp−xr)可表示为两点之间的连线,由于边际 d d d是平行于 w \textbf{w} w的,所以现在相当于是得到了三角形中的斜边,并且已知一条直角边的方向。根据线性代数中的数学性质(线性代数中模长的运用:向量b除以自身的模长||b||可以得到b方向上的单位向量;向量a乘以向量b方向上的单位向量,就可以得到向量a在向量b方向上的投影长度),将上式两边同时除以 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣,可以得到:
w ∗ ( x p − x r ) ∣ ∣ w ∣ ∣ = 2 ∣ ∣ w ∣ ∣ \frac{\textbf{w}*(\textbf{x}_p-\textbf{x}_r)}{||w||} = \frac{2}{||w||} ∣∣w∣∣w∗(xp−xr)=∣∣w∣∣2
d = 2 ∣ ∣ w ∣ ∣ d = \frac{2}{||w||} d=∣∣w∣∣2
别忘了!目标是最大边界所对应的决策边界,而要最大化 d d d,就是要求解 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣的最小值。极值问题可以相互转化,把求解 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣的最小值转化为求解以下函数的最小值:(之所以要在模长上加上平方,是因为模长的本质是一个距离,所以它是带根号的,对其取平方是为了消除根号,并且模长的本质是向量 w \textbf{w} w的L2范式。)
f ( w ) = ∣ ∣ w ∣ ∣ 2 2 f(w) = \frac{||w||^2}{2} f(w)=2∣∣w∣∣2
由于两条虚线表示的超平面,是数据边缘所在的点,因此对于任意样本 i i i,都可以把决策函数写作:
w ∗ x i + b > = 1 , i f y i = 1 \textbf{w}*\textbf{x}_i+b>=1,if y_i = 1 w∗xi+b>=1,ifyi=1
w ∗ x i + b < = − 1 , i f y i = − 1 \textbf{w}*\textbf{x}_i+b<=-1,if y_i = -1 w∗xi+b<=−1,ifyi=−1
整理一下,可以把两个式子整合成:
y i ( w ∗ x i + b ) > = 1 , i = 1 , 2 , .