17.2 使用核函数处理线性不可分的数据
问题描述
你要训练一个SVC,但是你的数据是线性不可分的。
解决方案
使用核函数训练支持向量机的一个扩展,以创建非线性的决策边界:

讨论
本书不会对支持向量机进行全面的解释,不过,简单了解一下支持向量机和核函数的背景知识还是有用的。为了便于理解,可以将SVC表示为:

这里 β 0 是偏差,S是所有支持向量观察值的集合,α是要学习的模型参数,(xi, xi')是一对支持向量观察值。最重要的是核函数K,它会比较 xi,和xi'的相似度(如果你还不理解什么是核函数,不用着急)。对于K,只需要知道两点:第一,它决定了我们用什么类型的超平面来分离不同的分类;第二,我们使用不同的核函数来创建不同的超平面。比如,如果你想要17.1节中创建的基本线性超平面,就可以使用线性核函数:

这里p是特征的数量。如果我们想获取一个非线性决策边界,可以用多项式核函数来替换上面的线性核函数:

这里d是多项式核函数的度。我们还可以使用支持向量机中最通用的一种核函数,径向基核函数(radial basis function kernel):

这里γ是一个超参数,而且必须大于0。前面的这些解释的要点在于,如果数据是线性不可分的,我们可以用其他可选的核函数来替换线性核函数,以创建一个非线性的超平面决策边界。
我们可视化一个简单的例子来理解核函数背后的逻辑。这个例子是基于Sebastian Raschka的工作设计的一个函数,它画出了观察值和一个二维空间里的超平面决策边界。你不需要理解这个函数是如何工作的。该函数的代码如下,你可以自己试一试:


在本节的解决方案中,我们的数据有两个特征(即两个维度)和一个包含所有观察值分类的目标向量。重要的一点是,这些数据被设计为线性不可分的。换句话说就是,不存在一条直线可以完美地分开这两个分类的数据。首先,创建一个使用线性核函数的SVC:

接下来,因为我们的数据只有两个特征,所以可以在二维空间内画出观察值、它们的分类和模型的线性超平面(见下图):


如上图所示,这个线性超平面的分类效果很差!让我们用一个径向基核函数来替换线性核函数,然后用它来训练一个新模型:

然后我们画出观察值和超平面:


使用径向基核函数,可以创建一个分类效果比线性核函数好很多的决策边界。这也是在SVC中使用这些核函数的原因。
在scikit-learn中,我们可以通过设置kernel参数的值来选择想用的核函数。一旦选择了一个核函数,就需要为这个核函数确定一些合适的选项值,比如前面提到的多项式核函数中的d(通过degree参数来设置)和径向基核函数中的γ(通过gamma参数来设置)。我们还需要设置惩罚参数C。在训练模型时,大部分情况下需要把这些参数视作超参数,然后用模型选择的技术找出能产生性能最佳的模型的参数值组合。



本书评论