vlambda博客
学习文章列表

支持向量机(非线性SVM、软间隔)

之前咱们已经介绍了线性可分SVM的原理,线性可分SVM主要思想就是寻找最大化间隔的决策边界,并介绍了二维空间上的线性可分数据集的超平面(决策边界)是一条直线,但对于非线性数据而言呢?如下图所示,生成了100个样本点的环形数据,显然下图中的决策边界不能将数据进行合理的划分。

  • 非线性SVM

对于输入空间中的非线性分类问题,可以通过非线性变换将非线性问题从原始的特征空间映射至更高维的希尔伯特空间,从而转化为高维度特征空间中的线性分类问题,在高维特征空间中学习线性支持向量机。如下图所示,先对二维非线性数据进行升维,这样对于一个三维特征数据就可以用平面超平面(决策边界)进行切分。

支持向量机(非线性SVM、软间隔)


对非线性数据升维后进行线性划分,非线性数据的线性决策边界如下所示:


支持向量机(非线性SVM、软间隔)

  • 非线性SVM损失函数

为了能够找出非线性数据的线性决策边界,我们需要将数据从原始的空间支持向量机(非线性SVM、软间隔)投射到新空间支持向量机(非线性SVM、软间隔)中。支持向量机(非线性SVM、软间隔)是一个映射函数,它代表了某种非线性的变换,使用这种变换,线性SVM的原理可以被很容易推广到非线性情况下,其推导过程和逻辑都与线性SVM一模一样,只不过在定义决策边界之前,我们必须先对数据进行升维度,即将原来的支持向量机(非线性SVM、软间隔)转换为支持向量机(非线性SVM、软间隔)

非线性SVM的损失函数初始形态为:


支持向量机(非线性SVM、软间隔)


非线性SVM拉格朗日函数为:

支持向量机(非线性SVM、软间隔)

当满足KKT条件时,进行对偶函数转换为:

支持向量机(非线性SVM、软间隔)

和线性可分SVM一样,同样使用梯度下降法或 SMO求解。


  • 核函数

李航在《统计学习方法》中对核函数的定义为:

支持向量机(非线性SVM、软间隔)为特征空间(希尔伯特空间),如果存在一个从支持向量机(非线性SVM、软间隔)支持向量机(非线性SVM、软间隔)的映射

支持向量机(非线性SVM、软间隔)


使得对所有 支持向量机(非线性SVM、软间隔) ,函数 支持向量机(非线性SVM、软间隔) 满足条件


支持向量机(非线性SVM、软间隔)


则称 支持向量机(非线性SVM、软间隔) 为核函数, 支持向量机(非线性SVM、软间隔) 为映射函数,式中 支持向量机(非线性SVM、软间隔) 支持向量机(非线性SVM、软间隔) 支持向量机(非线性SVM、软间隔) 的内积。
我们知道针对非线性数据需对原始特征维度做高维映射,通过支持向量机(一文读懂SVM)篇分享,我们学习了SVM在线性可分数据集上的损失函数推导,并通过拉格朗日函数和对偶函数的转换最终损失函数如下:

支持向量机(非线性SVM、软间隔)

可以看出求解过程需要变量求点积,通过更高维的映射,在高维下求点积的计算量会变得很大,会大大降低计算效率,极端情况下还会造成“维度灾难”,而通过“核技巧”的方法可以解决这个问题,“核技巧”是一种能够使用数据原始特征空间中的向量计算来表示升维后的空间中的点积结果的数学方式。所以核函数做了两方面事情。
  1. 对原始特征维度进行了高维映射

  2. 降低了高维度向量点积的计算量

  • 具体实例

假设 支持向量机(非线性SVM、软间隔) ,构造一个函数 支持向量机(非线性SVM、软间隔) 进行高维映射,则:

支持向量机(非线性SVM、软间隔)

支持向量机(非线性SVM、软间隔)

通过映射函数 支持向量机(非线性SVM、软间隔) 将A和B从二维映射到了三维,映射后的点积结果为:


支持向量机(非线性SVM、软间隔)


通过核函数能直接在原始的二维空间中进行相应的运算,使得低维情况下的运算结果等于高维情况下的运算结果。定义核函数为 支持向量机(非线性SVM、软间隔) ,计算结果如下:


支持向量机(非线性SVM、软间隔)


  • SVM常用核函数

选用不同的核函数,可以解决不同数据分布下的寻找超平面问题。下面为在sklearn.svm.svc中常用的核函数。

支持向量机(非线性SVM、软间隔)

  • 核函数在不同数据集上表现对比

上面我们说了常用的四种核函数,下面我们用四种不同核函数在不同数据集上的对比情况来分析四种核函数的优劣情况。

利用sklearn.datasets模块构建四种不同数据集(线性可分型、月亮型、环型、杂乱无章型)。
  • 线性可分型

支持向量机(非线性SVM、软间隔)

  • 月亮型

支持向量机(非线性SVM、软间隔)

  • 环型

