LinearSVC和SVC之间有什么区别(kernel =“linear”)?

时间:2017-07-29 00:49:38

标签: scikit-learn svm

我找到了sklearn.svm.LinearSVCsklearn.svm.SVC(kernel='linear'),他们看起来和我很相似,但我对路透社的结果却截然不同。

sklearn.svm.LinearSVC: 81.05% in   28.87s train /    9.71s test
sklearn.svm.SVC      : 33.55% in 6536.53s train / 2418.62s test

两者都有线性内核。 LinearSVC的容差高于SVC的容差:

LinearSVC(C=1.0, tol=0.0001, max_iter=1000, penalty='l2', loss='squared_hinge', dual=True, multi_class='ovr', fit_intercept=True, intercept_scaling=1)
SVC      (C=1.0, tol=0.001,    max_iter=-1, shrinking=True, probability=False, cache_size=200, decision_function_shape=None)

两种功能如何区别?即使我设置kernel='lineartol=0.0001max_iter=1000 and decision_function_shape ='ovr'the SVC { {1}} LinearSVC`。为什么呢?

我使用takes much longer than并且两者都包含在sklearn 0.18中。我不确定这是否与OneVsRestClassifier / multi_class='ovr'相同。

1 个答案:

答案 0 :(得分:8)

确实,LinearSVCSVC(kernel='linear')会产生不同的结果,i。即指标得分和决策边界,因为它们使用不同的方法。下面的玩具示例证明了这一点:

from sklearn.datasets import load_iris
from sklearn.svm import LinearSVC, SVC

X, y = load_iris(return_X_y=True)

clf_1 = LinearSVC().fit(X, y)  # possible to state loss='hinge'
clf_2 = SVC(kernel='linear').fit(X, y)

score_1 = clf_1.score(X, y)
score_2 = clf_2.score(X, y)

print('LinearSVC score %s' % score_1)
print('SVC score %s' % score_2)

--------------------------
>>>    0.96666666666666667
>>>    0.98666666666666669

这种差异的关键原则如下:

  • 默认缩放,LinearSVC最小化铰链平方损失,SVC最小化常规铰链损失。可以手动定义铰链' lossLinearSVC参数的字符串。
  • LinearSVC使用One-vs-All(也称为One-vs-Rest)多类缩减,而SVC使用One-vs-One多类缩减。还注意到here。此外,对于多类分类问题SVC适合N * (N - 1) / 2模型,其中N是类的数量。相比之下,LinearSVC只适合N模型。如果分类问题是二进制的,那么在两种情况下只适用一种模型。 multi_classdecision_function_shape参数没有任何共同之处。第二个是聚合器,它以方便的(n_features, n_samples)形状转换决策函数的结果。 multi_class是一种建立解决方案的算法方法。
  • LinearSVC的基本估算值 liblinear ,实际上会对拦截进行惩罚。 SVC使用 libsvm 估算值。 liblinear 估算器针对线性(特殊)情况进行了优化,因此比 libsvm 更快地收敛于大量数据。这就是LinearSVC花费更少时间来解决问题的原因。

事实上,LinearSVC在截距缩放后实际上并不是线性的,如评论部分所述。