SVM,scikit-learn:RBF内核的决策值

时间:2014-02-15 16:27:22

标签: python machine-learning scikit-learn svm libsvm

我已经在某处读过,在非线性内核上解释SVM决策值是不可能的,因此只有符号才有意义。但是,我看到几篇文章对决策值设置了一个阈值(尽管有SVMlight)[1] [2]。所以我不确定是否将决策值的阈值设置为合理的,但我仍然对结果感到好奇。

因此,当你调用predict()时,LibSVM python接口直接返回带有预测目标的决策值,有没有办法用scikit-learn做到这一点?我已经使用svm.SVC()训练了一个二元分类SVM模型,但现在却被困在那里。

在源代码中,我发现svm.libsvm.decision_function()函数注释为“(libsvm名称为predict_values)”。然后我看到了svm.SVC.decision_function()并检查了它的源代码:

    dec_func = libsvm.decision_function(
        X, self.support_, self.support_vectors_, self.n_support_,
        self.dual_coef_, self._intercept_, self._label,
        self.probA_, self.probB_,
        svm_type=LIBSVM_IMPL.index(self._impl),
        kernel=kernel, degree=self.degree, cache_size=self.cache_size,
        coef0=self.coef0, gamma=self._gamma)

    # In binary case, we need to flip the sign of coef, intercept and
    # decision function.
    if self._impl in ['c_svc', 'nu_svc'] and len(self.classes_) == 2:
        return -dec_func

似乎它正在执行libsvm的预测等价,但为什么它会改变决策值的符号,如果它相当于?

此外,有没有办法使用此值或任何预测输出计算SVM决策的置信度值(概率估计和Platt方法除外,我的模型在计算概率估计时不好)?或者正如所讨论的那样,唯一的标志对非线性内核中的决策值很重要吗?

[1] http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0039195#pone.0039195-Teng1

[2] http://link.springer.com/article/10.1007%2Fs00726-011-1100-2

1 个答案:

答案 0 :(得分:4)

  

似乎它正在执行libsvm的预测等价物,但为什么它会改变决策值的符号,如果它相当于?

这些只是关于班级标志内部表示的实施黑客。没有什么可以真正担心的。

sklearn decision_function是SVM的hyerplane w与您的数据x之间的内积的值(可能在内核引发的空间中),因此您可以使用它,移位或分析。然而,它的解释是非常抽象的,因为在rbf内核的情况下,它只是以x为中心的正态分布乘积的积分,方差等于1/(2*gamma),正态分布的加权和以支持向量(和相同的方差),其中权重是alpha系数。

  

此外,有没有办法使用此值或任何预测来计算SVM决策的置信度值

Platt的缩放并不是因为有一些“游说”迫使我们 - 这只是估计SVM信心的“正确”方法。但是,如果您对“概率感”信心不感兴趣,而是您可以定性比较的任何值(哪一点更有信心)可以用来做决策函数。它大致是内核空间中的点图像与分离超平面之间的距离(直到归一化常数是w的范数)。确实如此,

abs(decision_function(x1)) < abs(decision_function(x2)) => x1的信心不如x2

简而言之 - decision_function值越大,该点的“更深”就是超平面。