【发布时间】:2013-02-13 05:16:29
【问题描述】:
我正在使用来自scikit-learn 的sklearn.svm.svc 进行二进制分类。我正在使用它的 predict_proba() 函数来获得概率估计。谁能告诉我 predict_proba() 如何在内部计算概率?
【问题讨论】:
标签: python svm scikit-learn
我正在使用来自scikit-learn 的sklearn.svm.svc 进行二进制分类。我正在使用它的 predict_proba() 函数来获得概率估计。谁能告诉我 predict_proba() 如何在内部计算概率?
【问题讨论】:
标签: python svm scikit-learn
Scikit-learn 在内部使用 LibSVM,而这反过来又使用 Platt scaling(详见 this note by the LibSVM authors)来校准 SVM,以生成除类预测之外的概率。
Platt scaling 需要首先像往常一样训练 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 更昂贵。
【讨论】:
predict 实际上并没有使用概率,而是使用了 SVM 超平面。
B 值,您可以获得与从 SVM @987654337 获得的预测完全不同的预测@ 和 decision_function 方法。我担心当你使用 Platt 缩放时,你必须承诺要么相信predict,要么相信predict_proba,因为两者可能不一致。
其实我发现了一个稍微不同的答案,他们使用这段代码将决策值转换为概率
'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。
【讨论】: