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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinearSVC() 与 SVC(kernel='linear')相关的知识,希望对你有一定的参考价值。

参考技术A LinearSVC() 与 SVC(kernel='linear') 的区别概括如下:

sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0, random_state=None, max_iter=1000)

注意:底层 C 实现使用随机数选择特征,因此,对于相同的输入可能会得到不同的结果。liblinear使用稀疏的数据表示,会产生内存拷贝。

线性模型有线性决策边界(交叉的超平面),而非线性核模型(多项式或者高斯RBF)的弹性非线性决策边界的形状由核种类和参数决定。

scikit learn中的SVC vs LinearSVC:损失函数的区别

【中文标题】scikit learn中的SVC vs LinearSVC:损失函数的区别【英文标题】:SVC vs LinearSVC in scikit learn: difference of loss function 【发布时间】:2021-01-23 05:26:15 【问题描述】:

根据this post,scikit learn中的SVC和LinearSVC有很大的不同。但是看official scikit learn documentation的时候,就不是那么清楚了。

特别是对于损失函数,似乎有一个等价性:

而this post 说 le 损失函数是不同的:

SVC:1/2||w||^2 + C SUM xi_i 线性SVC:1/2||[w b]||^2 + C SUM xi_i

似乎在LinearSVC的情况下,截距是正则化的,但官方文档却另有说明。

有人知道更多信息吗?谢谢

【问题讨论】:

【参考方案1】:

SVC 是LIBSVM 库的包装器,而LinearSVC 是LIBLINEAR 的包装器

LinearSVC通常SVC 快,并且可以处理更大的数据集,但它只能使用线性内核,因此得名。所以区别不在于表述,而在于实现方式。

引用LIBLINEARFAQ:

When to use LIBLINEAR but not LIBSVM

There are some large data for which with/without nonlinear mappings gives similar performances. 
Without using kernels, one can quickly train a much larger set via a linear classifier. 
Document classification is one such application. 
In the following example (20,242 instances and 47,236 features; available on LIBSVM data sets), 
the cross-validation time is significantly reduced by using LIBLINEAR:

% time libsvm-2.85/svm-train -c 4 -t 0 -e 0.1 -m 800 -v 5 rcv1_train.binary
Cross Validation Accuracy = 96.8136%
345.569s

% time liblinear-1.21/train -c 4 -e 0.1 -v 5 rcv1_train.binary
Cross Validation Accuracy = 97.0161%
2.944s

Warning:While LIBLINEAR's default solver is very fast for document classification, it may be slow in other situations. See Appendix C of our SVM guide about using other solvers in LIBLINEAR.
Warning:If you are a beginner and your data sets are not large, you should consider LIBSVM first.

【讨论】:

不同之处不仅在于速度,还在于它们的不同。我做了一个简单的例子here。你也可以阅读this 我的问题是关于两个分类器的损失函数。谢谢 更多实现细节可以在原文LIBLINEARpaper的附录中找到 post中的答案是正确的。 LIBLINEAR 确实包含优化中的偏差项,而 LIBSVM 没有。 SVC 默认为 L1 损失和 L2 惩罚。这就是为什么您可以在两者的结果几乎相等时创建条件,如果您为LinearSVMloss="hinge"intercept_scaling 设置足够大。偏置项包含在LIBLINEAR 中,因为权重向量隐式扩展为w=[w;b]。如果在优化之前将数据居中,它应该有效地将偏差设置为零。

以上是关于LinearSVC() 与 SVC(kernel='linear')的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

sklearn:评估 LinearSVC AUC

sklearn 笔记 SVM