对(线性回归)预测的调整

机器算法验证 回归 预测 调整
2022-03-13 11:34:46

完全披露:我不是统计学家,也不声称自己是统计学家。我是一名卑微的 IT 管理员。请对我温柔一点。:)

我负责收集和预测我们企业的磁盘存储使用情况。我们每月收集我们的存储使用情况,并使用简单的滚动十二个月线性回归进行预测(换句话说,在进行预测时只考虑前十二个月的数据)。我们将此信息用于分配和资本支出计划,例如“基于此模型,如果存储在 y 个月内,我们将需要购买 x 数量以满足我们的需求。” 这一切都足以满足我们的需求。

周期性地,我们的数字会出现较大的一次性变动,这会导致预测失败。例如,有人发现不再需要的 500GB 旧备份并将其删除。对他们回收空间有好处!然而,我们的预测现在因一个月内的大幅下跌而偏离了方向。我们一直只是接受这样的下降需要 9-10 个月才能从模型中消失,但如果我们正在进入资本支出计划季节,那可能会很长。

我想知道是否有一种方法可以处理这些一次性差异,以使预测值不会受到太大影响(例如,线的斜率不会发生太大变化),但是会考虑到它们(例如与特定时间点相关的 y 值的一次性变化)。我们解决这个问题的第一次尝试产生了一些丑陋的结果(例如指数增长曲线)。如果这很重要,我们会在 SQL Server 中进行所有处理。

3个回答

这是一个简单的建议。我不知道它是否适合你,也许我应该把它作为评论,但似乎你需要更多的权限来发表评论而不是回复。

如果我理解正确,您使用的数字是您每月使用的存储量。可能这些通常会增加,如果趋势继续,您想预测未来某个时间的数量。一旦您意识到您的重大变化已经发生(例如,已释放 500 GB),您是否可以返回并更改前几个月的数据(例如,从所有数据中删除 500 GB)?基本上你要做的就是将前几个月的数字调整到它们应该是的,如果你知道你现在知道的。

当然我不推荐这个,除非你确保你可以回到旧的数字。但是您想做的预测听起来甚至可以在 Excel 中完成,在这种情况下,您可以拥有任意多个版本。

您正在查看的是异常值。如果您有理由相信异常值不代表您的数据,您可以删除它们。在经过验证的环境中,您必须调查每一个并证明它们的合理性,但在您的情况下,您可能只是删除它们。

如果您希望自动找到这些数据点,请查看 Cook's Distance,它分析残差并可以对拒绝标准进行数学确定(通常为 4/n,在您的情况下 n 为 12)

另一个建议是开放你的数据的数据范围,你能看两年,还是说旧的数据完全不相关?这当然会减少一两个异常值的影响,并且也为诸如库克距离之类的分析方法提供了更多的力量。

现在棘手的事情可能是抵消 - 因此,如果该异常值导致整条线跳下,即使存在总体上升趋势,也会导致回归面朝下。为了防止这种情况,您可以绘制硬盘空间的变化。去除异常值去除了虚假数据点,您可以看到硬盘空间变化的整体趋势,从而得出更准确的结论。

以下是我对您的情况的理解:您有一个预测,一个您每月评估的回归模型,您的“y”个月的存储需求,它使用当前月份的上一年数据。有时,有人删除了一大块数据,突然间,直线的斜率与通常的预测相比发生了巨大变化。斜率的这种变化会影响资本支出计划,无论该点在模型中运行需要多长时间。

你拒绝丢弃数据是恰当的。你有先验的决定。如何定义和处理异常值。可以根据业务和/或统计定义定义异常值。我将假设您关注的异常值只是“显而易见的”。

一旦发现,我们会调查异常值,看看它们是否是从真实的数据生成过程中生成的,然后我们根据我们先验决定的程序处理它们。这些过程可以是从数据的一个或两个边缘“修剪”一定百分比的数据点,替换值,控制特定异常值,更改模型以使其使用不同的底层分布,或更改模型所以它使用不同的集中趋势。

假设异常值相对不常见,在调查异常值后处理它们的一种方法是将它们作为预测变量添加到模型中。每个异常值都有一个完整的预测变量。预测器将是一个单独的列,它将为异常值的数据点预测一个,否则为零。一旦受到控制,它们将不再拉动模型的斜率。这个过程有几个优点,一个是没有数据被丢弃或更改为其他值。

一些缺点包括花费额外的时间对异常值进行建模,并且随着异常值列在建模年份窗口中移动,每个月都必须重新指定模型。但是,任何带有异常值的操作都需要额外的建模时间,这是清理数据的必要步骤。另外,如果我理解正确的话,无论如何,您每个月都会重新指定预测。

Example Regression formula:
    memory_capital = ... + mem_usage_nov + mem_usage_dec + outlier_column1_dec + ...