根据我的研究,我发现了三个相互矛盾的结果:
有人可以解释一下何时使用 LinearSVC
而不是 SVC(kernel="linear")
吗?
看起来 LinearSVC 略优于 SVC 并且通常更为挑剔。但如果 scikit 决定花时间实现线性分类的特定情况,为什么 LinearSVC 不会胜过 SVC 呢?
根据我的研究,我发现了三个相互矛盾的结果:
有人可以解释一下何时使用 LinearSVC
而不是 SVC(kernel="linear")
吗?
看起来 LinearSVC 略优于 SVC 并且通常更为挑剔。但如果 scikit 决定花时间实现线性分类的特定情况,为什么 LinearSVC 不会胜过 SVC 呢?
在数学上,优化SVM是一个凸优化问题,通常只有一个唯一最小化器。这意味着这个数学优化问题只有一个解。
结果的差异来自于几个方面:SVC
和LinearSVC
应该优化相同的问题,但实际上所有liblinear
估计器都惩罚拦截,而libsvm
则不会(如果我没记错的话)。这导致了不同的数学优化问题,因此产生了不同的结果。还可能有其他微妙的差异,如缩放和默认损失函数(编辑:确保在LinearSVC
中设置loss='hinge'
)。接下来,在多类分类中,默认情况下,liblinear
使用一对其余类别,而libsvm
使用一对一。
SGDClassifier(loss ='hinge')
与另外两个分类器不同,它使用随机梯度下降而不是精确梯度下降,并且可能不收敛到相同的解。然而,得到的解可能具有更好的泛化能力。
在SVC
和LinearSVC
之间,一个重要的决策标准是LinearSVC
倾向于更快地收敛,样本数越大。这是因为线性内核是一种特殊情况,在Liblinear中进行了优化,但在Libsvm中没有。
LinearSVC
并不是无用的 - 它应该比通用的核方法更具可扩展性。 - eickenberg
LinearSVC
的底层C实现是liblinear,而SVC
的求解器是libsvm。第三种实现是SGDClassifier(loss="hinge")
。 - David Maust