贝叶斯结构时间序列模型:时间序列分析实战

利用贝叶斯结构时间序列模型进行时间序列分析,结合案例讲解了模型搭建、参数估计和预测过程。

原文标题:时间序列分析实战:最强悍时序建模-贝叶斯模型

原文作者:数据派THU

冷月清谈:

本文介绍了贝叶斯结构时间序列(BSTS)模型及其在时间序列分析中的应用。BSTS模型构建在卡尔曼滤波器的基础上,并扩展了其功能,允许用户使用模块化组件构建更复杂的模型。

模型的拟合过程包含四个步骤:定义结构模型并指定先验、使用卡尔曼滤波器更新状态估计、采用钉板法进行变量选择以及使用贝叶斯模型平均法组合结果。

文章以OpenEI的开放数据集和谷歌开发的bsts工具包为例,演示了如何使用BSTS模型进行时间序列分析。示例中,模型考虑了数据的每日和每周规律性,并使用局部线性趋势来描述数据的趋势。代码部分展示了如何使用bsts工具包进行建模和预测。

最后,文章还提到了BSTS模型的其他一些高级选项,例如指定非标准先验、使用钉板法进行变量选择以及使用贝叶斯模型平均法。这些选项可以通过bsts工具包轻松实现,为用户提供了更大的灵活性。

怜星夜思:

1、文章中提到贝叶斯结构时间序列模型计算量较大,那么在实际应用中,如何选择合适的计算资源来保证模型的效率?
2、文章提到的“钉板法”在变量选择中有什么优势?与其他变量选择方法相比,有什么特点?
3、文章示例中使用了小时级的数据,如果数据粒度更细,例如分钟级或秒级,BSTS模型是否仍然适用?需要注意哪些问题?

原文内容

图片
来源:菜J数据分析

本文约1600字,建议阅读5分钟

本文为你介绍“贝叶斯模型”。


一、概述


贝叶斯结构时间序列(Bayesian structural time series,BSTS) 与我们之前通过卡尔曼波器使用过的线性高斯模型有关。二者的主要区别在于,贝叶斯结构时间序列提供了一种方法,可以使用已有的组件来构建更复杂的模型。这些模型可以反映已知事实或关于系统的有趣假设。然后,我们可以设计结构,使用稳健的拟合技术,结合我们手上的数据,估计所建模型的参数,并查看该模型能否很好地描述和预测系统的行为。与我们在讨论卡尔曼滤波器时谈到的线性高斯模型相比,贝叶斯结构时间序列模型的数学运算更复杂,并且计算量也更大。出于这个原因,我们仍遵循先概述后编码的顺序。


要拟合贝叶斯结构时间序列模型,需要按照以下顺序执行 4 个步骤:


1.定义一个结构模型,其中包括先验规范;

2. 根据观测数据,应用卡尔曼滤波器更新状态的估计值;

3.采用钉板法(spike-and-slab method) 对结构模型进行变量选择;

4.出于生成预测结果的目的,使用贝叶斯模型平均法将结果组合到一起。


在下一个示例中,我们将只关注步骤 1 和步骤 2,并用已有的模块化组件定义一个灵活的模型,然后使用该模型来拟合我们的数据。在此期间,我们将使用贝叶斯方法持续更新参数估计值。


二、代码


我们使用 OpenEI的一个开放数据集,以及由谷歌开发的工具包 bsts。bsts 是一个流行且强大的贝叶斯结构时间序列工具包。


我们首先对数据进行可视化,以了解我们要建模的对象,如图 7-8 所示:


图片


查看数据有助于了解如何建模。我们可以看到,数据中存在某种明确的每日规律,甚至可能也存在某种周内规律。这些模式即是我们将在模型中描述的季节性行为。在绘制整个数据集 (图 7-8 中的上图)时,我们还希望考虑数据表现出不稳定行为的趋势。


图片


该模型中的局部线性趋势基于这样的假设:数据趋势的均值和斜率都遵循随机游走的模式。



该模型的季节分量有两个参数:一个表示季节的数量,另一个表示季节的持续时间。在添加的第一个季节分量 (该季节分量反映了一个每日循环) 中,我们希望一天中的每一小时对应一个季节,且每个季节只持续一小时。在添加的第二个季节分量 (该季节分量反映了一个每周循环)中,我们希望一周中的每一天对应一个季节,且每个季节持续 24 小时。


