1

我正在使用 libSVM python 包装器进行二进制分类器预测,并注意到有时我会从“predict”和“predict_proba”方法中得到不同的结果。要从“predict_proba”返回的矩阵中获取预测的类,我对每个实例使用以下代码:

return 0 if probs[0]>0.5 else 1

例如,对于一个实例,'predict_proba' 返回 [[ 0.49179164, 0.50820836]],'predict' 方法返回 1 作为例外。但是对于另一个例子,'predict' 函数返回 1,而 'predict_proba' 返回 [[ 0.50822999, 0.49177001]],这意味着预测的类是 0 而不是 1。为了检查哪个结果是正确的,我调用了'decision_function' 方法,它返回与分离超平面的距离。如果为正,则该类为 1,否则为 0。'decision_function' 返回 0.024,意味着类确实是 1,因为 'predict' 方法返回,这意味着在 'predict_proba' 方法中存在错误。为了计算概率,我使用了以下代码:

dist = classifier.decision_function(instance)
class1_prob = np.exp(dist)/(np.exp(dist)+np.exp(-dist))
probs = [[1-class1_prob, class1_prob]]

最明显的是有一个错误,我想知道它是在 libSVM 库中还是在 python 包装器中。我的直觉告诉我,这种可疑的行为是由于离分离超平面太近的实例造成的。

4

1 回答 1

1

只是一个提示,因此社区 wiki:您的版本predict_proba不是 LibSVM 中使用的版本。相反,它使用

static double sigmoid_predict(double decision_value, double A, double B)
{
        double fApB = decision_value*A+B;
        if (fApB >= 0)
                return exp(-fApB)/(1.0+exp(-fApB));
        else
                return 1.0/(1+exp(fApB)) ;
}

其中AB值由训练期间的Platt 标度确定。

于 2013-02-20T15:53:53.277 回答