为啥 SVC、NuSVC 和 LinearSVC 会产生截然不同的结果?

Posted

技术标签:

【中文标题】为啥 SVC、NuSVC 和 LinearSVC 会产生截然不同的结果?【英文标题】:Why SVC, NuSVC and LinearSVC are producing very different results?为什么 SVC、NuSVC 和 LinearSVC 会产生截然不同的结果? 【发布时间】:2019-07-09 01:30:51 【问题描述】:

我正在处理一项分类任务——根据 Twitter 用户的推文进行地理定位。

我使用 sklearn 的 SVC、NuSVC 和 LinearSVC 以及词袋模型进行了许多实验。准确度为 35%、60% 和 80%。 SVC 和 LinearSVC 的差距是一倍多,令人震惊。

我不太清楚为什么会发生这种情况。可能是因为过拟合还是欠拟合?为什么分类器之间的差异如此之大?

【问题讨论】:

【参考方案1】:

一般来说,非线性内核比线性函数更适合建模更复杂的函数,但这取决于数据、选择的超参数(例如罚分和内核)以及您如何评估结果。

LinearSVC

与参数 kernel='linear' 的 SVC 类似,但根据 liblinear 而不是 libsvm 实现,因此它在选择惩罚和损失函数方面具有更大的灵活性,并且应该更好地扩展到大量样本。

来源:sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC

SVC

该实现基于 libsvm。拟合时间复杂度与样本数量成二次方,这使得很难扩展到具有超过 10000 个样本的数据集。

来源:sklearn.svm.SVC.html#sklearn.svm.SVC

首先你应该测试一个LinearSVC 模型,因为它只有几个超参数,应该会给你一个第一个结果。之后,您可以尝试训练一堆 SVC 模型并选择最好的。为此,我建议在 Ckerneldegreegammacoef0tol 上创建一个 gridsearch。

【讨论】:

以上是关于为啥 SVC、NuSVC 和 LinearSVC 会产生截然不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

LinearSVC() 与 SVC(kernel='linear') 不同

LinearSVC 和 SVC(kernel="linear") 有啥区别?

为啥 LinearSVC 在这个数据集上效果这么差?

scikit-learn 中的 SVC 和 LinearSVC 在啥参数下是等效的?

当我将惩罚更改为 L1 时,为啥我的 linearSVC 会失败?

sklearn.svm包中的SVC(kernel=”linear“)和LinearSVC的区别