这SVM 背后的基本思想最好用一些图片来解释。图 5-1显示了在第 4 章末尾介绍的 iris 数据集的一部分。这两个类可以很容易地用一条直线很容易地分开(它们是线性可分的)。左图显示了三个可能的线性分类器的决策边界。决策边界由虚线表示的模型非常糟糕,甚至无法正确分离类别。其他两个模型在这个训练集上工作得很好,但它们的决策边界与实例非常接近,以至于这些模型在新实例上可能表现不佳。相比之下,右图中的实线代表一个 SVM 分类器的决策边界;这条线不仅将两个类分开,而且尽可能远离最近的训练实例。您可以将 SVM 分类器视为拟合类别之间尽可能宽的街道(由平行虚线表示)。这个称为大边距分类。
注意添加更多“街道外”的训练实例根本不会影响决策边界:它完全由位于街道边缘的实例决定(或“支持”)。这些实例称为支持向量(它们在图 5-1 中被圈出)。
SVM 对特征尺度很敏感,如图 5-2 所示:在左图中,垂直尺度远大于水平尺度,因此尽可能宽的街道接近水平。后特征缩放(例如,使用 Scikit-Learn 的StandardScaler
),右图中的决策边界看起来好多了。
如果 我们严格规定所有实例都必须远离街道并位于右侧,这称为硬边界分类。硬边界分类有两个主要问题。首先,它仅适用于数据线性可分的情况。其次,它对异常值很敏感。图 5-3显示了 iris 数据集只有一个额外的异常值:在左侧,不可能找到硬边距;在右侧,决策边界最终与我们在图 5-1 中看到的没有异常值的边界非常不同,并且它可能也不会泛化。
到避免这些问题,使用更灵活的模型。目标是在保持街道尽可能大和限制边界违规(即,最终位于街道中间甚至错误一侧的实例)之间找到良好的平衡。这称为软边际分类。
什么时候使用 Scikit-Learn 创建 SVM 模型,我们可以指定许多超参数。C
是那些超参数之一。如果我们将它设置为一个较低的值,那么我们最终会得到图 5-4左侧的模型。有了高值,我们就得到了正确的模型。保证金违规是不好的。通常最好少一些。然而,在这种情况下,左边的模型有很多边缘违规,但可能会更好地概括。
如果您的 SVM 模型过度拟合,您可以尝试通过减少 来对其进行正则化C
。
这以下 Scikit-Learn 代码加载 iris 数据集,缩放特征,然后训练线性 SVM 模型(使用LinearSVC
类C=1
和铰链损失函数,稍后描述)来检测Iris virginica花:
然后,像往常一样,您可以使用该模型进行预测:
与逻辑回归分类器不同,SVM 分类器不输出每个类的概率。
LinearSVC
我们可以使用SVC
带有线性内核的类,而不是使用类。创建 SVC 模型时,我们将编写SVC(kernel="linear", C=1)
. 或者我们可以使用SGDClassifier
类,与SGDClassifier(loss="hinge", alpha=1/(m*C))
. 这将应用常规的随机梯度下降(参见第 4 章)来训练线性 SVM 分类器。它不像类那样收敛LinearSVC
,但它可以用于处理在线分类任务或不适合内存的庞大数据集(核外训练)。
该LinearSVC
级规则化偏置项,所以你应减去其平均首发中锋的训练集。如果您使用StandardScaler
. 还要确保loss
将超参数设置为"hinge"
,因为它不是默认值。最后,为了获得更好的性能,您应该dual
将超参数设置为False
,除非特征多于训练实例(我们将在本章后面讨论对偶)。