C在LinearSVC sklearn(scikitlearn)中的行为

2024-09-28 20:18:51 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我创建一些玩具数据:

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代码,我得到了一些更容易理解的东西。(我使用了来自e1071包的svm函数)

enter image description here


Tags: 数据test错误np分类pltrandomsamples
1条回答
网友
1楼 · 发布于 2024-09-28 20:18:51

LinearSVCSVC(kernel=linear)不是一回事

区别在于:

  • SVC和LinearSVC应该优化同一个问题,但事实上所有的libsvm线性估计都会惩罚截距,而libsvm的则不会(IIRC)
  • 这会导致不同的数学优化问题,从而导致不同的结果
  • 可能还有其他细微的差别,如缩放和默认损耗函数(编辑:确保在LinearSVC中设置损耗=”铰链“)
  • 接下来,在多类分类中,默认情况下liblinear执行一对一分类,而libsvm执行一对一分类

另见:https://stackoverflow.com/a/33844092/5025009

相关问题 更多 >