我正在研究二元分类问题。我遇到过这种情况,我使用了从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?
当涉及到
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.1(而不是 0.5)这一意外阈值来区分预测类别的最新信息? 我遇到了同样的问题:SVC 的校准概率分数跨越了意想不到的范围
非常感谢。