你能解释一下 scikit-learn 中 SVC 和 LinearSVC 的区别吗?

数据挖掘 支持向量机 scikit-学习
2021-09-16 22:46:53

我最近开始学习使用sklearn并刚刚遇到这个奇怪的结果。

我使用了digits可用的数据集sklearn来尝试不同的模型和估计方法。

当我在数据上测试支持向量机模型时,我发现sklearnSVM 分类有两个不同的类:SVCLinearSVC,前者使用一对一的方法,而另一个使用一对一的方法。

我不知道这会对结果产生什么影响,所以我都尝试了。我做了一个蒙特卡洛式的估计,我运行这两个模型 500 次,每次将样本随机分成 60% 的训练和 40% 的测试,并计算测试集上的预测误差。

常规 SVC 估计器产生以下误差直方图: SVC 错误率 而线性 SVC 估计器产生以下直方图: 线性 SVC 错误率

什么可以解释如此明显的差异?为什么线性模型在大多数时候都具有如此高的精度?

而且,与此相关的是,什么可能导致结果出现明显的两极分化?接近 1 的准确度或接近 0 的准确度,两者之间没有任何关系。

相比之下,决策树分类产生的错误率更加正态分布,准确度约为 0.85。

2个回答

具有默认值的常规 SVM 使用径向基函数作为 SVM 内核。这基本上是一个高斯核,也就是钟形曲线。这意味着不同类别之间的无人区是用高斯函数创建的。线性 SVM 使用线性核作为基函数,因此您可以将其视为 ^ 形函数。它的可调性要差得多,基本上只是线性插值。

人们有点敲打这个问题,因为您没有提供很多信息,但是深入研究了您发布的内容……这触及了真正理解偏差和方差的细节以及线性和非线性之间的区别的一些基本方面SVM 中的基函数。

查看这张图片,它描述了高低偏差和高低方差的四个区域。显然,最好的地方是低方差和低偏差。

飞镖偏差方差图像

首先让我们评估方差 -

现在看看你的情节: 在此处输入图像描述

非线性基函数具有较高的方差。看看它是如何比线性内核更嘈杂的!线性核具有较低的方差。看看它是如何不那么嘈杂的!

现在让我们评估偏见 -

哪个内核更准确?我们可以添加您提供的错误。非线性内核的总误差为~550+325=~875。线性核的误差为~690+~50=~740。所以线性内核似乎总体上做得更好,但它们总体上非常接近。这是事情变得棘手!

把它们放在一起

看看线性内核如何在 1 上做得很差,而在 0 上做得非常好。这是相当不平衡的。其中非线性内核更加平衡。似乎最佳点可能是创建一个没有如此高方差的平衡模型。我们如何控制高方差?宾果 - 正则化。我们可以将正则化添加到非线性模型中,我们可能会看到更好的结果。这是 scikit learn SVM 中的 C 参数,您需要从默认值中增加该参数。我们也可以使用 gamma 参数。Gamma 控制高斯的宽度。也许尝试稍微增加一个以获得更少嘈杂的结果,例如班级之间更大的无人区。

希望这可以帮助!

如果您在 SVC() 中使用了默认内核,即径向基函数(rbf) 内核,那么您可能学到了一个更加非线性的决策边界。数字数据集的情况下,这将大大优于该任务的线性决策边界(参见 3.1 '基线线性分类器')