SVM 模型将概率得分大于 0.1(默认阈值 0.5)的实例预测为正例

问题描述 投票:0回答:2

我正在研究二元分类问题。我遇到过这种情况,我使用了从sklearn导入的逻辑回归和支持向量机模型。这两个模型使用相同的、不平衡的训练数据进行拟合,并对类别权重进行了调整。他们也取得了可比的表现。当我使用这两个预训练模型来预测新数据集时。 LR 模型和 SVM 模型预测的阳性实例数量相似。并且预测的实例有很大的重叠。

但是,当我查看被分类为正例的概率分数时,LR 的分布是从 0.5 到 1,而 SVM 的分布是从 0.1 左右开始。我调用函数

model.predict(prediction_data)
来找出预测为每个类和函数的实例
model.predict_proba(prediction_data)
给出被分类为 0(负)和 1(正)的概率分数,并假设它们都有默认阈值 0.5。

我的代码中没有错误,我不知道为什么 SVM 会用概率分数来预测实例 < 0.5 as positives as well. Any thoughts on how to interpret this situation?

machine-learning scikit-learn svm prediction
2个回答
3
投票

当涉及到

sklearn
的二元分类问题时,这是
SVC()
中的一个已知事实,例如,在这些 github 问题中进行了报告 (这里这里)。此外,它还 用户指南中报告说:

此外,概率估计可能与分数不一致: 分数的“argmax”可能不是概率的argmax;在二元分类中,即使predict_proba的输出小于0.5,样本也可能被predict标记为属于正类;同样,即使 Predict_proba 的输出大于 0.5,它也可以被标记为负数。

或者直接在libsvm faq中,据说在那里

我们在这里只考虑二类分类。在训练中获得概率信息后,当且仅当决策值 >= 0 时,我们不会有 prob >= 0.5。

总而言之,重点是:

  • 一方面,预测基于

    decision_function
    值:如果在新实例上计算的决策值为正,则预测的类就是正类,反之亦然。

  • 另一方面,正如 github 问题之一中所述,

    np.argmax(self.predict_proba(X), axis=1) != self.predict(X)
    这就是不一致的根源。换句话说,为了在二元分类问题上始终保持一致性,您需要一个分类器,其预测基于
    predict_proba()
    的输出(顺便说一句,这是您在考虑 校准器 时得到的结果),如下所示:

     def predict(self, X):
         y_proba = self.predict_proba(X)
         return np.argmax(y_proba, axis=1)
    

我还建议关于该主题的这篇文章


0
投票

我知道这个线程有点旧,但是您能否提供有关如何克服概率值 0.1(而不是 0.5)这一意外阈值来区分预测类别的最新信息? 我遇到了同样的问题:SVC 的校准概率分数跨越了意想不到的范围

非常感谢。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.