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

Posted

技术标签:

【中文标题】LinearSVC() 与 SVC(kernel=\'linear\') 不同【英文标题】:LinearSVC() differs from SVC(kernel='linear')LinearSVC() 与 SVC(kernel='linear') 不同 【发布时间】:2016-04-21 02:07:15 【问题描述】:

当数据偏移(不以零为中心)时,LinearSVC()SVC(kernel='linear') 会给出截然不同的结果。 (编辑:问题可能是它不处理非标准化数据。)

import matplotlib.pyplot as plot
plot.ioff()
import numpy as np
from sklearn.datasets.samples_generator import make_blobs
from sklearn.svm import LinearSVC, SVC


def plot_hyperplane(m, X):
    w = m.coef_[0]
    a = -w[0] / w[1]
    xx = np.linspace(np.min(X[:, 0]), np.max(X[:, 0]))
    yy = a*xx - (m.intercept_[0]) / w[1]
    plot.plot(xx, yy, 'k-')

X, y = make_blobs(n_samples=100, centers=2, n_features=2,
                  center_box=(0, 1))
X[y == 0] = X[y == 0] + 100
X[y == 1] = X[y == 1] + 110

for i, m in enumerate((LinearSVC(), SVC(kernel='linear'))):
    m.fit(X, y)
    plot.subplot(1, 2, i+1)
    plot_hyperplane(m, X)

    plot.plot(X[y == 0, 0], X[y == 0, 1], 'r.')
    plot.plot(X[y == 1, 0], X[y == 1, 1], 'b.')

    xv, yv = np.meshgrid(np.linspace(98, 114, 10), np.linspace(98, 114, 10))
    _X = np.c_[xv.reshape((xv.size, 1)), yv.reshape((yv.size, 1))]
    _y = m.predict(_X)

    plot.plot(_X[_y == 0, 0], _X[_y == 0, 1], 'r.', alpha=0.4)
    plot.plot(_X[_y == 1, 0], _X[_y == 1, 1], 'b.', alpha=0.4)

plot.show()

这是我得到的结果:

(left=LinearSVC(), right=SVC(kernel='linear'))

sklearn.__version__ = 0.17。但我也在 Ubuntu 14.04 中进行了测试,它带有 0.15。

我想过报告这个错误,但它似乎太明显了,不是一个错误。我错过了什么?

【问题讨论】:

【参考方案1】:

阅读文档,他们使用不同的底层实现。 LinearSVC 正在使用 liblinear,而 SVC 正在使用 libsvm。

仔细观察系数和截距,LinearSVC 似乎将正则化应用于 SVC 没有的截距。

通过添加intercept_scaling,我能够获得相同的结果。

LinearSVC(loss='hinge', intercept_scaling=1000)

【讨论】:

仔细看,似乎变量的规模存在优化问题。稍后将扩展我的答案。 谢谢。所以,如果我不想规范化我的数据集并且我没有时间一个一个地去,我应该坚持SVC(kernel='linear'),对吧? SVC 似乎不那么挑剔:-)。对于任何梯度下降优化器,使用特征缩放和均值居中通常是一个好主意。你有什么理由避免它?它可以通过PipelineStandardScaler 在 scikit-learn 中轻松实现。如果您尝试自己解释系数,它只会变得烦人。 只是我们使用的是来自 UCI 的数据,我们想将我们的方法与使用线性内核的SVC 进行比较。但是,是的,我们现在要对数据进行标准化,也许考虑使用SVC 进行最终运行。 LinearSVC 自然要快很多。

以上是关于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