svc的函数predict_proba()在内部是如何工作的?

2024-06-17 10:13:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 函数二进制分类sklearnscikit概率learnpredict
2条回答

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

'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。

Scikit learn在内部使用LibSVM,而这反过来又使用Platt scaling,如this note by the LibSVM authors中详细描述的那样,来校准支持向量机,以生成类预测之外的概率。

Platt标度首先需要像往常一样训练支持向量机,然后优化参数向量AB,以便

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

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

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

有效地,Platt标度在交叉熵损失函数下在支持向量机的输出上训练概率模型。为了防止这个模型过度拟合,它使用了一个内部的五重交叉验证,这意味着用probability=True训练支持向量机比普通的非概率支持向量机要昂贵得多。

相关问题 更多 >