在 TensorFlow Probability 中对结构时间序列建模
文 / Dave Moore、Jacob Burnim 和 TFP 团队
在本文中,我们会介绍 tfp.sts,它是 TensorFlow Probability 中的一种新代码库,用于使用结构时间序列模型预测时间序列 [3]。
概览
“做出预测很难,对未来进行预测难上加难。”
— Karl Kristian Steincke
虽然对未来事件进行预测必然存在不确定性,但是预测却是制定未来计划的关键环节。网站所有者需要预测网站的访问者数量,以确保提供足够的硬件资源,并预测未来的收益和成本。企业需要预测消费类商品的未来需求,以维持充足的产品库存。电力公司需要预测电力需求,以便制定明智的能源采购合同和建设新的发电厂。
此外,时间序列预测方法也可用于推断功能发布或对用户参与度指标进行其他干预所造成的影响 [1],根据现成信息推断失业率等难以观测的数量的当前值 [2],以及检测时间序列数据中的异常。
结构时间序列
结构时间序列 (STS) 模型 [3] 是一系列时间序列概率模型,其中引入并泛化了许多标准时间序列建模思想,包括:
自回归过程
移动平均法
局部线性趋势
季节性,以及
外部协变量(可能与感兴趣的序列相关的其他时间序列)的回归和变量选择
STS 模型将观察到的时间序列表示为基本成分的总和:
各个成分是指每个受特定结构性假设支配的时间序列。例如,某个成分可能会对季节性影响(例如,周内效应)进行编码,另一个成分可能对局部线性趋势进行编码,而再一个成分可能对某组协变量时间序列上的线性相关性进行编码。
结构时间序列通常可以通过协助建模者对有关数据生成过程的假设进行编码,从相对较少的数据(例如,仅包含数十个点的单个输入序列)中产生合理的预测。我们可以对模型的假设作出解释,而且我们可以通过将对历史数据和未来预测的分解形象地转换为结构成分来对预测作出解释。此外,结构时间序列模型使用概率公式,可轻松地处理缺失数据,并根据规则对不确定性进行量化。
TensorFlow Probability 中的结构时间序列
TensorFlow Probability (TFP) 现在可为使用结构时间序列模型进行拟合和预测提供内置支持。此支持包括使用变分推理 (VI) 和汉密尔顿蒙特卡洛 (HMC) 算法对模型参数执行贝叶斯推理,以计算点预测和预测不确定性。由于是在 TensorFlow 中构建,这些方法顺理成章地利用矢量化硬件(GPU 和 TPU),可以高效并行处理多个时间序列,并且能够与深度神经网络集成。
示例:预测二氧化碳浓度
如要查看实际的结构时间序列,不妨看看这份夏威夷莫纳罗亚天文台的每月大气二氧化碳浓度记录 [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 个标准差)随时间的推移而增加,这是因为线性趋势模型对其斜率外推变得不太自信。平均预测将季节变化与现有趋势的线性外推相结合,这似乎略微低估了大气二氧化碳的加速增长情况,但真实值仍然在 95% 的预测区间内。
您可以在 Github 上查看此示例的 完整代码(https://github.com/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Structural_Time_Series_Modeling_Case_Studies_Atmospheric_CO2_and_Electricity_Demand.ipynb)。
示例:预测电力需求
接下来,我们来看看一个更复杂的示例:预测澳大利亚维多利亚州的电力需求。在下图中,上方的曲线展示 2014 年前六周每小时的记录(数据来自 [4],可以在 https://github.com/robjhyndman/fpp2-package 上查看):
在该示例中,我们可以查看外部信息来源:气温,与空调的电力需求相关。请记住,澳大利亚的一月份属于夏天!我们将这份气温数据合并到 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 上查看此示例的 完整代码(https://github.com/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Structural_Time_Series_Modeling_Case_Studies_Atmospheric_CO2_and_Electricity_Demand.ipynb)。
TensorFlow Probability STS 库
如上例所示,TFP 中的 STS 模型是通过将模型成分添加到一起构建而成。STS 提供的建模成分如下:
Autoregressive、LocalLinearTrend、SemiLocalLinearTread 和 LocalLevel。适用于对其程度或倾斜度随随机游走或其他过程变化的时间序列进行建模
Seasonal。适用于依赖季节因素(例如日内、周内、月份)的时间序列
LinearRegression。适用于依赖附加时变协变量的时间序列。回归成分还可以用于对假日或其他特定日期效应进行编码
STS 提供使用变分推理和汉密尔顿蒙特卡洛对生成的时间序列模型进行拟合的方法。
请在 TFP 主页 上查看我们的代码、文档和更多示例(https://www.tensorflow.org/probability/)。
目前,结构时间序列正被应用到 Google 内的几个重要时间序列应用。我们希望它们也能为您带来帮助。请加入 tfprobability@tensorflow.org 论坛,查看最新的 TensorFlow Probability 公告和其他 TFP 讨论!
参考文献
[1] Brodersen, K. H.,Gallusser, F.,Koehler, J.,Remy, N. 和 Scott, S. L. (2015).使用贝叶斯结构时间序列模型推断因果影响 (Inferring causal impact using Bayesian structural time-series models). 《应用统计年鉴》(The Annals of Applied Statistics), 9(1),247–274.
[2] Choi, H. 和 Varian, H. (2012).使用 Google 趋势预测当前情况 (Predicting the present with Google Trends).《经济记录》(Economic Record),88,2–9.
[3] Harvey, A. C. (1989). 《预测、结构时间序列模型和卡尔曼滤波器》(Forecasting, structural time series models and the Kalman filter).剑桥大学出版社.
[4] Hyndman, R.J. 和 Athanasopoulos, G. (2018).《预测:原则与实践(第二版)》(Forecasting: principles and practice, 2nd edition),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).1978 年至 2000 年间陆地生物圈和海洋的大气二氧化碳和 13CO2 交换 (Exchanges of atmospheric CO2 and 13CO2 with the terrestrial biosphere and oceans from 1978 to 2000).《斯克里普斯海洋研究所系列文献》(SIO Reference Series),№01–06,第一卷. 全球方面 (Global aspects),斯克里普斯海洋研究所,圣迭戈.
更多 AI 相关阅读: