从我的研究中,我发现了三个相互矛盾的结果。
谁能解释一下什么时候使用 LinearSVC
与。SVC(kernel="linear")
?
貌似LinearSVC比SVC略胜一筹,而且通常比较精细。但如果 scikit
决定花时间去实现线性分类的具体案例,为什么不将 LinearSVC
胜过 SVC
?
在数学上,优化SVM是一个凸优化问题,通常有一个唯一的最小化器。这意味着这个数学优化问题只有一个解。
结果的差异来自于几个方面。SVC
和 LinearSVC
应该是优化同一个问题,但事实上,所有的 liblinear
估计器对截距进行惩罚,而 libsvm
的没有(IIRC)。这就导致了不同的数学优化问题,从而导致不同的结果。也可能有其他微妙的差异,比如缩放和默认损失函数(编辑:确保你设置了 loss='hinge'
在 LinearSVC
). 其次,在多类分类中。liblinear
默认为onevs-rest,而 libsvm
做的是一对一。
SGDClassifier(loss='hinge')
与其他两种方法不同的是,它使用的是随机梯度下降法,而不是精确梯度下降法,可能不会收敛到相同的解。然而得到的解可能具有较好的普适性。
在 SVC
和 LinearSVC
一个重要的决策标准是 LinearSVC
趋向于样本数越大收敛越快。这是由于线性核是一个特殊的情况,在Liblinear中进行了优化,但在Libsvm中没有。
实际的问题是在 弊端,他们把SVM称为什么 这不是SVM. LinearSVC实际上是在最小化铰链损失的平方,而不仅仅是铰链损失,此外,它还惩罚了偏置的大小(这 不是SVM),更多细节请参考其他问题。Scikit -learn中的SVC和LinearSVC在什么参数下是等价的?
那么该用哪个呢?这纯粹是 具体问题. 由于没有免费的午餐定理,不可能说 "这个损失函数是最好的,就这样"。有时平方损耗会更好,有时是普通铰链。