scikit-learn – LinearSVC()与SVC(kernel =’linear’)不同

当数据偏移(不以零为中心)时,LinearSVC()和SVC(内核=’线性’)给出了非常不同的结果. (编辑:问题可能是它没有处理非规范化数据.)

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()

这是我得到的结果:

《scikit-learn – LinearSVC()与SVC(kernel =’linear’)不同》

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

sklearn .__ version__ = 0.17.但我也测试了Ubuntu 14.04,它带有0.15.

我想过报告这个bug,但是看起来很明显是一个bug.我错过了什么?

最佳答案 阅读文档,他们使用不同的底层实现. LinearSVC使用liblinear,其中SVC使用libsvm.

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

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

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

《scikit-learn – LinearSVC()与SVC(kernel =’linear’)不同》

点赞