时间序列学习2:趋势

trend:模型随着移动平均值和time dummy的变化

1.什么是趋势?
时间序列的趋势分量代表序列均值的持续(presistent)、长期变化(long-term change)。趋势是一系列中移动最慢的部分,代表了最大时间尺度的重要性。在产品销售的时间序列中,随着越来越多的人逐年意识到该产品,市场扩张的影响可能是增加趋势。
更一般地说,一个序列中任何持续且缓慢移动的变化都可能构成一种趋势——例如,时间序列通常在其变化中具有趋势。
2.移动平均线图(moving average plots)
sliding window
要查看时间序列可能具有什么样的趋势,我们可以使用移动平均图。为了计算时间序列的移动平均值,我们计算某个定义宽度的滑动窗口内的值的平均值。图表上的每个点代表位于任一侧窗口内的系列中所有值的平均值。这个想法是为了消除序列中的任何短期波动,以便只保留长期变化
3.Engineering Trend
一旦我们确定了趋势的形状,我们就可以尝试使用时间步长特征(time-step feature)对其进行建模。
我们已经看到如何使用时间虚拟模型本身来模拟线性趋势:

target = a*time +b

fit many other kinds of trend through transformations of the time dummy.
我们可以通过时间伪造的转换来融合许多其他类型的趋势。如果趋势似乎是二次(抛物线),我们只需要将时间伪装的平方添加到功能集中,给我们:

target = a * time**2 + b* time + c

使用scikit-learn’s 中的LinearRegression

3.例子:Tunnel Traffic
真是一个大工程呀
对商店销售趋势建模并了解使用高阶多项式进行预测的风险。
(1)让我们做一个移动平均线图,看看这个系列有什么样的趋势。由于这个系列有每日观察,让我们选择一个 365 天的窗口来平滑一年内的任何短期变化。要创建移动平均线,首先使用(rolling)滚动方法开始窗口计算。按照这个方法计算窗口的平均值。正如我们所看到的,隧道流量的趋势似乎是线性的。

  • tunnel.rolling()

  • tunnel.plot()
    (2)在1中,我们直接在 Pandas 中设计了我们的时间虚拟机。然而,从现在开始,我们将使用 statsmodels 库中的一个名为DeterministicProcess 的函数。使用这个函数将帮助我们避免一些棘手的失败案例,这些案例可能会随着时间序列和线性回归而出现。 order 参数是指多项式顺序:1 表示线性,2 表示二次,3 表示三次,依此类推。

  • DeterministicProcess

from statsmodel.tsa.deterministic import DeterministicProcess

(3)预测模型

from sklearn.linear_model import LinearRegression

我们的线性回归模型发现的趋势几乎与移动平均图相同,这表明在这种情况下线性趋势是正确的决定。
为了进行预测,我们将模型应用于“样本外”特征。 “样本外”是指训练数据的观察期之外的时间。以下是我们如何进行 30 天预测的方法:

X = dp.out_of_sample(steps = 30)
y_fore = pd.Series(model.predict(X),index = X.index)
y_fore.head()

我们在本课中学到的趋势模型之所以有用,有很多原因。除了作为更复杂模型的基线或起点之外,我们还可以将它们用作“混合模型”中的一个组件,其中算法无法学习趋势(如 XGBoost 和随机森林)。

练习

1.制作一个移动平均线图来估计这个系列的趋势。
在这里插入图片描述
可以看出趋势是线性的

#添加移动平均
trend = food_sales.rolling(window=12,center=True,min_periods=6,).mean()
#绘图
ax = food_sales.plot(**plot_params,alpha = 0.5)
ax = trend.plot(ax= ax,linewidth = 3)

在这里插入图片描述

2.辨别趋势(identify trend)
什么阶多项式趋势可能适用于食品和饮料销售系列(food_sales)?你能想出一条可能效果更好的非多项式曲线吗?
看图:趋势的向上弯曲表明 2 阶(二次)多项式可能是合适的。如果您之前使用过经济时间序列,您可能会猜测食品和饮料销售的增长率最好用百分比变化来表示。百分比变化通常可以使用指数曲线建模。 (如果这不熟悉,请不要担心!)

trend = average_sales.rolling(window=365,center=True,min_periods=183,).mean()
ax = average_sales.plot(**plot_params,alpha=0.5)
ax = trend.plot(ax=ax,linewidth = 3)

在这里插入图片描述
3.创建趋势特征
使用 DeterministicProcess 为三次趋势模型创建特征集。还可以为 90 天的预测创建要素。

from statsmodels.tsa.deterministic import DeterministicProcess
y = average_sales.copy()
#创建3次趋势模型
dp = DeterministicProcess(index=y.index,order=3)
X = dp.in_sample()
X_fore = dp.out_of_sample(steps =90 )

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
差分平稳化

model = LinearRegression()
model.fit(X,y)
y_pred = pd.Series(model.predict(X),index = X.index)
y_fore = pd.Series(model.predict(X_fore),index = X_fore.index)

ax = y.plot(**plot_params,alpha=0.5,title="Average Sales",ylabel="items sole")
ax = y_pred.plot(ax=ax,linewidth=3,label="Trend",color = "CO")
ax = y_fore.plot(ax=ax,linewidth=3,label="Trend Forecast",color = "C3")
ax.legend();

在这里插入图片描述
在这里插入图片描述
拟合更复杂趋势的一种方法是增加您使用的多项式的阶数。为了更好地适应商店销售中有些复杂的趋势,我们可以尝试使用 11 阶多项式
在这里插入图片描述
4.了解使用高阶多项式进行预测的风险
然而,高阶多项式通常不太适合预测。你能猜到为什么吗?一个 11 阶多项式将包含 t ** 11 之类的项。此类项往往会在训练期之外迅速发散,从而使预测非常不可靠。对于像 t ** 11 这样的术语在很长一段时间内的变化率,你有什么看法?
在这里插入图片描述
5,(可选)用样条拟合趋势
当您想要适应趋势时,样条曲线是多项式的不错替代方案。 pyearth 库中的多元自适应回归样条 (MARS) 算法功能强大且易于使用。您可能需要研究很多超参数。
在这里插入图片描述
预测这样的复杂趋势通常很困难(如果不是不可能的话)。但是,对于历史数据,您可以使用样条曲线通过去趋势隔离时间序列中的其他模式。
在这里插入图片描述


版权声明:本文为weixin_45081871原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>