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

标签 python scikit-learn svm

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

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

最佳答案

LinearSVCSVC(kernel=linear) 不是一回事。

差异是:

  • SVC 和 LinearSVC 应该优化相同的问题,但实际上所有 liblinear 估计器都会惩罚截距,而 libsvm 则不会(IIRC)。
  • 这会导致不同的数学优化问题,从而导致不同的结果。
  • 还可能存在其他细微差别,例如缩放和默认损失函数(编辑:确保在 LinearSVC 中设置 loss='hinge')。
  • 接下来,在多类分类中,liblinear 默认执行一对一,而 libsvm 默认执行一对一。

另请参阅:https://stackoverflow.com/a/33844092/5025009

关于python - LinearSVC sklearn (scikit-learn) 中 C 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62232929/

相关文章:

machine-learning - 如何通过 SVM-light 使用示例相关成本?

machine-learning - 如何使用SVM和逻辑回归的权重向量来确定特征重要性?

python-3.x - 使用linerrud数据集进行感知器学习

Python未知文件扩展名.mp4

Python 结构 : Fail on a Series of Commands

python - 通用异常处理返回值

python - 线性回归预测因输入类型而异

python - scikit-learn 模型持久性 : pickle vs pmml vs . ..?

python - 如何从sklearn的gridsearchcv获取敏感性和特异性(真阳性率和真阴性率)?

python - 将列表中元组形式的单行字符串拆分为多行(等于元组数)