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

时间:2017-04-12 22:27:17

标签: 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)

1 个答案:

答案 0 :(得分:1)

此行为的原因是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