我正在使用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,这意味着返回'predict'方法时类确实为1,这意味着'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包装器中。我的直觉告诉我,这种可疑行为是由于距离分离超平面太近的实例。
答案 0 :(得分:0)
只是一个提示,因此社区维基:您的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)) ;
}
A
和B
值在培训期间由Platt scaling确定。