另外一种强大而且广泛应用的机器学习算法是 支持向量机 (SVM),它可以看作感知器的扩展。感知器算法的目标是最小化分类误差。而支持向量机算法的优化目标是最大化的分类间隔。此处间隔定义为可分离的超平面(决策边界)与其最近的训练样本之间的距离,而最靠近超平面的训练样本称为 支持向量 ,如图3-9所示。
图 3-9
该模型的原理是决策边界间隔较大往往会产生较低的泛化误差,而间隔较小的模型则更容易产生过拟合。为了更好地解释间隔最大化的概念,让我们仔细看看那些与决策边界平行的正超平面和负超平面,表示如下:
w 0 + w T x pos =1 (1)
w 0 + w T x neg =-1 (2)
上述两个线性等式(1)和(2)相减可以得到:
⇒ w T ( x pos - x neg )=2
可以通过求解向量 w 的长度来规范化该方程,具体计算如下:
因此得到以下的结果:
可以把方程的左边解释为正、负超平面之间的距离,即想要最大化的 间隔 。
在样本分类正确的条件约束下,最大化分类间隔也就是使 最大化,这也是支持向量机的目标函数可以将其表示为:
这里N为数据集的样本总数。
这两个方程可以解释为:所有的负类样本基本上都落在负超平面一侧,而所有的正类样本都落在正超平面一侧,我们可以用更为紧凑的方式表达如下:
y (i) (w 0 + w T x (i) )≥1 ∀ i
实际上,计算最小化 的倒数更为容易,这可以通过二次规划的方法实现。然而,对二次规划细节的讨论已经超出了本书的范围。你可以阅读 The Nature of Statistical Learning Theory 一书学习更多关于支持向量机方面的知识。该书的作者为Vladimir Vapnik,由Springer出版,也可以阅读由Chris J. C. Burges的 A Tutorial on Support Vector Machines for Pattern Recognition(Data Mining and Knowledge Discovery, 2(2):121-167, 1998)。
尽管我们不想对最大间隔分类背后更复杂的数学概念进行讨论,但还是要简要地提一下由Vladimir Vapnik于1995年提出的松弛变量ξ,它引出了所谓的 软间隔分类 。引入松弛变量ξ的目的是对于非线性可分数据来说,需要放松线性约束,以允许在分类错误存在的情况下通过适当代价的惩罚来确保优化可以收敛。
我们可以直接把取值为正的松弛变量加入线性约束:
w 0 + w T x (i) ≥1-ξ (i) 如果y (i) =1
w 0 + w T x (i) ≤-1+ξ (i) 如果y (i) =-1
对于i=1…N
其中N为数据集样本总数量。因此新的最小化(有约束)目标为:
可以通过变量
C
来控制对分类错误的惩罚。
C
值越大相应的错误惩罚就越大,如果选择的目标较小,则对分类错误的要求就不那么严格。因此,可以用参数
C
来控制间隔的宽度来权衡偏置-方差,如图3-10所示。
图 3-10
这个概念与上节所讨论的正则化回归相关,即减小
C
值会增加偏差并降低模型的方差。
既然已经了解了线性支持向量机背后的基本概念,我们现在可以训练一个支持向量机模型来对鸢尾花数据集中的不同种类的花进行分类:
执行前面的代码示例,在鸢尾花数据集上训练分类器之后得到SVM的三个决策区域,如图3-11所示。
图 3-11
在实际的分类任务中,线性逻辑回归和线性支持向量机通常会产生非常相似的结果。逻辑回归试图最大化训练数据的条件似然,使其比支持向量机更容易处理异常值点,支持向量机主要关心的是最接近决策边界(支持向量)的点。另一方面,逻辑回归也有优点,其模型更简单且更容易实现。此外,逻辑回归模型更容易更新,这在处理流式数据时很有吸引力。
在前几节中,我们用到了scikit-learn中的
LogisticRegression
类,它利用基于C/C++开发和高度优化的LIBLINEAR库。类似地,用于训练SVM的
SVC
类使用了LIBSVM,它是一个专门为SVM准备的C/C++库。
与原生Python相比,用LIBLINEAR和LIBSVM的好处是,它允许快速训练大量线性分类器。然而,有时候数据集太大而无法加载到内存。因此,scikit-learn也提供了
SGDClassifier
类供用户选择,这个类还通过
partial_fit
方法支持在线学习。
SGDClassifier
类的逻辑与第2章为Adaline实现的随机梯度算法类似。初始化随机梯度下降感知器、逻辑回归感知器和带有默认参数的支持向量机的具体过程如下所示: