支持向量机(第五章)

第五章 软边界SVM

处理异常数据

硬边界SVM最大的问题是它要求数据必须是线性可分的。而实际上数据经常会有异常情况出现。就算你的数据是线性可分的,在你给你的模型喂数据之前还是会有大量的事情发生。也许是谁误输入了一个示例数据,或者是某些情况下返回的离谱的值。在这些异常数据(一个数据点看起来好像脱离了它的群体)会造成两个结果:这些异常数据非常接近我们分类示例数据让分类边界变窄,或者它们跑到了另一边而破坏线性分类。让我们来看这两类数据硬边界SVM如何处理。

异常数据让边界变窄

当这些数据是线性可分的,遇到异常数据时硬边界分类器表现得不是很好。

让我们关注一下在我们的数据中加上一个异常数据点(5,7),如图33所示。

支持向量机(第五章)

图33:在加入异常数据(5,7)后仍是线性可分的

在这个示例中,我们能看到边界已经非常窄了,这个异常数据似乎是造成这种变化的主要原因。直觉上,我们能看到这个超平面像是不能很好的分类这些数据,显得非常勉强。

异常数据破坏线性可分

更差的是,当异常数据破坏线性可分是,如图34中的点(7,8),分类器已经找不到超平面了。我们被卡住了仅仅因为这一个数据点。

支持向量机(第五章)

图34:异常数据(7,8)破坏了线性可分

软边界来换救

在1995年,Vapnik 和 Cortes 介绍了一个在原SVM上变化的版本允许分类器面对一些错误值。目的是不能做到零错误,但是可以允许少量错误。

做法是,他们修改了优化问题的约束而增加了一个变量ζ(zeta)。将约束:

支持向量机(第五章)

变为:

支持向量机(第五章)

结果,当最小化这个目标函数,它可以满足一些不符合原约束的示例数据(在这里,是指过于接近超平面或是不是出现在超平面的正确一边的数据)。代码表29显示这个方法。

代码表29

import numpy as np

w = np.array([0.4, 1])

b = -10

x = np.array([6, 8])

y = -1

def constraint(w, b, x, y):

return y * (np.dot(w, x) + b)

def hard_constraint_is_satisfied(w, b, x, y):

return constraint(w, b, x, y) >= 1

def soft_constraint_is_satisfied(w, b, x, y, zeta):

return constraint(w, b, x, y) >= 1 - zeta

# While the constraint is not satisfied for the example (6,8).

print(hard_constraint_is_satisfied(w, b, x, y)) # False

# We can use zeta = 2 and satisfy the soft constraint.

print(soft_constraint_is_satisfied(w, b, x, y, zeta=2)) # True

问题是我们可以选一个非常大的值赋给ζ,这样所有的约束将被满足。

代码表30

# We can pick a huge zeta for every point # to always satisfy the soft constraint.

print(soft_constraint_is_satisfied(w, b, x, y, zeta=10)) # True

print(soft_constraint_is_satisfied(w, b, x, y, zeta=1000)) # True

为了避免这种情况发生,我们修改目标函数去限制选择大的ζi:

支持向量机(第五章)

我们把所有个体的ζi的和放到目标函数中去。加上这个限制叫做正则化。之后,这个超平面的边界将变大以容纳少量的错误值。

这里还有一个问题。在这个公式中,我们很容易就让这个ζi的值为负数。我们增加约束ζi≧0 来阻止这种情况发生。此外,我们需要在软边界上保持控制。也许什么时候我们想直接用硬边界——必竟,这就是为什么我们增加一个参数C,它能使我们决定这个ζ的作用(之后会看到它有很多作用)。

这些让我们可以给出软边界公式:

支持向量机(第五章)

在(Vapnik V. N., 1998)中,使用了与这相同的技巧来处理分类,我们发现我们要求之前约束稍有不同乌尔夫对偶的最大值:

支持向量机(第五章)

