具有类别不平衡的 LightGBM 模型的概率校准

机器算法验证 Python scikit-学习 助推 倾向评分 校准
2022-03-09 03:41:35

我使用 LightGBM 制作了一个二元分类模型。数据集相当不平衡,但我对它的输出很满意,但不确定如何正确校准输出概率。模型的基线得分sklearn.dummy.DummyClassifier为:

dummy = DummyClassifier(random_state=54)

dummy.fit(x_train, y_train)

dummy_pred = dummy.predict(x_test)

dummy_prob = dummy.predict_proba(x_test)
dummy_prob = dummy_prob[:,1]

print(classification_report(y_test, dummy_pred))

              precision    recall  f1-score   support

           0       0.98      0.98      0.98    132274
           1       0.02      0.02      0.02      2686

   micro avg       0.96      0.96      0.96    134960
   macro avg       0.50      0.50      0.50    134960
weighted avg       0.96      0.96      0.96    134960

模型的输出如下,结果没问题:

print(classification_report(y_test, y_pred))

              precision    recall  f1-score   support

           0       1.00      0.95      0.97    132274
           1       0.27      0.96      0.42      2686

   micro avg       0.95      0.95      0.95    134960
   macro avg       0.63      0.95      0.70    134960
weighted avg       0.98      0.95      0.96    134960

我想使用输出概率,所以我想我应该看看模型的校准情况,因为基于树的模型通常不能很好地校准。我曾经sklearn.calibration.calibration_curve绘制曲线:

import matplotlib.pyplot as plt
from sklearn.calibration import calibration_curve

gb_y, gb_x = calibration_curve(y_test, rf_probs, n_bins=10)

plt.plot([0, 1], [0, 1], linestyle='--')
# plot model reliability
plt.plot(gb_x, gb_y, marker='.')
plt.show()

模型输出的校准曲线

我尝试对数据进行 Platt 缩放,即将逻辑拟合到验证集输出概率并将其应用于测试数据。虽然它经过了更多校准,但概率被限制在大约 0.4 的最大值。我希望输出有一个很好的范围,即概率低和高的人。

校准后的校准曲线

有人知道我会怎么做吗?

3个回答

我建议不要改变(校准的)预测概率。进一步的几点:

  1. 虽然显示“低”的校准概率可能违反直觉,但考虑到问题的性质,它也可能更现实。尤其是在不平衡的环境中操作时,预测特定用户/人具有非常高的绝对概率属于非常罕见的正类可能会产生误导/过度自信。
  2. 从你的帖子中我不是 100% 清楚校准是如何完成的。假设我们做了重复简历25-fold 交叉验证:在 10 次执行中的每一次都应该使用单独的 sayK-fold 内部交叉验证与 (K1) 用于学习模型的折叠和 1 用于拟合校准图。然后 K在每次执行中生成校准的分类器,并对它们的输出进行平均,以提供对测试折叠的预测。(Platt 的原始论文Probabilities for SV Machines使用K=3贯穿始终,但这不是硬性规定。)
  3. 鉴于我们正在校准分类器的概率,因此使用适当的评分规则指标是有意义的,例如Brier score、Continuous Ranked Probability Score (CRPS)、Logarithmic score(后者假设我们没有任何0或者1预测的概率)。
  4. 在我们确定了门槛之后T对于我们的概率分类器,我们很乐意解释它的作用。事实上,风险分类可能建议“对待任何风险高于0.03“;如果我们可以将其与相关的错误分类成本相关联,那很好。同样,如果错误分类成本不可用,如果我们使用像 Brier 这样的适当评分规则,我们仍然很好;无论如何,我们已经校准了概率预测。

如果您希望输出具有良好的范围,则绝对应该解决数据不平衡问题。您可以选择 - 根据您的数据,特别是按类的出现次数 - 对代表性不足的类进行过度采样(小心这会降低该类的方差)。或者您可以对过度代表的类进行欠采样(这种方法的缺点是您不会使用所有数据并且您可能会错过重要的样本)。

存在第三种方法:加权数据。因此,您对代表性不足的班级给予了更多的重视。它允许您使用所有数据并避免更改方差。

您可以尝试等渗回归,而不是执行 sigmoid/Platt 回归,如下所述:https ://scikit-learn.org/stable/modules/calibration.html#isotonic 我在等渗回归中获得了更好的结果,通过它我的意思是校准模型跨越了整个概率范围并且更接近线性关系。

我引用的文章还描述了CalibratedClassifierCV可用于使用 sigmoid 和等渗回归量执行校准的文章。