【发布时间】:2014-03-15 01:12:23
【问题描述】:
我在某处读到,无法解释非线性内核上的 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
【问题讨论】:
标签: python machine-learning scikit-learn svm libsvm