https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTgt0NUSI4XRMmdwEcHpoRn48ztLYahIAk3hJnkI6hGvZ9TzF_2rBWyUa0IYCMh4-aQmCfYk33-NwdmJVSsP0b1GigkURxAanDQNzjwIo2rsHpx_BL7kmAvj1efWc9m__ldbvJlAj08SA/s1600/STS+model.png
Dave Moore、Jacob Burnim 和 TFP 团队发布
在这篇文章中,我们将介绍
tfp.sts
,这是
TensorFlow Probability 中的一个新库,用于使用结构化时间序列模型 [3] 对时间序列进行预测。
概述
“预测很难,尤其是关于未来的预测。”
— 卡尔·克里斯蒂安·斯坦克
尽管对未来事件的预测必然不确定,但预测是未来计划的关键部分。网站所有者需要预测网站访问量,以便提供足够的硬件资源,并预测未来的收入和成本。企业需要预测消费者产品的未来需求,以维持足够的库存。电力公司需要预测电力需求,以便明智地购买能源合同并建设新的发电厂。
用于预测时间序列的方法也可以应用于推断功能发布或其他干预对用户参与指标的因果影响 [1],从更容易获得的信息中推断难以观察的量(如失业率)的当前值 [2],以及检测时间序列数据中的异常情况。
结构化时间序列
结构化时间序列 (STS) 模型 [3] 是一系列时间序列概率模型,它包括并概括了许多标准时间序列建模思想,包括
- 自回归过程,
- 移动平均,
- 局部线性趋势,
- 季节性,以及
- 对外部协变量(可能与目标序列相关的其他时间序列)进行回归和变量选择。
STS 模型将观察到的时间序列表示为更简单成分的总和
各个成分都是受特定结构假设支配的时间序列。例如,一个成分可能编码季节性影响(例如,星期几的影响),另一个成分编码局部线性趋势,另一个成分编码对一组协变量时间序列的线性依赖。
通过允许建模者对生成数据的过程进行编码假设,结构化时间序列通常可以从相对少量的数据中产生合理的预测(例如,只有包含数十个点的单个输入序列)。模型的假设是可解释的,我们可以通过将过去数据和未来预测分解成结构化成分来可视化这些预测。此外,结构化时间序列模型使用概率公式,可以自然地处理缺失数据并提供对不确定性的原则性量化。
TensorFlow Probability 中的结构化时间序列
TensorFlow Probability (TFP) 现在具有内置支持,可以使用结构化时间序列模型进行拟合和预测。这种支持包括使用变分推断 (VI) 和哈密顿蒙特卡罗 (HMC) 进行模型参数的贝叶斯推断,计算点预测和预测不确定性。由于它们是在 TensorFlow 中构建的,因此这些方法自然地利用了向量化硬件(GPU 和 TPU),可以有效地并行处理多个时间序列,并且可以与深度神经网络集成。
示例:预测 CO2 浓度
要查看结构化时间序列的实际应用,请考虑来自夏威夷莫纳罗亚天文台的这种月度大气 CO2 浓度记录 [5]
通过观察可以清楚地看到,该序列包含长期趋势和年度季节性变化。我们可以使用 TFP 代码中的几行直接在结构化时间序列模型中编码这两个成分
import tensorflow_probability as tfp
trend = tfp.sts.LocalLinearTrend(observed_time_series=co2_by_month)
seasonal = tfp.sts.Seasonal(
num_seasons=12, observed_time_series=co2_by_month)
model = tfp.sts.Sum([trend, seasonal], observed_time_series=co2_by_month)
这里我们使用了局部线性趋势模型,该模型假设趋势是线性的,并且斜率随时间缓慢变化,遵循随机游走。将模型拟合到数据会产生基于我们的建模假设的概率预测
我们可以看到,预测不确定性(± 2 个标准差阴影)随时间推移而增加,因为线性趋势模型对其斜率外推的信心降低。平均预测结合了季节性变化和现有趋势的线性外推,这似乎略微低估了大气 CO2 的加速增长,但真实值仍在 95% 的预测区间内。
该
示例的完整代码 可以在 Github 上找到。
示例:预测电力需求
接下来,我们将考虑一个更复杂的示例:预测澳大利亚维多利亚州的电力需求。该图的顶行显示了 2014 年前六周的每小时记录(来自 [4] 的数据,可在
https://github.com/robjhyndman/fpp2-package 获取)
这里我们可以访问外部信息来源:温度,它与空调的电力需求相关。请记住,1 月份是澳大利亚的夏季!让我们将这些温度数据纳入 STS 模型中,该模型可以通过线性回归包含外部协变量
temperature_effect = tfp.sts.LinearRegression(
design_matrix=tf.reshape(temperature - np.mean(temperature),
(-1, 1)), name='temperature_effect')
hour_of_day_effect = tfp.sts.Seasonal(
num_seasons=24,
observed_time_series=demand,
name='hour_of_day_effect')
day_of_week_effect = tfp.sts.Seasonal(
num_seasons=7,
num_steps_per_season=24,
observed_time_series=demand,
name='day_of_week_effect')
residual_level = tfp.sts.Autoregressive(
order=1,
observed_time_series=demand, name='residual')
model = tfp.sts.Sum([temperature_effect,
hour_of_day_effect,
day_of_week_effect,
residual_level],
observed_time_series=demand)
请注意,我们还包含了多个季节性影响:一天中的时间、一周中的日期和一个自回归成分,以对任何无法解释的残余影响进行建模。我们本可以使用简单的随机游走,但选择了自回归成分,因为它随着时间的推移保持有界方差。
该模型的预测并不完美 - 显然仍然存在一些未建模的变化来源 - 但它并不疯狂,而且预测不确定性看起来也很合理。我们可以通过可视化分解成成分来更好地理解这种预测(请注意,每个成分图的 y 轴比例不同)
我们看到,该模型合理地识别出了巨大的时间影响和较小的日期影响(需求最低似乎出现在周六和周日),以及温度的巨大影响,并且它对这些影响产生了相对自信的预测。大部分预测不确定性来自自回归过程,基于它对观察到的序列中未建模(残差)变化的估计。
建模者可以使用这种分解来了解如何改进模型。例如,他们可能会注意到,一些温度峰值似乎仍然与 AR 残差中的峰值相吻合,这表明可能需要额外的特征或数据转换来更好地捕获温度影响。
该
示例的完整代码 可以在 Github 上找到。
TensorFlow Probability STS 库
如上面的示例所示,TFP 中的 STS 模型是通过将模型组件加在一起构建的。STS 提供了建模组件,例如
- 自回归、局部线性趋势、半局部线性趋势 和 局部水平。用于对具有根据随机游走或其他过程演变的水平或斜率的时间序列进行建模。
- 季节性。对于依赖季节性因素的时间序列,例如一天中的时间、一周中的日期或一年中的月份。
- 线性回归。对于依赖附加时间变化协变量的时间序列。回归组件也可以用于编码假日或其他特定日期的影响。
STS 提供了使用
变分推断 和
哈密顿蒙特卡罗 拟合结果时间序列模型的方法。
在
TFP 主页 上查看我们的代码、文档和更多示例。
结构化时间序列正在 Google 内部用于多个重要的时间序列应用。我们希望您也会发现它们有用。请加入
[email protected] 论坛,了解最新的 Tensorflow Probability 公告和其他 TFP 讨论!
参考文献
[1] Brodersen, K. H., Gallusser, F., Koehler, J., Remy, N., & Scott, S. L. (2015)。使用贝叶斯结构化时间序列模型推断因果影响。
应用统计年鉴, 9(1), 247–274。
[2] Choi, H., & Varian, H. (2012)。使用 Google 趋势预测现在。经济记录, 88, 2–9。
[3] Harvey, A. C. (1989)。
预测、结构化时间序列模型和卡尔曼滤波器。剑桥大学出版社。
[4] Hyndman, R.J., & Athanasopoulos, G. (2018)。预测:原理与实践,第二版,OTexts:澳大利亚墨尔本。OTexts.com/fpp2。于 2019 年 2 月 23 日访问。
[5] Keeling, C. D., Piper, S. C., Bacastow, R. B., Wahlen, M., Whorf, T. P., Heimann, M., & Meijer, H. A. (2001)。大气 CO2 和 13CO2 与陆地生物圈和海洋的交换,1978 年至 2000 年。I. 全球方面,SIO 参考系列,№01-06,斯克里普斯海洋研究所,圣地亚哥。