【问题标题】:SVM Linear Classifier - Strange BehaviourSVM 线性分类器 - 奇怪的行为
【发布时间】:2017-09-08 21:19:25
【问题描述】:

我一定是在做一些简单的错误,但我想不通。

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)

【问题讨论】:

    标签: python scikit-learn svm


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2019-01-21
      • 2017-04-10
      • 2015-09-06
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      相关资源
      最近更新 更多