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

Posted

技术标签:

【中文标题】SVM 模型将概率分数大于 0.1(默认阈值 0.5)的实例预测为正例【英文标题】:SVM model predicts instances with probability scores greater than 0.1(default threshold 0.5) as positives 【发布时间】:2021-09-29 04:27:11 【问题描述】:

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

但是,当我查看被分类为阳性的概率分数时,LR 的分布是从 0.5 到 1,而 SVM 从大约 0.1 开始。我调用了函数model.predict(prediction_data)来找出预测为每个类的实例和函数 model.predict_proba(prediction_data) 给出被分类为 0(neg) 和 1(pos) 的概率分数,并假设它们都有一个默认阈值 0.5。

我的代码没有错误,我不知道为什么 SVM 将概率分数

【问题讨论】:

【参考方案1】:

这是sklearn 中的一个已知事实,当涉及到SVC() 的二进制分类问题时,例如,在这些 github 问题中报告了这一点 (here 和 here)。此外,它也是 报道在User guide里据说:

此外,概率估计可能与分数不一致: 分数的“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() 的输出(顺便说一句,您在考虑calibrators 时会得到),如下所示:

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

我还建议this post 讨论这个话题。

【讨论】:

感谢您的回复。我会检查一下,使用一些校准方法来校准这些分类器。

以上是关于SVM 模型将概率分数大于 0.1(默认阈值 0.5)的实例预测为正例的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn SVM 将预测标记为概率分数预测/AUC

Andrew Ng机器学习:逻辑回归

AUC-ROC用于无排名分类器,例如OSVM

插入符号分类阈值

支持向量机(SVM)之硬阈值

【金融风控】风险模型评价指标