支持向量机(非线性SVM、软间隔)

  • 杂乱无章型

支持向量机(非线性SVM、软间隔)

  • 总结

不难看出线性核函数(linear)和多项式核函数(poly)在线性可分数据集上的表现是不错的,但在环型和月亮型这种非线性数据集上表现不太好,而径向基核函数(rbf)在线性可分数据集和非线性数据集上表现都是最优的,就算在杂乱无章数据集上也有78%的准确率,反观双曲正切核函数(sigmoid)则在这四种数据集上表现都不怎么好。

但径向基核函数计算速度慢,而且容易过拟合。在我们实际业务场景中建议还是对所有核函数都去尝试一遍,说不定会有意外惊喜,并且要对参数进行调参,在不考虑松弛系数的情况下,例如径向基核函数只有一个超参数gamma,可利用学习曲线方式调参,而多项式核函数有三个超参数,则可利用网格搜索方式进行调参。而且在实际业务中数据预处理和特征工程显得尤为重要。对于SVM需要求距离而且需要升维的算法,数据的无量纲化是非常重要的,一方面可以增加模型的泛化能力,另一方面又可以加快模型的收敛速度,在咱们的数据预处理篇对数据预处理有详细讲述。

  • 软间隔与松弛系数

如上图中的线性可分型数据集其实并不是完全线性可分,如若完全线性可分,那SVM的准确率应为100%,该数据集存在一些扰动,严谨意义上来说是线性不可分数据集,是介于线性可分与非线性之间的数据集。比如如下图数据集:

支持向量机(非线性SVM、软间隔)

如上图所示,如若把数据集全部分类正确,会选择支持向量机(非线性SVM、软间隔)这条决策边界,支持向量机(非线性SVM、软间隔)这条决策边界虽有三个样本点分类错误,但其拥有更大的边际距离,对于在测试集上新样本而言拥有更好的泛化能力,也就是说不容易过拟合,但支持向量机(非线性SVM、软间隔)的误差并不是0,这就要引入软间隔的概念。

当两组数据是完全线性可分,我们可以找出一个决策边界使得训练集上的分类误差为0,这两种数据就被称为是存在”硬间隔“的。当两组数据几乎是完全线性可分的,但决策边界在训练集上存在较小的训练误差,这两种数据就被称为是存在”软间隔“。

我们可以通过调整我们对决策边界的定义,将硬间隔时得出的数学结论推广到软间隔的情况上,让决策边界能够忍受一小部分训练误差。这个时候,我们的决策边界就不是单纯地寻求最大边际了,因为对于软间隔数据来说,边际越大被分错的样本也就会越多,因此我们需要找出一个”最大边际“与”被分错的样本数量“之间的平衡。

支持向量机(非线性SVM、软间隔)

如上图所示,原始的虚线超平面和决策边界一样有效,原始判别函数为:

支持向量机(非线性SVM、软间隔)

由于点支持向量机(非线性SVM、软间隔)使该数据集在原始决策边界上存在误差,则需要变换原始决策边界使支持向量机(非线性SVM、软间隔)分类正确,假如上图中的绿色超平面是通过支持向量机(非线性SVM、软间隔)这条虚线超平面往下平移支持向量机(非线性SVM、软间隔)得到,使用这条新的虚线超平面就可以将绿色点完全分正确,于是引入松弛因子支持向量机(非线性SVM、软间隔)来优化原始判别函数:

支持向量机(非线性SVM、软间隔)

绿色虚线超平面是由支持向量机(非线性SVM、软间隔)这条虚线超平面往下平移支持向量机(非线性SVM、软间隔)得到,所以红色直线的长度为支持向量机(非线性SVM、软间隔),则点支持向量机(非线性SVM、软间隔)支持向量机(非线性SVM、软间隔)的距离为支持向量机(非线性SVM、软间隔),具体推导在第一节SVM中讲到过,由于单位向量是固定的,所以支持向量机(非线性SVM、软间隔)可以作为点 在原始的决策边界上的分类错误的程度的表示,隔得越远,分得越错。

支持向量机(非线性SVM、软间隔)作为新的决策超平面存在一定问题,绿色点全部分类正确,但是红色点分错了很多,所以我们必须在我们求解最大边际的损失函数中加上一个惩罚项,用来惩罚我们具有巨大松弛系数的决策超平面。损失函数为:

支持向量机(非线性SVM、软间隔)

其中C是用来控制惩罚项的惩罚力度的系数。

拉格朗日函数为:

支持向量机(非线性SVM、软间隔)

满足的KKT条件为:

拉格朗日对偶函数为:

然后再通过SMO进行求解。

  • 重要参数C


参数C作为松弛系数的重要惩罚系数,在SVM算法调参过程中尤为重要,当C的值设置较小时,那SVM会尽量最大化边界,此时容易欠拟合,当C 设置较大时容易过拟合,一般在实际应用中,松弛系数惩罚系数C会和核函数中的参数联合调参,利用网格搜索方式寻找泛化能力最强的一组参数。