生产环境如何选择验证集?

数据挖掘 时间序列 回归 xgboost
2022-03-01 08:40:11

我正在使用 XGBoost 来解决时间序列回归问题。

在开发过程中,我在最后 %10% 的数据上选择了我的验证集。使用时间序列拆分交叉验证和网格搜索,我得到了我最好的模型和相应的 xgb 超参数。

我的问题是,如何在我的生产环境中选择验证集(提前停止)?

1) 我选择了最后 %10% 的数据作为验证集,但该集也包含在训练数据中。因此过拟合。对噪声数据非常敏感。

2)我的预测数据(假设是 Y)随时间而变化,当我在去年选择随机行(%10 数量)并且不将它们包含在训练集中时,它给我的生产结果比第一个选项更差。

3)当我选择上周的数据作为验证数据时,不包含在训练集中,它在 2. 选项上给出了更好的结果。但我没有将上周的数据纳入培训程序。

4) 或者我需要在我的生产环境中设置验证集吗?我应该从开发阶段完成的实验中设置迭代次数吗?(例如,我在第 10k 次迭代中获得了最佳结果,所以我应该将我的生产设置迭代次数限制为 10k,而不使用验证集?)

--

那么,如何为我的生产环境选择验证集?最佳实践,或者有任何提示/技巧吗?

1个回答

如果您只是定期重新训练 XGBoost 模型以考虑数据的变化性质,那么最好的选择是保留一组最近的数据进行测试(您的选项 3 的一些变体)。

正如您所提到的,选项 1 - 即在整个可用集上进行训练并在最近 10% 的数据上进行验证,很可能会过度拟合(因此高估了其在未来数据上的表现)。

选项 2 的缺点是您试图预测您拥有事后(事后)信息的信息,也就是说,您知道后续观察值是什么,这与时间序列预测非常相关。例如,如果您尝试预测明天的值是多少,并且您已经知道后天的值是多少,那么您可以更好地预测明天。不幸的是,在后天开始之前,您永远无法知道这一点。

因此,选项 3 是确定模型准确预测未来观察的可能性的最有价值的做法——您仅使用从预测点(相对于预测期间的过去)可获得的数据并持有模型训练集中的数据。

在这些情况下,最好的做法是让自己对“不作弊”负责——也就是说,尽你最大的努力提供一个公平和诚实的实验来预测你的模型对它没有见过的数据的预测,并且可以在上下文中使用未来的使用情况。