我必须在这里做一些简单的错误,但我无法弄清楚。
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)
答案 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
。