从我的研究中,我发现了三个相互矛盾的结果:
SVC(kernel="linear")
is betterSVC(kernel="linear")
LinearSVC
is better有人可以解释何时使用LinearSVC
与Doesn't matter吗?
似乎LinearSVC比SVC稍好,通常更为挑剔。但是,如果LinearSVC
决定花时间实施线性分类的特定情况,那么SVC(kernel="linear")
为什么不胜过scikit
?
数学上,优化SVM是一个凸优化问题,通常使用唯一的最小化器。这意味着该数学优化问题只有一种解决方案。
结果的差异来自几个方面:LinearSVC
和SVC
可以优化同一问题,但实际上,所有SVC
估计量都会对截距进行惩罚,而LinearSVC
估计量则不会(IIRC)。这导致了不同的数学优化问题,从而导致了不同的结果。可能还存在其他细微的差异,例如缩放比例和默认损失功能(编辑:确保在liblinear
中设置了libsvm
)。接下来,在多类分类中,默认情况下,loss='hinge'
做一对多,而LinearSVC
做一对多。
liblinear
在使用随机梯度下降而不是精确梯度下降且可能不会收敛于相同解的意义上与其他两个有所不同。但是,所获得的解决方案可能会更好地推广。
libsvm
和SGDClassifier(loss='hinge')
之间,一个重要的决策标准是,SVC
趋于收敛更快,样本数量越大。这是因为线性核是一个特例,它在Liblinear中进行了优化,但在Libsvm中没有进行优化。
实际问题出在scikit方法问题中,他们称SVM为这不是SVM。 LinearSVC实际上是使平方的铰链损耗最小化,而不仅仅是铰链损耗,此外,它还对偏差的大小(不是SVM进行了惩罚),有关更多详细信息,请参见其他问题:LinearSVC
那么该使用哪个?它完全是特定于问题的。由于没有免费的午餐定理,因此不可能说“这个损失函数是最佳的,周期”。有时平方损失会更好,有时会正常铰链。