您可以在scikit-learn中解释SVC和LinearSVC之间的区别吗?


19

我最近开始学习与之合作,sklearn并且刚刚遇到了这种奇怪的结果。

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

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

我不知道会对结果产生什么影响,因此我尝试了两者。我进行了蒙特卡洛(Monte Carlo)风格的估计,我对这两个模型都运行了500次,每次将样本随机分为60%训练和40%测试,并在测试集上计算预测误差。

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

造成这种明显差异的原因是什么?为什么线性模型大多数时候都具有如此高的精度?

并且,与此相关的是,什么可能导致结果出现明显的极化?精度接近1或精度接近0,两者之间什么也没有。

为了进行比较,决策树分类产生的正态分布错误率更高,准确度约为0.85。


我假设scikit-learn文档没有突出显示差异?你检查过了吗?
罗希特(Rohit)2015年

1.您在SVC中使用了哪个内核?默认设置=“ rbf”?2.一对一和一对一是不同的方法
kpb

该文档对该主题有点稀疏/模糊。它提到了一对一和一对一之间的区别,线性SVS是Similar to SVC with parameter kernel=’linear’, but implemented in terms of liblinear rather than libsvm, so it has more flexibility in the choice of penalties and loss functions and should scale better (to large numbers of samples).
metjush

对于常规SVC,我使用默认内核。我知道1v1和1vR是不同的方法,但是我想这就是我想知道的-为什么它们会产生如此不同的结果?是内核选择还是多类别分类的不同方法?
metjush

Answers:


23

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

人们之所以会提出这个问题,是因为您没有提供很多信息,而是深入研究了您发布的内容...这触及了一些真正了解偏差和方差以及线性与非线性之间的差异的基本方面SVM中的基本功能。

查看此图片该图片描述了高和低偏差以及高和低方差的四个区域。显然,最好的地方是低方差和低偏差。

飞镖偏差方差图像

首先让我们评估方差-

现在看看您的地块: 在此处输入图片说明

非线性基函数具有较高的方差。看看它比线性内核有多嘈杂!线性核具有较低的方差。看看它怎么少吵!

现在让我们评估偏见-

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

放在一起

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

希望这可以帮助!


-c参数需要被减少从没有增加默认。
Hamdi '18

4

如果您在SVC()中使用了默认内核,即径向基函数(rbf)内核,那么您可能会学到更多的非线性决策边界。对于数字数据集,这将大大胜过此任务的线性决策边界(请参阅3.1“基线线性分类器”)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.