我们之前讨论的情况都是建立在样例线性可分的假设上,当样例线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办呢,我们需要将模型进行调整,以保证在不可分的情况下,也能够尽可能地找出分隔超平面。

看下面两张图:

7. SVM松弛变量-LMLPHP

可以看到一个离群点(可能是噪声)可以造成超平面的移动,间隔缩小,可见以前的模型对噪声非常敏感。再有甚者,如果离群点在另外一个类中,那么这时候就是线性不可分了。

这时候我们应该允许一些点游离并在在模型中违背限制条件(函数间隔大于1)。我们设计得到新的模型如下(也称软间隔):

7. SVM松弛变量-LMLPHP

引入非负参数7. SVM松弛变量-LMLPHP后(称为松弛变量),就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,或者函数间隔是负数,即样本点在对方的区域中。而放松限制条件后,我们需要重新调整目标函数,以对离群点进行处罚,目标函数后面加上的7. SVM松弛变量-LMLPHP就表示离群点越多,目标函数值越大,而我们要求的是尽可能小的目标函数值。

这里的C是离群点的权重,C越大表明离群点对目标函数影响越大,也就是越不希望看到离群点。我们看到,目标函数控制了离群点的数目和程度,使大部分样本点仍然遵守限制条件。

引入松弛变量(惩罚因子)后,有一种很常用的变形可以用来解决分类问题中样本的“偏斜”问题。

先来说说样本的偏斜问题,也叫数据集偏斜(unbalanced),它指的是参与分类的两个类别(也可以指多个类别)样本数量差异很大。比如说正类有10000个样本,而负类只给了100个,这会引起的问题显而易见,可以看看下面的图:

7. SVM松弛变量-LMLPHP

方形的点是负类。7. SVM松弛变量-LMLPHP7. SVM松弛变量-LMLPHP7. SVM松弛变量-LMLPHP是根据给的样本算出来的分类面,由于负类的样本很少很少,所以有一些本来是负类的样本点没有提供,比如图中两个灰色的方形点,如果这两个点有提供的话,那算出来的分类面应该是7. SVM松弛变量-LMLPHP7. SVM松弛变量-LMLPHP7. SVM松弛变量-LMLPHP,他们显然和之前的结果有出入,实际上负类给的样本点越多,就越容易出现在灰色点附近的点,我们算出的结果也就越接近于真实的分类面。但现在由于偏斜的现象存在,使得数量多的正类可以把分类面向负类的方向“推”,因而影响了结果的准确性。

对付数据集偏斜问题的方法之一就是在惩罚因子上作文章,那就是给样本数量少的负类更大的惩罚因子,表示我们重视这部分样本,因此我们的目标函数中因松弛变量而损失的部分就变成了:

7. SVM松弛变量-LMLPHP

其中7. SVM松弛变量-LMLPHP是正样本,7. SVM松弛变量-LMLPHP是负样本。libSVM这个算法包在解决偏斜问题的时候用的就是这种方法。

7. SVM松弛变量-LMLPHP7. SVM松弛变量-LMLPHP怎么确定呢?它们的大小是试出来的(参数调优),但是他们的比例可以有些方法来确定。咱们先假定说7. SVM松弛变量-LMLPHP是5,那确定7. SVM松弛变量-LMLPHP的一个很直观的方法就是使用两类样本数的比来算,对应到刚才举的例子,7. SVM松弛变量-LMLPHP就可以定为500(因为10,000:100=100:1)。

但是这样并不够好,回看刚才的图,你会发现正类之所以可以“欺负”负类,其实并不是因为负类样本少,真实的原因是负类的样本分布的不够广(没扩充到负类本应该有的区域)。所以给7. SVM松弛变量-LMLPHP7. SVM松弛变量-LMLPHP确定比例更好的方法应该是衡量他们分布的程度。比如可以算算他们在空间中占据了多大的体积,例如给负类找一个超球——就是高维空间里的球啦——它可以包含所有负类的样本,再给正类找一个,比比两个球的半径,就可以大致确定分布的情况。显然半径大的分布就比较广,就给小一点的惩罚因子。

但是这样还不够好,因为有的类别样本确实很集中,这不是提供的样本数量多少的问题,这是类别本身的特征,这个时候即便超球的半径差异很大,也不应该赋予两个类别不同的惩罚因子。这样应该怎么解决呢……实际中,完美的方法是没有的,只要根据需要,选择实现简单又合用的就好了。

05-08 08:10