编程技术网

关注微信公众号,定时推送前沿、专业、深度的编程技术资料。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

极客时间

线性 SVM 分类

mycode 深度学习 2021-11-29 16:17 158人围观

腾讯云服务器

SVM 背后的基本思想最好用一些图片来解释。图 5-1显示了在第 4 章末尾介绍的 iris 数据集的一部分这两个类可以很容易地用一条直线很容易地分开(它们是线性可分的)。左图显示了三个可能的线性分类器的决策边界。决策边界由虚线表示的模型非常糟糕,甚至无法正确分离类别。其他两个模型在这个训练集上工作得很好,但它们的决策边界与实例非常接近,以至于这些模型在新实例上可能表现不佳。相比之下,右图中的实线代表一个 SVM 分类器的决策边界;这条线不仅将两个类分开,而且尽可能远离最近的训练实例。您可以将 SVM 分类器视为拟合类别之间尽可能宽的街道(由平行虚线表示)。这个称为大边距分类

mls2 0501
图 5-1。大保证金分类

注意添加更多“街道外”的训练实例根本不会影响决策边界:它完全由位于街道边缘的实例决定(或“支持”)。这些实例称为支持向量(它们在图 5-1 中被圈出)。

mls2 0502
图 5-2。对特征尺度的敏感性
警告

SVM 对特征尺度很敏感,如图 5-2 所示:在左图中,垂直尺度远大于水平尺度,因此尽可能宽的街道接近水平。特征缩放(例如,使用 Scikit-Learn 的StandardScaler),右图中的决策边界看起来好多了。

软保证金分类

如果 我们严格规定所有实例都必须远离街道并位于右侧,这称为硬边界分类硬边界分类有两个主要问题。首先,它仅适用于数据线性可分的情况。其次,它对异常值很敏感。图 5-3显示了 iris 数据集只有一个额外的异常值:在左侧,不可能找到硬边距;在右侧,决策边界最终与我们在图 5-1 中看到的没有异常值的边界非常不同,并且它可能也不会泛化。

mls2 0503
图 5-3。对异常值的硬边际敏感性

避免这些问题,使用更灵活的模型。目标是在保持街道尽可能大和限制边界违规(即,最终位于街道中间甚至错误一侧的实例)之间找到良好的平衡这称为软边际分类

什么时候使用 Scikit-Learn 创建 SVM 模型,我们可以指定许多超参数。C是那些超参数之一。如果我们将它设置为一个较低的值,那么我们最终会得到图 5-4左侧的模型有了高值,我们就得到了正确的模型。保证金违规是不好的。通常最好少一些。然而,在这种情况下,左边的模型有很多边缘违规,但可能会更好地概括。

mls2 0504
图 5-4。大边距(左)与较少的边距违规(右)
提示

如果您的 SVM 模型过度拟合,您可以尝试通过减少 来对其进行正则化C

以下 Scikit-Learn 代码加载 iris 数据集,缩放特征,然后训练线性 SVM 模型(使用LinearSVCC=1铰链损失函数,稍后描述)来检测Iris virginica花:

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]  # petal length, petal width
y = (iris["target"] == 2).astype(np.float64)  # Iris virginica

svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("linear_svc", LinearSVC(C=1, loss="hinge")),
    ])

svm_clf.fit(X, y)

结果模型如图 5-4左侧所示

然后,像往常一样,您可以使用该模型进行预测:

>>> svm_clf.predict([[5.5, 1.7]])
array([1.])
笔记

与逻辑回归分类器不同,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,除非特征多于训练实例(我们将在本章后面讨论对偶)。

腾讯云服务器 阿里云服务器
关注微信
^