首先我创建一些玩具数据。
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)
下面的图,以可视化的数据。
然后,我训练一个模型与 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')
有了 C=0.001
例如,我希望决策边界能走到右侧,比如11左右,但我得到的是这样的结果。
我试着用另一个模块与 SVC
函数。
from sklearn.svm import SVC
svc_lin = SVC(kernel = 'linear', random_state = 0,C=0.01)
svc_lin.fit(X,y)
我成功地得到了想要的输出。
用我的R代码,我得到了更容易理解的东西。(我使用了 svm
功能从 e1071
包)
LinearSVC
而 SVC(kernel=linear)
是不一样的。
区别在于。