12.1 大边界的直观理解
先直观理解一下支持向量机,人们有时将支持向量机看作是大间距分类器。
具体而言,如果你考察这样一个数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的。我的意思是,存在一条直线把正负样本分开。当然有多条不同的直线,可以把正样本和负样本完全分开。
比如,这就是一个决策边界可以把正样本和负样本分开。但是多多少少这个看起来并不是非常自然是么?
或者我们可以画一条更差的决策界,这是另一条决策边界,可以将正样本和负样本分开,但仅仅是勉强分开,这些决策边界看起来都不是特别好的选择,支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界。这条黑色的看起来好得多,黑线看起来是更稳健的决策界。在分离正样本和负样本上它显得的更好。数学上来讲,这是什么意思呢?这条黑线有更大的距离,这个距离叫做间距(margin)。
当画出这两条额外的蓝线,我们看到黑色的决策界和训练样本之间有更大的最短距离。然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器。
支持向量机(那条分界线)的公式为
如果C非常大,则最小化代价函数的时候,我们将会希望找到一个使第一项为的最优解。因此,让我们尝试在代价项的第一项为的情形下理解该优化问题。比如我们可以把设置成了非常大的常数,这将给我们一些关于支持向量机模型的直观感受。
在这里讲一下正则化参数C的设置。
我们将这个大间距分类器中的正则化因子常数设置的非常大,我记得我将其设置为了100000,因此对这样的一个数据集,也许我们将选择这样的决策界,从而最大间距地分离开正样本和负样本。那么在让代价函数最小化的过程中,我们希望找出在和两种情况下都使得代价函数中左边的这一项尽量为零的参数。如果我们找到了这样的参数,则我们的最小化问题便转变成:
事实上,支持向量机现在要比这个大间距分类器所体现得更成熟,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier)的影响。比如我们加入一个额外的正样本。
在这里,如果你加了这个样本,为了将样本用最大间距分开,也许我最终会得到一条类似这样的决策界,对么?就是这条粉色的线,仅仅基于一个异常值,仅仅基于一个样本,就将我的决策界从这条黑线变到这条粉线,这实在是不明智的。而如果正则化参数设置的非常大,这事实上正是支持向量机将会做的。它将决策界,从黑线变到了粉线,但是如果设置的小一点,如果你将C设置的不要太大,则你最终会得到这条黑线,当然数据如果不是线性可分的,如果你在这里有一些正样本或者你在这里有一些负样本,则支持向量机也会将它们恰当分开。
因此,大间距分类器的描述,仅仅是从直观上给出了正则化参数非常大的情形,同时,要提醒你的作用类似于,是我们之前使用过的正则化参数。这只是非常大的情形,或者等价地非常小的情形。你最终会得到类似粉线这样的决策界,但是实际上应用支持向量机的时候,当不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。
回顾,因此:
较大时,相当于较小,可能会导致过拟合,高方差。
较小时,相当于 较大,可能会导致低拟合,高偏差。
12.2 核函数
回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:
为了获得上图所示的判定边界,我们的模型可能是...的形式。
我么可以用一系列的新的特征来替换模型中的每一项。例如令:
可以得到。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造?我们可以利用核函数来计算出新的特征。
给定一个训练实例,我们利用的各个特征与我们预先选定的地标(landmarks)的近似程度来选取新的特征。
例如:
其中是实例中所有特征与地标之间的距离的和。上例中的就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。
这些地标的作用是什么?如果一个训练实例与地标之间的距离近似于,则新特征近似于,如果训练实例与地标之间距离较远,则近似于.
假设我们的训练实例含有两个特征,给定地标与不同的值,见下图:
图中水平面的坐标为,而垂直坐标轴代表。可以看出,只有当与重合时,即,则,这个时候处于最高点即最大值。随着的改变值改变的速率受到的控制。
看到上图,,当实例处于粉红色的点位置处,因为其离最近,但是离和较远,因此接近,而接近。因此,因此预测。同理可以求出,对于离较近的绿色点,也预测,但是对于蓝绿色的点,因为其离三个地标都较远,预测。
这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练实例和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练实例本身的特征,而是通过核函数计算出的新特征。
下面有个问题!!!我们应该如何选择地标呢?
我们通常是根据训练集的数量选择地标的数量,即如果训练集中有个实例,则我们选取个地标,并且令:,,...,。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:
给定,计算新特征,当时,预测,否则反之。
相应地修改代价函数为:,在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算时,我们用代替,其中是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。
理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。
在此,我们不介绍最小化支持向量机的代价函数的方法,我们可以使用python很多模块去实现。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。
另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。
下面是支持向量机的两个参数和的影响:
已知
当较大时,相当于较小,可能会导致过拟合,高方差;
当较小时,相当于较大,可能会导致低拟合,高偏差;
较大时,可能会导致低方差,高偏差;
较小时,可能会导致低偏差,高方差。
12.3 使用支持向量机
我们要知道在高斯核函数之外我们还有其他一些选择,如:
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数(chi-square kernel)
直方图交集核函数(histogram intersection kernel)
等等
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer's定理,才能被支持向量机的优化软件正确处理。
多类分类问题
假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有个类,则我们需要个模型,以及个参数向量。我们同样也可以训练个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。
尽管我们不去写自己的SVM的优化软件,但是我们也需要做几件事:
1、是提出参数的选择。我们在讨论过误差/方差在这方面的性质。
2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的SVM(支持向量机),这就意味这他使用了不带有核函数的SVM(支持向量机)。
下面是一些普遍使用的准则:
为特征数,为训练样本数。
(1)如果相较于而言,要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果较小,而且大小中等,例如在之间,而在之间,使用高斯核函数的支持向量机。
(3)如果较小,而较大,例如在之间,而大于,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。
SVM会工作得很好,但是它们仍然会有一些慢。当你有非常非常大的训练集,且用高斯核函数是在这种情况下,我经常会做的是尝试手动地创建,拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。如果你看到这个幻灯片,看到了逻辑回归,或者不带核函数的支持向量机。在这个两个地方,我把它们放在一起是有原因的。原因是:逻辑回归和不带核函数的支持向量机它们都是非常相似的算法,不管是逻辑回归还是不带核函数的SVM,通常都会做相似的事情,并给出相似的结果。但是根据你实现的情况,其中一个可能会比另一个更加有效。但是在其中一个算法应用的地方,逻辑回归或不带核函数的SVM另一个也很有可能很有效。但是随着SVM的复杂度增加,当你使用不同的内核函数来学习复杂的非线性函数时,这个体系,你知道的,当你有多达1万(10,000)的样本时,也可能是5万(50,000),你的特征变量的数量这是相当大的。那是一个非常常见的体系,也许在这个体系里,不带核函数的支持向量机就会表现得相当突出。你可以做比这困难得多需要逻辑回归的事情。