【问题标题】:How does sklearn.svm.svc's function predict_proba() work internally?sklearn.svm.svc 的函数 predict_proba() 如何在内部工作?
【发布时间】:2013-02-13 05:16:29
【问题描述】:

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

【问题讨论】:

    标签: python svm scikit-learn


    【解决方案1】:

    Scikit-learn 在内部使用 LibSVM,而这反过来又使用 Platt scaling(详见 this note by the LibSVM authors)来校准 SVM,以生成除类预测之外的概率。

    Platt scaling 需要首先像往常一样训练 SVM,然后优化参数向量 AB 使得

    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.9A = 1,那么P(y|X) = .475。我是凭空得出这些数字,但您已经注意到这可能在实践中发生。

    Platt 缩放有效地在交叉熵损失函数下基于 SVM 的输出训练概率模型。为了防止该模型过度拟合,它使用了内部五折交叉验证,这意味着使用 probability=True 训练 SVM 可能比普通的非概率 SVM 更昂贵。

    【讨论】:

    • 很好的答案@larsmans。我只是想知道概率是否可以解释为分类决策的置信度度量?例如。样本的正负类概率非常接近意味着学习器对其分类不太确定?
    • 谢谢@larsmans。我实际上观察到了更多戏剧性的案例——预测为 1,但概率为 0.45。我认为使用的贝叶斯最佳截止值精确为 0.5。你认为这种戏剧性的情况仍然可以用 LibSVM 中的数值不稳定性来解释吗?
    • @MosesXu:这是值得研究的,但我没有时间深入研究 LibSVM 代码 ATM。乍一看似乎是不一致的行为,但我认为predict 实际上并没有使用概率,而是使用了 SVM 超平面。
    • @MosesXu:我盯着数学看了一会儿,我意识到使用适当的 B 值,您可以获得与从 SVM @987654337 获得的预测完全不同的预测@ 和 decision_function 方法。我担心当你使用 Platt 缩放时,你必须承诺要么相信predict,要么相信predict_proba,因为两者可能不一致。
    • @larsmans:无论概率参数如何,预测函数总是坚持超平面有点令人惊讶 - 这是因为学习的超平面总是代表最小的结构风险,而拟合的逻辑回归,虽然拟合使用n折交叉验证,还是容易过拟合?
    【解决方案2】:

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

    '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。

    【讨论】:

      猜你喜欢
      • 2022-12-29
      • 2020-08-06
      • 2015-07-26
      • 2018-05-07
      • 2015-11-25
      • 2019-02-01
      • 2017-03-31
      • 2011-05-07
      • 2018-03-07
      相关资源
      最近更新 更多