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 页的顶部)。因此,小利润意味着大||w||。SVM 将最大限度地减少0.5||w||^2(在某些约束下,请参阅此处的第 7 页)。

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

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

最新更新