在这里约束ai≧0 已变为0≦ai≦C。这个约束通常称为盒子约束因为这个向量a在正象限与C之间像是躺在一个盒子里。注意这个象限是在模拟的n-维欧几里得空间里的一个平面向限上(Cristianini & Shawe-Taylor, 2000) 。我们将形象的用介绍SMO算法的章节中的图50来表示这个盒子约束。

当前这个优化问题也称为1次范式软边界,是因为我们只是求斯莱克向量ζ的一次范式的最小值。

理解C的作用

参数C让你控制如何让SVM来处理错误。让我们举例说明如何去改变它的值来得到不同的超平面。

图35展示我们在整本书一直用的线性可分数据集。在左边的图上,我们可以看到将C的值设为+∞时得到的是和硬边界相同的结果。然而,当我们给C一个小的值,结果显示在中间的图上,我们可以看到这个超平面非常接近一些点。有违反硬边界约束的示例数据,设C=0.01让增强了这种现象如右图所示。

支持向量机(第五章)

图35:C=+∞,C=1,C=0.01在线性可分数据集中的效果

它表明,当数据是线性可分时,选择一个大C是明智的。但是假如我们增加几个异常数据会发生什么?在这里,我们可以看图36,用C=+∞得到一个非常窄的边界。然而,当我们用C=1时,结果我们得到一个非常接近没有异常数据的硬边界分类器的超平面。这里只有异常数据不受约束,我们比较满意这个超平面。这时,让C=0.01时最后我们看到另一种违背约束的例子,它不只出现一个异常值。C的值看起来对我们的软边界分类器太自由了。

支持向量机(第五章)

图36: 在有异常值但仍线性可分的数据集下C=+∞,C=1,C=0.01的效果

最后,在这里我们增加一些非线性可分的异常数据,我们不用让C=+∞,因为这样就等于是硬边界约束而找不到结果。作为替代,我们测试几个C值,我们看到最好的超平面是C=3。事实上,我们能得到相同的超为平面当C的值大于等于3时。这是因为我们有硬的限制,它是有必要的让有违反约束的异常数据仍能分类数据。当我们用一个小C时,如前,更多的约束被违反。

支持向量机(第五章)

图37: 在有异常值的非线性可分数据集下C=3, C=1, and C=0.01 的效果

经验法则:

一个小C将给出一个宽些的边界,代价是会有些误分类。

一个特大的C将给出一个硬边界分类器对异常数据零容忍。

关键是找到一个C而又不能把解决方案搞得太复杂。

怎样找到最好的C

没有一个有魔力的C可以解决所有问题。推荐一个找C的方法,使用交叉验证的网格搜索 (Hsu, Chang, & Lin, 一个实用的支持向量机分类方法(A Practical Guide to Support Vector Classification))。 重要的事情是明白C的值当你使用时是非常特别的,如果有一天你发现C=0.001在你的问题中不能工作,你可以在另一个问题中试试,因为他在不同部题中效果是不一样的。

其他软边界公式

二次范式软边界

有另一个公式叫二次范式(或者叫二次正则化)软边界方法,我们求

支持向量机(第五章)

的最小值。这个公式让乌尔夫对偶问题不需要盒子约束。了解更多的关于二次范式软边界,参看(Cristianini & Shawe-Taylor, 2000) 。

nu-SVM

因为C的变化会影响结果,另一种解决问题的公式被提出:vSVM。想法是用一个在0和1之间变化的参数v代替参数C。

注意:"在这个问题中,v是一个比较透明的参数,它不依赖环境的变化,只是依赖异常数据的级别。"(Cristianini & Shawe-Taylor, 2000)

这个优化方案是:

支持向量机(第五章)

小结

软边界SVM公式是一个比硬边界分类器好的实现。它让我们可以有破坏线性分类的异常数据下正确分类。无论如何,代价是增加一个我们需要找到一个值的超级参数C来增加适应性。我们看到改变C的值是如何影响边界且能找到一个大边界可以正确分类。再一次提出我们的目标是找到一个超平面可在不可见的数据中中作。一些有错误的训练数据不是坏事情,它可以使我们的模型变得更好。


分享到:


相關文章: