17.1 训练一个线性分类器
问题描述
训练一个模型对观察值分类。
解决方案
用支持向量分类器(Support Vector Classifier,SVC)来寻找最大化分类之间间距的超平面:

讨论
scikit-learn的LinearSVC实现了一个简单的SVC。为了让你对SVC的作用有一个直观的认识,我们在下页的图中画出了样本点和超平面。尽管SVC在高维空间有很好的表现,但上述解决方案中只加载了两个特征和一部分样本数据,数据集内只有两个分类的数据,因此我们可以可视化这个模型。回忆一下前面的内容,SVC一直试图找到一个能最大化分类之间间距的超平面,因为本例中只有两个维度,所以这里的超平面就是一条直线。在下面的代码中,我们把两个分类画在一个二维空间上,然后画出了这个超平面。



在上图中,分类0的所有样本点都是黑色的,分类1的所有样本点都是浅灰色的。超平面就是决定新的样本点属于哪一个分类的分界线。也就是说,在这条线上方的所有样本点会被归为分类0,而在这条线下方的样本点会被归为分类1。我们可以看到,如果在左上角的空间创建一个新的样本点,那么它会被预测为属于分类0:

对于SVC,有几点需要特别注意。首先,为了方便可视化,我们把本例限定为二元分类问题(只有两个分类),其实SVC在处理多元分类问题时表现也不错。其次,如上图所示,本例中的超平面被定义为直线(没有弯曲)。因为我们的数据集是线性可分的,也就是说存在一个超平面可以完美地分开这两个分类的样本点,所以在这个例子中超平面就是一条直线。但不幸的是,在真实世界中,这种情况并不多见。
更常见的情况是,我们并不能完美地将数据分类。在这些情况下,需要在SVC最大化超平面两侧的间距和最小化分类错误之间取得平衡。在SVC中,后者是通过一个超参数C (分类错误时所需要接受的惩罚)来控制的。C是SVC学习器的一个参数,也是学习器将一个样本点分类错误时被施加的罚项。当C很小时,SVC可以容忍更多的样本点被错误分类(偏差大,方差小)。当C很大时,SVC会因为对数据的错误分类而被重罚,因此通过反向传播来避免对样本点的错误分类(偏差小、方差大)。
在scikit-learn中,C是由参数C所决定的,默认值是1.0。应该把C当作机器学习算法中的一个超参数,可以用第12章中讲的模型选择技术进行调校。



本书评论