我正在使用 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 包装器中。我的直觉告诉我,这种可疑的行为是由于离分离超平面太近的实例造成的。