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

SVM Linear Classifier - Strange Behaviour

我一定是这里做错了什么,但我想不通。

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). Hence small margins means large ||w||. SVM will minimize 0.5||w||^2 (under certain constraints, see page 7 here)。

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

SVM 的 sklearn 实现中的默认正则化器是 C=1。如果你取 C=1000,那么 clf.predict(0.14) 会给你 False.