何时应该使用LinearSVC或SVC?

43

根据我的研究,我发现了三个相互矛盾的结果:

  1. SVC(kernel="linear") 更好
  2. LinearSVC 更好
  3. 没有区别

有人可以解释一下何时使用 LinearSVC 而不是 SVC(kernel="linear") 吗?

看起来 LinearSVC 略优于 SVC 并且通常更为挑剔。但如果 scikit 决定花时间实现线性分类的特定情况,为什么 LinearSVC 不会胜过 SVC 呢?


6
scikit-learn并没有为线性SVM开发专用算法,而是在两个流行的现有实现之上实现了接口。LinearSVC的底层C实现是liblinear,而SVC的求解器是libsvm。第三种实现是SGDClassifier(loss="hinge") - David Maust
2个回答

43

在数学上,优化SVM是一个凸优化问题,通常只有一个唯一最小化器。这意味着这个数学优化问题只有一个解。

结果的差异来自于几个方面:SVCLinearSVC应该优化相同的问题,但实际上所有liblinear估计器都惩罚拦截,而libsvm则不会(如果我没记错的话)。这导致了不同的数学优化问题,因此产生了不同的结果。还可能有其他微妙的差异,如缩放和默认损失函数(编辑:确保在LinearSVC中设置loss='hinge')。接下来,在多类分类中,默认情况下,liblinear使用一对其余类别,而libsvm使用一对一。

SGDClassifier(loss ='hinge')与另外两个分类器不同,它使用随机梯度下降而不是精确梯度下降,并且可能不收敛到相同的解。然而,得到的解可能具有更好的泛化能力。

SVCLinearSVC之间,一个重要的决策标准是LinearSVC倾向于更快地收敛,样本数越大。这是因为线性内核是一种特殊情况,在Liblinear中进行了优化,但在Libsvm中没有。


在Scikit-learn的官方文档中,似乎数学公式并没有表明截距是受惩罚的。或者我有误解吗? - John Smith

18
实际问题在于 scikit 存在的一些问题,他们把SVM称为一些“并不是SVM”的东西。LinearSVC 实际上是最小化平方合页损失而不仅仅是合页损失,此外,它惩罚偏差的大小(这不是 SVM),更多细节请参见其他问题: 在哪些参数下scikit-learn中的SVC和LinearSVC等价? 那么要使用哪一个呢?纯粹取决于问题本身。由于没有免费午餐定理,不可能说“这个损失函数是最好的,结束了”。有时候,平方损失会表现更好,有时候是正常的合页。

你关于平方铰链损失的看法是正确的(我也提到了这些损失是不同的)。但将其设置为铰链仍然不能使它们产生与线性核SVC相同的答案。 - eickenberg
正如我所说,这也涉及到惩罚偏见,与我的另一个答案相关。 - lejlot
确实,这个问题基本上是你已经回答过的重复问题。但是需要注意的是,LinearSVC并不是无用的 - 它应该比通用的核方法更具可扩展性。 - eickenberg
当然,“没有免费的午餐定理”,每个分类器都有其适用范围。 - lejlot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接