C在LinearSVC sklearn(scikit-learn)中的行为。

问题描述 投票:1回答:1

首先我创建一些玩具数据。

n_samples=20
X=np.concatenate((np.random.normal(loc=2, scale=1.0, size=n_samples),np.random.normal(loc=20.0, scale=1.0, size=n_samples),[10])).reshape(-1,1)
y=np.concatenate((np.repeat(0,n_samples),np.repeat(1,n_samples+1)))
plt.scatter(X,y)

下面的图,以可视化的数据。

enter image description here

然后,我训练一个模型与 LinearSVC

from sklearn.svm import LinearSVC
svm_lin = LinearSVC(C=1)
svm_lin.fit(X,y)

我的理解是 C 就是这样。

  • 如果... C 是非常大的,那么就不能容忍错误的分类,因为处罚会很大。
  • 如果 C 是小的,将容忍错误分类,使余量(软余量)更大。

随着 C=1,我有如下图(橙色线代表给定x值的预测),我们可以看到决策边界在7左右,所以 C=1 足够大,不会让任何错误分类。

X_test_svml=np.linspace(-1, 30, 300).reshape(-1,1)
plt.scatter(X,y)
plt.scatter(X_test_svml,svm_lin.predict(X_test_svml),marker="_")
plt.axhline(.5, color='.5')

enter image description here

有了 C=0.001 例如,我希望决策边界能走到右侧,比如11左右,但我得到的是这样的结果。

enter image description here

我试着用另一个模块与 SVC 函数。

from sklearn.svm import SVC
svc_lin = SVC(kernel = 'linear', random_state = 0,C=0.01)
svc_lin.fit(X,y)

我成功地得到了想要的输出。

enter image description here

用我的R代码,我得到了更容易理解的东西。(我使用了 svm 功能从 e1071 包)

enter image description here

python scikit-learn svm
1个回答
2
投票

LinearSVCSVC(kernel=linear) 是不一样的。

区别在于。

  • SVC和LinearSVC应该是对同一个问题进行优化 但事实上所有的liblinear估计器都会对截距进行惩罚 而libsvm的估计器不会(IIRC)。
  • 这就导致了不同的数学优化问题,从而导致不同的结果。
  • 也可能有其他微妙的差异,比如缩放和默认的损失函数(编辑:确保你在LinearSVC中设置 loss='hinge')。
  • 其次,在多类分类中,liblinear默认做onevsrest,而libsvm做onevsone。

也可以参考。https:/stackoverflow.coma338440925025009

© www.soinside.com 2019 - 2024. All rights reserved.