python - SVM 线性分类器 - 奇怪的行为

标签 python scikit-learn svm

我一定在这里做了一些简单的错误,但我无法弄清楚。

from sklearn import svm
clf = svm.SVC(kernel='linear')
y = [False, True, True]
X = [[1.0], [2.0], [3.0]]
clf.fit(X, y)
clf.predict(1.4)

Out[324]: array([False], dtype=bool)

行为符合预期...但是...

X = [[0.1], [0.2], [0.3]]
clf.fit(X, y)
clf.predict(0.14)

Out[325]: array([True], dtype=bool)

最佳答案

出现此行为的原因是 SVM 的 sklearn 实现包含正则化参数。让我们看看这如何影响结果。

首先,在第二个示例中,clf.predict(0.14)给出了True。事实上,即使 clf.predict(0.1) 也给出 True,这可能看起来违反直觉,因为在您的训练示例中,您将其分类为 False .

两个示例之间的区别在于,在第二个示例中,不同类别的点比第一个示例中的点彼此更接近。因此,在第二个示例中,分离超平面的边距将小得多。

现在,SVM(没有正则化)尝试找到一个具有最大可能边距的分离超平面,在您的第二个示例中,该超平面将相当小。边距的公式为 1/||w|| (参见第 7 页顶部 here )。因此,较小的边距意味着较大的||w||。 SVM 将最小化 0.5||w||^2(在某些约束下,请参阅第 7 页 here)。

但是,当您添加正则化参数C时,SVM将尝试最小化0.5||w||^2+C*penalty(参见第19页底部) here)。因此,这可能会导致 ||w|| 减少,同时惩罚增加。这可能会增加分类错误率。

SVM sklearn 实现中的默认正则化器是 C=1。如果您采用 C=1000,则 clf.predict(0.14) 将为您提供 False

关于python - SVM 线性分类器 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43380619/

相关文章:

python - 奇异协方差矩阵下sklearn/statsmodels普通最小二乘的结果

r - 如何在 R 中绘制 SVM 的分类图

machine-learning - 一种支持非线性内核和一对多多标签的 SVM 实现

python - 展开面板数据python

Python:3D 列主要张量到行主要

python - 使用 Mechanize 和 Python 登录 Stack Overflow

python - 如何从文件中将公共(public) RSA key 加载到 Python-RSA 中?

python - sklearn 中字母的 N 元语法

python - sklearn KFold() - 将所有折叠保存到 csv 文件

matlab - SVM - 训练样本数与特征数之间的关系