当您的训练和测试数据具有不同分布时该怎么办

机器算法验证 回归 机器学习 助推 梯度下降
2022-04-09 14:02:37

我正在训练一个 XGBoost 回归模型来预测应用程序的数量,并且训练和测试数据集中目标变量的范围是不同的。例如:

  • 在训练数据中:最少应用程序 = 40 最多应用程序 = 1500
  • 在测试数据中:最少应用程序 = 400 最多应用程序 = 600

显然,测试和训练数据集的标准差也不同

因此,模型在预测值时会变得混乱。关于我应该如何解决这个问题的任何建议?

2个回答

从您要预测的人群中收集数据,并使用该数据来训练您的模型。这是最好的方法。

或者,深入思考如何对您的预测进行后处理(从基于群体 A 的样本训练的模型)以应用于群体 B。如何做到这一点取决于您的主题。根据您提供的信息,最简单的方法是将仿射线性变换应用于您的预测,将区间映射到[40,1500][400,600]

鉴于您已经有了模型,像这样的简单方法可能比从新人群中收集新数据更便宜、更快,因此尝试它并考虑您是否真的希望新模型能够足以更好地证明新数据收集的额外费用是合理的。

就像我在评论中所说的那样,我不一定看到响应范围的变化是一个问题。特别是,在你的情况下,我认为这是一个红鲱鱼。

首先,重要的是要问,测试集是否应该与训练集具有相同的响应范围?在许多情况下,情况并非如此,我不知道为什么这必然会出现问题如果目标是预测每日高温,很容易想象一个数据集,其中在多年的火车组中观察到 0-100F 的温度范围,而在测试组中仅观察到 40-60F 范围内的温度这对应于一个月。如果我们创建了一个准确预测温度的模型,我们仍然应该期望它在这个测试集上表现良好,假设我们首先有一个好的模型。

一些例外情况包括

  1. 如果预测变量和响应之间的关系发生变化(概念漂移)。

  2. 如果数据的域偏离了训练数据的域(适用域)。在这种情况下,您的模型必须外推到它从未见过的区域。(参见Applied Predictive Modeling pg 535)在这个例子中,我们对预测变量的范围一无所知,但测试集的响应范围显然在我们在训练集中看到的响应范围内。

如果目标是估计模型在应用时的性能,那么根据时间拆分训练集和测试集并评估未来几个月的性能是有意义的。如果与响应分布的变化有关的性能损失很小,那么这是正常的,并且是您想要估计的一部分。话虽如此,最好使用时间序列交叉验证在更长的时间内或多个一个月的时间段内评估模型(请参阅预测:原则和实践,第 3.4 节)。也就是说,除非你只关心它在 2 月的表现,特别是。

如果我不得不猜测,您没有获得可接受的性能的原因与响应范围无关。一个,更有可能的是,cuplrit 是省略了变量偏差。特别是,covid 的影响很可能在起作用,应该以某种方式加以考虑(参见@Sycorax 的评论)。此外,在不知道其他任何事情的情况下,我可能会想象“应用程序”的数量具有一定的季节性。这两个因素都会使分析复杂化,尤其是当您没有太多数据时。