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



我找到了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

两者都有一个线性内核。线性SVC的公差高于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 anddecision_function_shape='ovr'theSVCtakes much longer than线性SVC'。为什么?

我使用sklearn 0.18,两者都包裹在OneVsRestClassifier中。我不确定这是否与multi_class='ovr'/decision_function_shape='ovr'相同。

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

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最小化常规铰链损失。可以在LinearSVC中为loss参数手动定义"铰链"字符串。
  • LinearSVC使用一对一(也称为一对一(多类缩减,而SVC使用一对一多类缩减。这里也注明了。此外,对于多类分类问题SVC拟合N * (N - 1) / 2模型,其中N是类的数量。 相比之下,LinearSVC只是适合N模型。如果分类问题是二元的,则只有一个模型适合这两种情况。multi_classdecision_function_shape参数没有任何共同之处。第二个是聚合器,它将决策函数的结果转换为方便的(n_features, n_samples)形式。multi_class是一种建立解决方案的算法方法。
  • LinearSVC的基本估计量是自由线性的,实际上会惩罚截距。SVC使用libsvm估计器,而libsvm估计器则不使用。liblinear估计器针对线性(特殊(情况进行了优化,因此在大量数据上的收敛速度比libsvm更快。这就是为什么LinearSVC解决问题所需的时间更少。

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

它们之间的主要区别在于 linearsvc 允许您只选择线性分类器,而 svc 允许您从各种非线性分类器中进行选择。 但是,不建议将 SVC 用于非线性问题,因为它们非常慢。 尝试导入其他库以进行非线性分类。

现在,即使在定义了 kernel='linear' 之后,我们也不会得到相同的输出,这是因为 LinearSVC 和 SVC 在进行背景数学运算时都尝试了不同的方法。 此外,LinearSVC 基于一对一对休息的原则工作,而 SVC 在一对一上工作。

我希望这能回答你的问题。