你可能会感到疑惑是否确实要从周一 (假设我们都认为周一是一周的首日)的 00:01开始?需要注意的是,保持一致性比确认一周的首日为周一更重要。在本例的周期性模式中,似乎任何将数据分割成 24 小时的方法都可以用于季节性分析。下面展示代码中计算量最大的部分。bsts 包的优点在于,我们能够进行大量针对后验概率的马尔可夫链蒙特卡罗计算。


图片


我们还可以检查季节分量,比如像下面这样检查周内每日的节分量 (如图 7-9 和图 7-10所示)。




图片



周内每日的季节分量表现出了极强的稳定性,而在图 7-10 的中间子图中,一天内每小时的季节性表现出随时间变化的趋势,这可能与白天的时间变化有关。在图 7-10 中,我们还看到参数与局部线性趋势相吻合,这表明电力需求总体呈下降趋势最后,我们进行预测,并绘制预测结果的后验分布图,如图 7-11 所示。需要注意的是,在建模过程结束之前,我们可以灵活地指定想预测的时间范围。由于数据是小时级的,因此虽然看起来要预测未来 24 个时间范围有些不切实际,但实际上只相当于预测一天的数据我们还希望看到预测上下文之前的 72 个时间范围内的数据,如下所示。


图片


三、拓展


在 bsts 工具包和贝叶斯结构时间序列建模中,有相当多的选项还未用到,举例如下:


(1)我们没有指定非标准先验;

(2)我们没有使用钉板法来选择回归变量;

(3)我们没有使用贝叶斯模型平均法。


这些都可以通过 bsts 工具包来实现,你可以很容易地从文档中找到教程。


对于贝叶斯结构时间序列可以做什么,以上仅展示了冰山一角。以下是贝叶斯结构时间序列的其他一些重要的可用选项。


使用贝叶斯结构时间序列,可以向建模过程注入任何类型的先验。我们在讨论卡尔曼滤波器时涉及的标准线性高斯模型就是一种注入普通先验的方法。此外,贝叶斯结构时间序列还提供了许多其他选项 (比如非对称先验)。你可以对贝叶斯结构时间序列模型进行变量选择贝叶斯结构时间序列模型可以通过贝叶斯模型平均法进行组合,这有助于消除最初选择模型所带来的不确定性。


尽管我们没有在当前的建模示例中使用这些选项,但利用 bsts 工具包在建模过程中使用这些选项并不难。你可以在网上找到许多示例。


编辑:于腾凯

校对:林亦霖

理论上BSTS模型可以处理更细粒度的数据,但实际应用中需要考虑计算成本和数据噪声的问题。粒度越细,数据量越大,计算量也会呈指数级增长。此外,细粒度数据中可能包含更多噪声,需要进行更精细的预处理和模型调整。

我觉得可以尝试,但要做好心理准备,可能需要更强的计算资源和更长的训练时间。另外,模型的参数也需要重新调整,可能需要更复杂的季节性组件来捕捉数据中的周期性模式。

除了计算和噪声问题,还要考虑数据中是否存在过度拟合的风险。粒度越细,模型越容易捕捉到一些细微的波动,但这未必是真正的规律,可能是随机噪声造成的。所以,需要谨慎选择模型的复杂度,避免过度拟合。

这个问题问得好!计算资源的选择确实很重要。除了硬件配置(CPU、内存、GPU)外,还要考虑并行计算的可能性。bsts包本身支持并行化,可以充分利用多核CPU。另外,云计算平台也是一个不错的选择,可以根据需求动态调整计算资源。

我理解的钉板法有点像开关,要么开要么关,干脆利落。其他方法像调节旋钮,可以精细调节,但有时候反而不好判断哪些变量该彻底剔除。

我觉得可以根据数据的规模和模型的复杂度来选择。数据量小、模型简单的情况下,普通电脑就足够了。但如果数据量很大或者模型很复杂,就需要考虑使用高性能服务器或者云计算平台了,不然训练时间会非常长,甚至可能跑不动。

“钉板法” 其实更适合处理稀疏数据,它假设变量的系数要么是零,要么是非零。这种方法可以有效地识别出对模型真正重要的变量,避免过度拟合。相比之下,像LASSO或者Ridge回归这种基于惩罚项的方法,虽然也能进行变量选择,但它们对系数的收缩是连续的,不太容易直接得到哪些变量是重要的。

从贝叶斯角度看,“钉板法”更符合变量选择的思想。它通过引入先验分布来控制变量的系数,可以直接估计出变量的 Inclusion Probability,从而更清晰地判断变量的重要性。

除了楼上两位说的,还可以考虑算法层面的优化。比如,选择更高效的采样方法或者优化模型结构,都能在一定程度上减少计算量。当然,这需要对贝叶斯方法和时间序列分析有一定的了解。