哪一个更好:LinearSVC或SVC?

时间:2016-01-29 03:55:01

标签: machine-learning scikit-learn svm

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

  1. SVC(kernel="linear") is better
  2. LinearSVC is better
  3. Doesn't matter
  4. 有人可以解释何时使用LinearSVCSVC(kernel="linear")

    似乎LinearSVC略胜SVC并且通常更挑剔。但是,如果scikit决定花时间实施线性分类的特定案例,为什么LinearSVC不会优于SVC

2 个答案:

答案 0 :(得分:25)

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

结果的差异来自几个方面:SVCLinearSVC应该优化相同的问题,但实际上所有liblinear估算器都会惩罚拦截,而{{1} }不要(IIRC)。这导致不同的数学优化问题并因此导致不同的结果。还可能存在其他细微差别,例如缩放和默认丢失功能(编辑:确保在libsvm中设置loss='hinge')。接下来,在多类分类中,LinearSVC默认执行one-vs-rest,而liblinear执行one-vs-one。

libsvm与其他两个不同,它使用随机梯度下降而不是精确的梯度下降,并且可能不会收敛到相同的解。然而,所获得的解决方案可以更好地概括。

SGDClassifier(loss='hinge')SVC之间,一个重要的决策标准是LinearSVC趋向于更快收敛,样本数量越大。这是因为线性内核是一个特殊情况,它在Liblinear中进行了优化,但在Libsvm中没有。

答案 1 :(得分:6)

实际问题出现在 scikit方法的问题中,他们称SVM为,而不是SVM 。 LinearSVC实际上是最小化平方铰链损耗,而不仅仅是铰链损耗,此外,它会影响偏差的大小(不是SVM ),更多细节请参考其他问题: Under what parameters are SVC and LinearSVC in scikit-learn equivalent?

那么使用哪一个?它纯粹是特定于问题。由于没有免费午餐定理,所以不可能说"这种损失函数是最佳的,期间"。有时平方损失会更好,有时是正常铰链。