我使用sklearn.svm.svc中的scikit-learn进行二进制分类。我正在使用它的predict_proba()函数来获得概率估计。谁能告诉我predict_proba()如何在内部计算概率?
答案 0 :(得分:66)
Scikit-learn在内部使用LibSVM,而这又使用Platt scaling,如this note by the LibSVM authors中所述,校准SVM以产生除类预测之外的概率。
Platt缩放需要像往常一样首先训练SVM,然后优化参数向量 A 和 B ,以便
P(y|X) = 1 / (1 + exp(A * f(X) + B))
其中f(X)
是样本与超平面的符号距离(scikit-learn的decision_function
方法)。您可能会认识到此定义中的logistic sigmoid,这与逻辑回归和神经网络用于将决策函数转换为概率估计的功能相同。
请注意:B
参数,“拦截”或“偏见”或您喜欢称之为的任何内容,都可能导致基于此模型的概率估算的预测与您从中获得的预测不一致SVM决策函数f
。例如。假设f(X) = 10
,则X
的预测为正;但如果B = -9.9
和A = 1
,则为P(y|X) = .475
。我是凭空捏造这些数字的,但你注意到这可能会在实践中发生。
有效地,Platt缩放在交叉熵损失函数下在SVM输出之上训练概率模型。为防止此模型过度拟合,它使用内部五重交叉验证,这意味着使用probability=True
训练SVM可能比一个非概率SVM更昂贵。
答案 1 :(得分:0)
实际上,我发现他们使用此代码将决策值转换为概率
的答案略有不同'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。