我怀疑原因是您的测试集中的班级平衡与您的训练集中的班级平衡不同。那会把一切都扔掉。统计机器学习方法(包括逻辑回归)所做的基本假设是测试集中数据的分布与训练集中的数据分布相匹配。SMOTE 可以摆脱它。
听起来您已经使用 SMOTE 通过添加额外的合成正面实例(即过采样少数类)来增加训练集——但您没有添加任何负面实例。因此,训练集中的类平衡可能已经从 0.5%/99.5% 转变为(比如说)10%/90%,而测试集中的类平衡仍然是 0.5%/99.5%。那很糟; 它将导致分类器过度预测正实例。对于某些分类器来说,这不是主要问题,但我预计逻辑回归可能对训练分布和测试分布之间的这种不匹配更敏感。
以下是您可以尝试的问题的两个候选解决方案:
停止使用 SMOTE。确保训练集与测试集具有相同的分布。在您的情况下,SMOTE 实际上可能是不必要的。
继续使用 SMOTE 扩充训练集,并通过移动分类阈值来补偿训练/测试不匹配。逻辑回归产生特定实例来自正类的估计概率。通常,您随后将该概率与阈值 0.5 进行比较,并使用该概率将其分类为正面或负面。您可以调整阈值以纠正该问题:替换0.5 和 0.5/k, 在哪里 k 是增强后训练集中正数与增强前正数的比率(例如,如果增强将训练集从 0.5%/99.5% 转移到 10%/90%,那么 k=10/0.5=20); 或者您可以使用交叉验证来找到最大化 F1 分数(或其他一些指标)的合适阈值。
顺便说一句,我建议您确保在逻辑回归模型中使用正则化,并使用交叉验证来选择正则化超参数。如果您的训练集中有 120K 实例,则 15K 特征没有任何问题,但您可能希望对其进行强正则化(选择较大的正则化参数)以避免过度拟合。
最后,要明白处理像你这样严重的阶级不平衡是很困难的。幸运的是,有许多可用的技术。做一些阅读和研究(包括在 Stats.SE 上),如果这些方法效果不佳,您应该能够找到可以尝试的其他方法。