0

我正在研究二进制分类问题。我有这种情况,我使用了从 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 将概率分数 < 0.5 的实例也预测为正数。关于如何解释这种情况的任何想法?

4

1 回答 1

0

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)
    

我还建议就该主题发表这篇文章

于 2021-11-20T19:03:02.803 回答