Python sklearn.svm.svc';s函数predict_proba()是否在内部工作?

Python sklearn.svm.svc';s函数predict_proba()是否在内部工作?,python,svm,scikit-learn,Python,Svm,Scikit Learn,我用from做二进制分类。我用它的predict_proba()函数得到概率估计。有人能告诉我predict_Probabila()如何在内部计算概率吗?Scikit learn在内部使用LibSVM,而这反过来又使用(如中所述)校准SVM以产生除类预测之外的概率 Platt缩放要求首先像往常一样训练SVM,然后优化参数向量A和B,以便 P(y|X) = 1 / (1 + exp(A * f(X) + B)) 其中f(X)是样本与超平面的有符号距离(scikit learn的决策函数方法)。在

我用from做二进制分类。我用它的predict_proba()函数得到概率估计。有人能告诉我predict_Probabila()如何在内部计算概率吗?

Scikit learn在内部使用LibSVM,而这反过来又使用(如中所述)校准SVM以产生除类预测之外的概率

Platt缩放要求首先像往常一样训练SVM,然后优化参数向量A和B,以便

P(y|X) = 1 / (1 + exp(A * f(X) + B))
其中
f(X)
是样本与超平面的有符号距离(scikit learn的
决策函数
方法)。在这个定义中,您可能会认识到,逻辑回归和神经网络用于将决策函数转化为概率估计的相同函数

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


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

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

'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)) ;'
在这里,可以在模型文件(probA和probB)中找到A和B值。 它提供了一种将概率转换为决策值从而转换为枢纽损失的方法


使用ln(0)=-200。

回答得很好@larsmans。我只是想知道概率是否可以解释为分类决策的置信度?例如,样本的正面和负面分类的概率非常接近,这意味着学习者对其分类不太确定?谢谢@larsmans。我实际上观察到了更为戏剧性的情况——预测值为1,但概率为0.45。我认为使用的bayes最优截止值精确地为0.5。你认为这种戏剧性的例子仍然可以用LibSVM中的数值不稳定性来解释吗?@MosesXu:这是值得调查的事情,但我没有时间深入研究LibSVM代码。乍一看,这似乎是不一致的行为,但我认为,
predict
实际上并没有使用概率,而是使用SVM超平面。@MosesXu:我盯着数学看了一会儿,我意识到如果
B
的值合适,您可以得到与SVM
predict
decision_函数
方法不同的预测。我担心当你使用Platt scaling时,你将不得不相信
predict
,或者相信
predict\u proba
,因为两者可能不一致。@larsmans:不管概率参数如何,预测函数总是坚持超平面,这有点令人惊讶——这是因为学习到的超平面总是代表最小的结构风险,而拟合的逻辑回归尽管使用n倍交叉验证进行拟合,还是容易过度合身?