【问题标题】:When should one use LinearSVC or SVC?什么时候应该使用 LinearSVC 或 SVC?
【发布时间】:2016-05-06 17:16:36
【问题描述】:

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

  1. SVC(kernel="linear") is better
  2. LinearSVC is better
  3. Doesn't matter

有人可以解释何时使用LinearSVCSVC(kernel="linear")

LinearSVC 似乎比 SVC 稍微好一点,而且通常更挑剔。但如果scikit 决定花时间实现线性分类的特定案例,为什么LinearSVC 的表现不会优于SVC

【问题讨论】:

标签: machine-learning scikit-learn svm


【解决方案1】:

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

结果的差异来自几个方面:SVCLinearSVC 应该优化同一个问题,但实际上所有liblinear 估计器都会惩罚截距,而libsvm 不会(IIRC) .这会导致不同的数学优化问题,从而导致不同的结果。还可能存在其他细微差别,例如缩放和默认损失函数(编辑:确保在 LinearSVC 中设置了 loss='hinge')。接下来,在多类分类中,liblinear 默认进行一对一,而libsvm 进行一对一。

SGDClassifier(loss='hinge') 与其他两个不同之处在于它使用随机梯度下降而不是精确梯度下降,并且可能不会收敛到相同的解决方案。但是得到的解可能泛化得更好。

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

【讨论】:

【解决方案2】:

实际的问题在于 scikit 方法的问题,他们将 SVM 称为 不是 SVM。 LinearSVC 实际上是最小化平方铰链损失,而不仅仅是铰链损失,此外,它会惩罚偏差的大小(不是 SVM),有关更多详细信息,请参阅其他问题: Under what parameters are SVC and LinearSVC in scikit-learn equivalent?

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

【讨论】:

  • 您对平方铰链损失的看法是正确的(我提到损失也不同)。但是将其设置为铰链仍然不会使它们产生与具有线性内核的 SVC 相同的答案。
  • 正如我所说 - 这也是关于惩罚偏见,与我的其他答案有关
  • 确实,所以这个问题与您已经回答的问题几乎相同。但需要注意的是,LinearSVC 并非毫无用处——它应该比通用内核方法具有更好的扩展性。
  • 当然,“没有免费的午餐定理”,每个分类器都有其利基
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2011-04-15
  • 2017-04-10
  • 2012-03-19
  • 2018-05-12
  • 2018-12-11
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多