sklearn.svm.svc的函数predict_proba()如何在内部工作?

use*_*183 39 python svm scikit-learn

我正在使用scikit中的sklearn.svm.svc学习二进制分类.我正在使用它的predict_proba()函数来获得概率估计.谁能告诉我predict_proba()如何在内部计算概率?

Fre*_*Foo 68

Scikit-learn在内部使用LibSVM,而这又使用了Platt缩放,如LibSVM作者本说明中所详述,校准SVM以产生除类预测之外的概率.

普拉特缩放要求首先训练SVM像往常一样,然后优化参数向量使得

P(y|X) = 1 / (1 + exp(A * f(X) + B))
Run Code Online (Sandbox Code Playgroud)

f(X)样本与超平面的符号距离在哪里(scikit-learn的decision_function方法).您可能会认识到此定义中的逻辑sigmoid,与逻辑网络和神经网络用于将决策函数转换为概率估计的功能相同.

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

实际上,Platt缩放在交叉熵损失函数下在SVM输出之上训练概率模型.为了防止此模型过度拟合,它使用内部五重交叉验证,这意味着训练SVM probability=True可能比一个非概率SVM昂贵得多.

  • 很棒的答案@larsmans.我只是想知道概率是否可以被解释为分类决策的置信度量?例如,样本的正面和负面类别的非常接近的概率意味着学习者对其分类不太确定? (2认同)
  • 谢谢@larsmans。我实际上观察到了更多戏剧性的案例-预测为1,但概率为0.45。我认为使用的贝叶斯最佳截止精确为0.5。您是否认为仍然可以通过LibSVM中的数值不稳定性来解释这种戏剧性的情况? (2认同)
  • @MosesXu:我更长时间地盯着数学,我意识到使用适当的"B"值,你可以获得与你从SVM"predict"和"decision_function"方法得到的预测完全不同的预测.我担心当你使用Platt缩放时,你必须承诺要么相信'predict`,要么相信`predict_proba`,因为两者可能不一致. (2认同)