C 在 LinearSVC sklearn (scikit-learn) 中的行为
Behavior of C in LinearSVC sklearn (scikit-learn)
首先我创建了一些玩具数据:
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
较小,则允许误分类,使margin(soft margin)变大
对于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 代码,我得到了更容易理解的东西。 (我使用了 e1071
包中的 svm
函数)
LinearSVC
和 SVC(kernel=linear)
不是一回事。
区别是:
- SVC 和 LinearSVC 应该优化相同的问题,但实际上所有 liblinear 估计器都会对截距进行惩罚,而 libsvm 则不会(IIRC)。
- 这会导致不同的数学优化问题,从而导致不同的结果。
- 可能还有其他细微差别,例如缩放比例和默认损失函数(编辑:确保您在 LinearSVC 中设置了 loss='hinge')。
- 接下来,在多类分类中,liblinear 默认执行一对一,而 libsvm 默认执行一对一。
另请参阅:
首先我创建了一些玩具数据:
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
较小,则允许误分类,使margin(soft margin)变大
对于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 代码,我得到了更容易理解的东西。 (我使用了 e1071
包中的 svm
函数)
LinearSVC
和 SVC(kernel=linear)
不是一回事。
区别是:
- SVC 和 LinearSVC 应该优化相同的问题,但实际上所有 liblinear 估计器都会对截距进行惩罚,而 libsvm 则不会(IIRC)。
- 这会导致不同的数学优化问题,从而导致不同的结果。
- 可能还有其他细微差别,例如缩放比例和默认损失函数(编辑:确保您在 LinearSVC 中设置了 loss='hinge')。
- 接下来,在多类分类中,liblinear 默认执行一对一,而 libsvm 默认执行一对一。
另请参阅: