首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》3.5 使用核SVM解决非线性问题

关灯直达底部

支持向量机在机器学习爱好者中广受欢迎的另一原因是:它可以很容易地使用“核技巧”来解决非线性可分问题。在讨论SVM的核的基本概念之前,先通过一个例子来认识一下所谓的非线性可分问题到底是什么。

通过如下代码,我们使用NumPy中的logical_xor函数创建了一个经过“异或”操作的数据集,其中100个样本属于类别1,另外的100个样本被划定为类别-1:

在执行上述代码后,我们通过随机噪声得到一个“异或”数据集,其二维分布图像如下所示:

显然,如果使用前面小节讨论过的线性逻辑斯谛回归或者线性SVM模型,并将线性超平面当做决策边界,无法将样本正确地划分为正类别或负类别。

核方法处理此类非线性可分数据的基本理念就是:通过映射函数φ(·)将样本的原始特征映射到一个使样本线性可分的更高维空间中。如下图所示,我们可以将二维数据集通过下列映射转换到新的三维特征空间中,从而使得样本可分:

这使得我们可以将图中的两个类别通过线性超平面进行分割,如果我们把此超平面映射回原始特征空间,则可线性分割两类数据的超平面就变为非线性的了。

使用核技巧在高维空间中发现分离超平面

为了使用SVM解决非线性问题,我们通过一个映射函数φ(·)将训练数据映射到更高维的特征空间,并在新的特征空间上训练一个线性SVM模型。然后将同样的映射函数φ(·)应用于新的、未知数据上(即使用此映射将未知数据映射到新的特征空间),进而使用新特征空间上的线性SVM模型对其进行分类。

但是,这种映射方法面临的一个问题就是:构建新的特征空间带来非常大的计算成本,特别是在处理高维数据的时候。这时就用到了我们称作核技巧的方法。我们不会过多关注SVM训练中所需解决的二次规划问题,在实践中,我们所需做的就是将点积x(i)Tx(j)映射为φ(x(i))Tφ(x(j))。为了降低两点之间内积精确计算阶段的成本耗费,我们定义一个所谓的核函数:k(x(i),x(j))=φ(x(i))Tφ(x(j))。

一个最广为使用的核函数就是径向基函数核(Radial Basis Function kernel,RBF kernel)或高斯核(Gaussian kernel):

粗略地说,“核”可解释为一对样本之间的“相似函数”。此处的负号将距离转换为相似性评分,而由于指数项的存在,使得相似性评分会介于0之间(差异巨大的样本)和1(完全相同的样本)。

现在我们已经知道了使用核技巧的重点,尝试能否训练一个核SVM,使之可以通过一个非线性决策边界来对“异或”数据进行分类。在此,我们只是简单使用前面已经导入的scikit-learn包中的SVM类,并将参数kernel='linear'替换为kernel='rbf':

正如结果图像所示,核SVM相对较好地完成了对“异或”数据的划分。

在这里我们将参数γ的值设定为gamma=0.1,这可以理解为高斯球面的截止参数(cut-off parameter)。如果我们减小γ的值,将会增加受影响的训练样本的范围,这将导致决策边界更加宽松。为了对γ有个更好的直观认识,我们将基于RBF核的SVM应用于鸢尾花数据集。

由于我们选择了一个较小的γ值,因此基于RFB核的SVM模型的决策边界就相对宽松,如下图所示:

现在增加γ的值,并观察它对决策边界的影响:

通过结果图像可以看到:使用一个相对较大的γ值,使得类别0和1的决策边界紧凑了许多。

虽然模型对训练数据的拟合非常好,但是类似的分类器对未知数据会有一个较高的泛化误差,这说明对γ的调优在控制过拟合方面也起到了重要作用。