Python机器学习(原书第3版)
上QQ阅读APP看书,第一时间看更新

3.5 用核支持向量机求解非线性问题

支持向量机在机器学习领域享有较高知名度的另一个原因是,它可以很容易使用“核技巧”来解决非线性分类问题。在讨论核支持向量机的原理之前,让我们先创建一个样本数据集来认识一下所谓的非线性分类问题到底是什么。

3.5.1 处理线性不可分数据的核方法

执行下述代码,调用NumPy的logical_or函数创建一个经过“异或”操作的数据集,其中有100个样本的分类标签为1,100个样本的分类标签为-1

070-01

执行上述代码后会产生具有随机噪声的“异或”数据集,如图3-12所示。

070-02

图 3-12

显然,我们使用前面章节中讨论过的线性逻辑回归或线性支持向量机模型,并将线性超平面作为决策边界,无法将样本正确地划分为正类和负类。

核方法的基本思想是针对线性不可分数据,建立非线性组合,通过映射函数ϕ把原始特征投影到一个高维空间,使特征在该空间变得线性可分。如图3-13所示,可以将一个二维数据集转换为一个新的三维特征空间,这样就可以通过下述投影使得样本可分:

070-03

通过线性超平面,我们可以把图中所示的两个类分开,如果再把它投影回原始特征空间上,就会形成非线性的决策边界,如图3-13所示。

071-01

图 3-13

3.5.2 利用核技巧发现高维空间的分离超平面

为了使用SVM解决非线性问题,需要调用映射函数ϕ将训练数据变换到高维特征空间,然后训练线性SVM模型对新特征空间里的数据进行分类。可以用相同的映射函数ϕ对未知新数据进行变换,用线性支持向量机模型进行分类。

然而,这种映射方法的问题是构建新特征的计算成本太高,特别是在处理高维数据时。这就是所谓的核技巧可以发挥作用的地方。

虽然我们没有详细研究如何通过解决二次规划任务来训练支持向量机,但实际上只需要用ϕ(x(i)Tϕ(x(j))替换点乘x(i)Tx(j)。为显著降低计算两点间点乘的昂贵计算成本,定义所谓的核函数如下:

κ(x(i)x(j))=ϕ(x(i)Tϕ(x(j)

其中使用最为广泛的核函数是径向基函数(RBF)核或简称为高斯核

071-02

该公式常被简化为:

κ(x(i)x(j))=exp(-γ║x(i)-x(j)2

这里,072-01是要优化的自由参数。

简而言之,术语“核”可以理解为一对样本之间的相似函数。公式中的负号把距离转换为相似性得分,而指数运算把由此产生的相似性得分值控制在1(完全相似)和0(非常不同)之间。

在了解了使用核技巧的重点之后,我们现在看看是否能训练一个核支持向量机,使之可以通过一个非线性决策边界来对“异或”数据进行分类。这里只需要用到先前导入的scikit-learn库中的SVC类,以参数kernel='rbf'替换kernel='linear'

072-02

从图3-14中,我们可以看到核SVM相对较好地对“异或”数据进行了区分。

072-03

图 3-14

参数γ的值设置为gamma=0.1,我们可以把这理解为高斯球的截止参数。如果增大γ值,将加大训练样本的影响范围,从而导致决策边界紧缩和波动。为了能够更好地理解γ,我们把RBF核支持向量机应用于鸢尾花数据集:

072-04

由于选择了相对较小的γ值,得到的RBF核SVM模型的决策边界相对偏松,如图3-15所示。

073-01

图 3-15

现在来观察加大γ值对决策边界的影响:

073-02

从图3-16中,我们可以看到,采用较大的γ值,类0和1周围的决策边界更为紧密。

073-03

图 3-16

虽然模型对训练数据集的拟合非常好,但是这种分类器对未知数据可能会有一个很高的泛化误差。这说明当算法对训练数据集中的波动过于敏感时,参数γ在控制过拟合或方差方面也起着重要的作用。