逻辑回归预测所有 1,没有 0

机器算法验证 回归 物流 预测模型 不平衡类 计分规则
2022-03-15 06:31:09

我正在使用逻辑回归和随机森林对贷款违约概率进行分析。

当我使用逻辑回归时,预测始终为“1”(这意味着良好的贷款)。我以前从未见过这种情况,也不知道从哪里开始尝试解决问题。有 22 列,600K 行。当我减少列数时,我得到与逻辑回归相同的结果。

为什么逻辑回归会如此错误?

**Actual from the data**

0 :   41932

1 :   573426

**Logistic regression output** 

prediction for 1 when actually 0: 41932
prediction for 1 when actually 1:573426

A**s you can see, it always predicts a 1**


**Random forests does better:**

actual 0, pred 0 : 38800 
actual 1, pred 0 : 27 
actual 0, pred 1 : 3132
actual 1, pred 1 : 573399
4个回答

简短的回答是逻辑回归用于估计概率,不多也不少。无论有多不平衡,您都可以估计概率。ROC 曲线和讨论中给出的其他一些措施没有帮助。如果您需要做出决定或采取行动,您可以将损失/效用/成本函数应用于预测风险,并选择优化预期效用的行动。似乎很多机器学习用户并没有真正了解风险和最佳决策。Y

嗯,你的模型总是预测是有道理的 1. 看看你的数据集:它严重不平衡,有利于你的正类。负类仅占数据的约 7%。尝试重新平衡您的训练集或使用成本敏感算法。

如果问题确实是类之间的不平衡,我会简单地从平衡类权重开始:

log_reg = LogisticRegression(class_weight = 'balanced')

这个参数设置意味着损失函数中错误预测的惩罚将与类的频率成反比加权。这可以解决你描述的问题。

当您使用 logit 进行分类时,会发生这种情况。

logit 预测贷款的违约概率 (PD),它是一个介于 0 和 1 之间的数字。接下来,您设置阈值 D,如果 PD>D,则将贷款标记为违约,并将其标记为非默认如果 PD

自然,在典型的贷款人群中,PD<<1。因此,在您的情况下,7% 是一年数据的相当高的概率(PD 通常按年度报告)。如果这是多年数据,那么我们谈论的是所谓的累积 PD,例如,在这种情况下 cumPD=7% 对于 10 年的数据来说并不是一个高数字。因此,按照任何标准,我都不会说您的数据集有问题。我会描述它至少是典型的贷款违约数据,如果不是很好(从某种意义上说,你有相对大量的违约)。

现在,假设您的模型预测以下三个 PD 水平:

  • 0.1 (563,426)
  • 0.5 (20,000)
  • 0.9 (31,932)

还假设这些组的实际默认值是:

  • 0
  • 10,000
  • 31,932

现在您可以将 D 设置为不同的值并查看矩阵如何变化。让我们首先使用 D = 0.4:

  • 实际默认,预测非默认:0
  • 实际违约,预测违约:41,932
  • 实际非违约,预测非违约:563,426
  • 实际非违约,预测违约:10,000

如果设置 D = 0.6:

  • 实际违约,预测非违约:31,932
  • 实际违约,预测违约:10,000
  • 实际非违约,预测非违约:573,426
  • 实际非默认,预测默认:0

如果设置 D = 0.99:

  • 实际违约,预测非违约:41,932
  • 实际默认,预测默认:0
  • 实际非违约,预测非违约:573,426
  • 实际非默认,预测默认:0

最后一种情况是您在模型结果中看到的情况。在这种情况下,我强调分类器的阈值 D。D 中的一个简单变化可能会改善您预测的某些特征。请注意,在所有三种情况下,预测的 PD 保持不变,只有阈值 D 发生了变化。

当然,您的 logit 回归本身也可能很糟糕。因此,在这种情况下,您至少有两个变量:logit 规范和阈值。两者都会影响您的预测能力。