我正在使用scikit-learn中的sklearn.svm.svc进行二元分类。我使用它的predict_proba()函数来获取概率估计值。有人可以告诉我predict_proba()如何在内部计算概率吗?
我正在使用scikit-learn中的sklearn.svm.svc进行二元分类。我使用它的predict_proba()函数来获取概率估计值。有人可以告诉我predict_proba()如何在内部计算概率吗?
Scikit-learn使用LibSVM作为内部工具,而这个工具又使用Platt scaling进行校准,以生成概率预测结果和分类预测结果。此LibSVM作者的说明文档详细介绍了Platt scaling的过程。
Platt scaling首先要按照通常的方法训练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
。我是凭空编造这些数字的,但您已经注意到这在实践中可能会发生。
probability=True
训练SVM比普通的非概率性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。
predict
实际上并没有使用概率,而是使用了SVM超平面。 - Fred FooB
值,你可以得到与SVMpredict
和decision_function
方法所得到的预测结果非常不同的预测结果。我担心当你使用Platt缩放时,你必须要选择相信predict
还是相信predict_proba
,因为这两者可能是不一致的。 - Fred Fooprobability=True
不会影响decision_function
的结果,所以无论如何都会存在不一致性。(我越想越相信Platt缩放只是一个hack,应该使用RVMs代替SVMs进行概率估计。) - Fred Foo