【问题标题】:Why is my logistic regression model predicting 0s only? /small sample size?为什么我的逻辑回归模型只预测 0? /小样本量?
【发布时间】:2019-10-01 16:03:49
【问题描述】:

我正在使用 Python 中的逻辑回归构建客户流失预测模型。我的模型精度为 0.47,仅预测 0。实现的 y 变量实际上是 81 个 0 和 92 个 1。

我拥有的数据集只有几个特征和 220 个用户(记录)。如果我设置一个参考时间,那就更少了(大约 123 条记录用于训练集,173 条用于测试集)。所以我认为样本量太小,无法使用逻辑回归。但我还是尝试了,因为这只是一个样本测试,所以我只得到了这个小数据集。 (理论上数据比较多)

from sklearn.linear_model import LogisticRegression

logreg = LogisticRegression()
logreg.fit(x_train, y_train)

y_pred = logreg.predict(x_test)
print('Accuracy: {:.2f}'.format(logreg.score(x_test, y_test)))

即使我不测试模型,这意味着我使用整个数据集来构建模型,当我预测未来的流失时,它仍然只返回 0。 是我的样本量太小,还是因为精度小于 0.5 所以它只返回一个值(这里是 0)?还是我在代码中做错了什么?

非常感谢!

【问题讨论】:

  • 可能是各种各样的东西。绘制数据。这些类在预测空间中实际上是可分离的吗?训练集是否代表测试集?
  • 如何拆分成train和test?你确定训练集中有 0 和 1 吗?
  • 我使用了一个参考时间 A。在 A 之前它进入了训练集。在定义流失的 A+ 天之前,它会进入测试集。在当前时间之前,它用于预测。是的,在训练集中有 1 和 0。

标签: python logistic-regression


【解决方案1】:

逻辑回归模型的预测存在严重偏差的潜在原因有多种。为了告知普通观众,我将列出最常见的一些,即使其中一些不适用于您的案例。

  1. 偏斜的输出分布)您的训练数据有偏差、不平衡的标签分布。例如,如果您的训练包含 1 个正数和 100000 个负数,则回归中的偏差/截距项将非常小。应用链接函数后,预测实际上可以为零。

  2. (稀疏度) 特征空间大而您的数据集小,导致训练数据稀疏。因此,大多数新传入的数据点实例以前都没有见过。在更坏的情况下,所有特征都是因子,看不见的因子值会导致零,因为无法识别正确的 one-hot 列。

  3. 偏斜的输入分布)特征空间很小,您的数据集在一个小区域周围很密集。如果事实证明在那个区域有更多的零,即使对于未来的输入实例,预测也总是为零。例如,我的数据 X 有两列,性别和年龄。事实证明,在 101 个数据点数据集中,我的大部分数据点是 30 岁男性,100 名 30 岁男性中有 80 人喜欢冰淇淋。该模型将预测 30 岁男性喜欢冰淇淋的未来输入,这通常适用于假设类似输入分布的 30 岁男性。

您应该使用predict_proba 函数检查分数的分布,并使用pairplot 之类的函数检查输入特征的分布。

【讨论】:

  • 你是对的!!我的情况是 3 号。我进一步添加了一些功能,现在它预测得很好!非常感谢您的帮助!
猜你喜欢
  • 2021-05-12
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2016-07-26
  • 2020-03-25
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
相关资源
最近更新 更多