46

我正在使用scikit-learn中的sklearn.svm.svc进行二进制分类。我正在使用它的 predict_proba() 函数来获得概率估计。谁能告诉我 predict_proba() 如何在内部计算概率?

4

2 回答 2

77

Scikit-learn 在内部使用 LibSVM,而这反过来又使用Platt 缩放,正如LibSVM 作者在本说明中详述的那样,校准 SVM 以产生除类预测之外的概率。

Platt 缩放需要首先像往常一样训练 SVM,然后优化参数向量AB,使得

P(y|X) = 1 / (1 + exp(A * f(X) + B))

其中f(X)是样本与超平面的有符号距离(scikit-learn 的decision_function方法)。您可能会认出这个定义中的逻辑 sigmoid,逻辑回归和神经网络用于将决策函数转换为概率估计的函数相同。

请注意:B参数,“截距”或“偏差”或任何您喜欢的名称,可能会导致基于此模型的概率估计的预测与您从 SVM 决策函数中获得的预测不一致f。例如,假设f(X) = 10,则预测为X正;但如果B = -9.9A = 1,那么P(y|X) = .475。我是凭空捏造这些数字,但您已经注意到这在实践中可能会发生。

实际上,Platt scaling 在交叉熵损失函数下在 SVM 的输出之上训练了一个概率模型。为了防止这个模型过拟合,它使用了内部五折交叉验证,这意味着用它来训练 SVMprobability=True可能比普通的非概率 SVM 更昂贵。

于 2013-02-27T12:49:19.843 回答
-1

实际上我发现了一个稍微不同的答案,他们使用此代码将决策值转换为概率

'double fApB = decision_value*A+B;
if (fApB >= 0)
    return Math.exp(-fApB)/(1.0+Math.exp(-fApB));
else
     return 1.0/(1+Math.exp(fApB)) ;'

这里 A 和 B 值可以在模型文件(probA 和 probB)中找到。它提供了一种将概率转换为决策值从而转换为铰链损失的方法。

使用 ln(0) = -200。

于 2014-02-06T21:21:03.327 回答