利用移动平均数和时间虚拟模型对长期变化进行建模。
文章目录
1、什么是趋势?
时间序列的趋势组成部分代表了序列均值的持久、长期变化。趋势是序列中变化最慢的部分,代表了最重要的大时间尺度。在产品销售的时间序列中,增加的趋势可能是市场扩张的效果,因为随着时间的推移,越来越多的人了解到产品。
四个时间序列的趋势模式
在这个课程中,我们将关注均值的趋势。更一般地说,任何在序列中持久且缓慢变化的部分都可以构成趋势 – 时间序列通常有其变化的趋势。
2、移动平均图
要看一个时间序列可能有什么样的趋势,我们可以使用移动平均图。计算时间序列的移动平均,我们计算在某个定义宽度的滑动窗口内的值的平均值。图上的每个点代表在窗口两侧的序列中所有值的平均值。这样做的目的是平滑序列中的任何短期波动,使得只剩下长期变化。
一个展示线性趋势的移动平均图。
线性趋势,曲线上的每个点(蓝色)是窗口大小为12的点(红色)的平均值。
注意上面的Mauna Loa
序列如何年复一年地重复上下移动 – 这是一个短期的、季节性的变化。对于一个变化成为趋势的部分,它应该发生在比任何季节性变化更长的时间段内。因此,为了可视化趋势,我们取一个比序列中任何季节性周期更长的平均值。对于Mauna Loa
序列,我们选择了大小为12的窗口来平滑每年内的季节。
3、工程趋势
一旦我们确定了趋势的形状,我们就可以尝试使用时间步特征来对其进行建模。我们已经看到如何使用时间虚拟变量本身来建模线性趋势:
target = a * time + b
我们可以通过对时间虚拟变量的转换来拟合许多其他类型的趋势。如果趋势看起来是二次的(一个抛物线),我们只需要将时间虚拟变量的平方添加到特征集中,得到:
target = a * time ** 2 + b * time + c
线性回归的学习系数是a、b和c。
下图中的趋势曲线都是使用这些特征和scikit-learn的LinearRegression
拟合的:
顶部: 呈线性趋势的序列。 下面: 呈二次趋势的序列。
如果你以前没有看过这个技巧,你可能没有意识到线性回归可以拟合除了线之外的曲线。这个想法是,如果你可以提供适当形状的曲线作为特征,那么线性回归就可以学习如何以最适合目标的方式组合它们。
4、示例 - 隧道交通
在这个例子中,我们将为隧道交通数据集创建一个趋势模型。
from pathlib import Path
from warnings import simplefilter
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
simplefilter("ignore") # ignore warnings to clean up output cells
# Set Matplotlib defaults
plt.style.use("seaborn-whitegrid")
plt.rc("figure", autolayout=True