RBF 核的决策值

jat*_*tha 3 python machine-learning svm libsvm scikit-learn

我在某处读到,无法解释非线性内核上的 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
Run Code Online (Sandbox Code Playgroud)

看起来它正在执行 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

lej*_*lot 5

看起来它正在执行 libsvm 的预测等效项,但如果它等效于 ,为什么它会改变决策值的符号?

这些只是关于类符号的内部表示的实现技巧。没有什么值得真正担心的。

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

另外,有什么方法可以使用该值或任何预测来计算 SVM 决策的置信值

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

abs(decision_function(x1)) < abs(decision_function(x2)) => x1比 更不自信x2

简而言之 -decision_function值越大,该点在其超平面中的位置就越“深”。