根据我的研究,我发现了三个相互矛盾的结果:
SVC(kernel="linear")
is better LinearSVC
is better 有人可以解释何时使用LinearSVC
与SVC(kernel="linear")
?
似乎LinearSVC略胜SVC并且通常更挑剔。但是,如果scikit
决定花时间实施线性分类的特定案例,为什么LinearSVC
不会优于SVC
?
答案 0 :(得分:25)
在数学上,优化SVM是凸优化问题,通常使用唯一的最小化器。这意味着这个数学优化问题只有一个解决方案。
结果的差异来自几个方面:SVC
和LinearSVC
应该优化相同的问题,但实际上所有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?
那么使用哪一个?它纯粹是特定于问题。由于没有免费午餐定理,所以不可能说"这种损失函数是最佳的,期间"。有时平方损失会更好,有时是正常铰链。