过度拟合 - 如何检测并减少它?

数据挖掘 r 交叉验证 阶级失衡 过拟合
2021-10-07 11:47:42

我有一个附带项目,我正在使用 R 进行信用评分(训练数据的样本大小约为 16k,测试数据的样本大小约为 4k,还有另外两个 20k 数据批次用于超时验证),类别不平衡(BAD 的 3.5%)客户类型)。

我正在尝试制作各种模型以拥有足够的模型来制作合奏,但为此,让我们专注于其中一个,尤其是 XGBoost。

我阅读了很多关于如何解决过度拟合的文章,但我还没有找到任何关于如何在实践中一步一步地做到这一点的好资料。至于现在,我的两个最好的模型有:

  1. 训练数据的 AUC 为 0.8,保留集的 AUC 约为 0.799,超时批次的 AUC 约为 0.7355 和 0.7195。

  2. 训练时为 0.764 AUC,保持测试集上为 0.7785 AUC,两个超时批次上为 0.7285 AUC。

我担心的是超时批次的下降,因为我认为 0.05-0.08 下降是巨大的,这可能表明我所做的模型确实过度拟合并且不能很好地概括。澄清一下,当我调整模型时,我不知道那些过时的分数。

谁能分享一下检测过拟合的最佳实践是什么?这两个模型是否过度拟合,或者我只是恐慌,而这种性能下降是正常的?

我目前的管道一般看起来像这样:

  1. 数据清理

  2. 使用 xgboost 包从所有 2400 个可用功能中获取最佳 300 个功能的功能重要性。

  3. 移除高度相关的特征(0.75 截止值) - 剩下 123 个特征

  4. 训练/测试拆分 - 0.8 对 0.2 加上两个超时批次

  5. 使用嵌套 CV(外部 5 倍 CV)和内部循环中的超参数调整(内部 5 倍 CV)进行模型选择——所有这些都在 MLR 包中完成。

  6. 从我从嵌套 CV 获得的 5 个模型中,我选择了表现最好的一个(在训练和保持测试集中具有最接近的 AUC)

然后当我对模型感到满意时,我对过期模型进行了测试。

我如何以一种可以检测到过度拟合的方式改进我的管道?是否有任何步骤列表可以大致涵盖可以采取哪些措施来减少它?

另外,在高度不平衡的情况下,选择一个好的验证集意味着我只需要注意目标变量的正确分布吗?我也应该照顾其他事情吗?

1个回答

在选择验证集和测试集时,重要的是它反映了问题的实际“生产环境”。由于您有“超时”验证集,我假设您的数据中有一些时间结构,您在进行预测时需要解决这些时间结构。如果您正在开发您的模型,而不考虑这个时间方面,那么当这个模型被放入一个真实的环境中时,您可能会遇到问题,因为这些模型适合一个时间无关紧要的不切实际的场景。

从您在此处显示的分数来看,训练和测试分数非常相似,但在“超时”设置中下降。这可能表明您在开发模型时没有足够重视时间维度。

另一点:也完全有可能过度拟合您的验证集,就像您的情况一样,您有很多变量。由于这些变量的某些组合可能随机适合您的训练和验证集,因此您的测试集可能并非如此。我之前的观点也放大了这种影响,其中数据生成过程在时间上并不是真正静止的。

这是一篇关于如何选择好的验证集的好文章: https ://www.fast.ai/2017/11/13/validation-sets/