我正在使用scikit-learn中的sklearn.svm.svc进行二进制分类。我正在使用它的 predict_proba() 函数来获得概率估计。谁能告诉我 predict_proba() 如何在内部计算概率?
2 回答
Scikit-learn 在内部使用 LibSVM,而这反过来又使用Platt 缩放,正如LibSVM 作者在本说明中详述的那样,校准 SVM 以产生除类预测之外的概率。
Platt 缩放需要首先像往常一样训练 SVM,然后优化参数向量A和B,使得
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.9
和A = 1
,那么P(y|X) = .475
。我是凭空捏造这些数字,但您已经注意到这在实践中可能会发生。
实际上,Platt scaling 在交叉熵损失函数下在 SVM 的输出之上训练了一个概率模型。为了防止这个模型过拟合,它使用了内部五折交叉验证,这意味着用它来训练 SVMprobability=True
可能比普通的非概率 SVM 更昂贵。
实际上我发现了一个稍微不同的答案,他们使用此代码将决策值转换为概率
'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。