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)的实例预测为正例的主要内容,如果未能解决你的问题,请参考以下文章