什么是趋势(Trend)?

时间序列的趋势部分表示该序列平均值的持续、长期变化。 趋势是一系列中移动最慢的部分,代表了最大时间尺度的重要性。 在产品销售的时间序列中,随着越来越多的人逐年意识到该产品,销售量可能是增加的趋势。

四个时间序列中的趋势

在本节课中,我们将关注均值趋势。 更一般地说,一个序列中任何持续的和缓慢移动的变化都可能构成一个趋势——例如,时间序列通常具有变化的趋势。

移动平均图(moving average plot)

要查看时间序列可能具有什么样的趋势,我们可以使用移动平均图。 为了计算时间序列的移动平均值,我们计算某个定义的宽度的滑动窗口内的值的平均值。 图表上的每个点代表位于任一侧窗口内的系列中所有值的平均值。 这个想法是为了消除序列中的任何短期波动,以便只保留长期的变化。

线性趋势的移动平均图。 曲线上的每个点(蓝色)是大小为 12 的窗口内的点(红色)的平均值。

请注意上面的 Mauna Loa 系列如何年复一年地重复上下运动——这是一种短期的季节性变化。 要使变化成为趋势的一部分,它应该比任何季节性的变化发生的时间更长。 因此,为了可视化趋势,我们在比该系列中任何的季节性的周期更长的时间段内取平均值。 对于 Mauna Loa 系列,我们选择了大小为 12 的窗口来平滑每年的季节。

趋势工程(Engineering Trend)

一旦我们确定了趋势的形状,我们就可以尝试使用时间步长(time-step)特征对其建模。 我们已经看到如何使用时间虚拟变量(time dummy)本身来模拟线性趋势:

target = a * time + b

我们可以通过时间虚拟变量(time dummy)的转换来拟合许多其他类型的趋势。 如果趋势看起来是二次的(抛物线),我们只需将时间虚拟变量(time dummy)的平方添加到特征集,得到:

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

线性回归将学习系数abc

下图中的趋势曲线都是使用这些特征和 scikit-learn 的 LinearRegression 拟合的:

上: 具有线性趋势的系列。 下: 具有二次趋势的系列。

如果您以前没有见过这个技巧,那么您可能没有意识到线性回归可以拟合除直线以外的曲线。 这个想法是,如果您可以提供适当形状的曲线作为特征,那么线性回归可以学习如何以最适合目标的方式组合它们。

示例 - 隧道流量(Tunnel Traffic)

在此示例中,我们将为 隧道流量(Tunnel Traffic) 数据集创建一个趋势模型。


from pathlib import Path
from warnings import simplefilterimport matplotlib.pyplot as plt
import numpy as np
import pandas as pdsimplefilter("ignore")  # ignore warnings to clean up output cells# Set Matplotlib defaults
plt.style.use("seaborn-whitegrid")
plt.rc("figure", autolayout=True, figsize=(11, 5))
plt.rc("axes",labelweight="bold",labelsize="large",titleweight="bold",titlesize=14,titlepad=10,
)
plot_params = dict(color="0.75",style=".-",markeredgecolor="0.25",markerfacecolor="0.25",legend=False,
)
%config InlineBackend.figure_format = 'retina'# Load Tunnel Traffic dataset
data_dir = Path("./ts-course-data")
tunnel = pd.read_csv(data_dir / "tunnel.csv", parse_dates=["Day"])
tunnel = tunnel.set_index("Day").to_period()

让我们做一个移动平均图,看看这个系列有什么样的趋势。 因为这个系列记录有每天的观察,所以我们选择一个365天的窗口来平滑一年内的任何短期变化。

要创建移动平均图,首先使用rolling方法开始窗口计算。 然后使用 mean 方法来计算窗口上的平均值。 正如我们所见,隧道流量(Tunnel Traffic) 的趋势似乎是线性的。

moving_average = tunnel.rolling(window=365,       # 365-day windowcenter=True,      # puts the average at the center of the windowmin_periods=183,  # choose about half the window size
).mean()              # compute the mean (could also do median, std, min, max, ...)ax = tunnel.plot(style=".", color="0.5")
moving_average.plot(ax=ax, linewidth=3, title="Tunnel Traffic - 365-Day Moving Average", legend=False,
);


在第1课中,我们直接使用Pandas设置了时间虚拟对象(time dummy)。 但是,从现在开始,我们将使用 statsmodels 库中的一个名为 DeterministicProcess 的函数。 使用这个函数将帮助我们避免一些可能与时间序列和线性回归有关的棘手的失败案例。 order 参数是指多项式次数:1 表示线性,2 表示二次,3 表示三次,依此类推。

from statsmodels.tsa.deterministic import DeterministicProcessdp = DeterministicProcess(index=tunnel.index,  # dates from the training dataconstant=True,       # dummy feature for the bias (y_intercept)order=1,             # the time dummy (trend)drop=True,           # drop terms if necessary to avoid collinearity
)
# `in_sample` creates features for the dates given in the `index` argument
X = dp.in_sample()X.head()


(顺便说一下,deterministic process是 非随机 或 完全确定 的时间序列的技术术语,就像 consttrend 系列一样。从时间索引得出的特征通常会是完全确定的。)

我们基本上像以前一样创建趋势模型,但请注意这里添加了 fit_intercept=False 参数。

from sklearn.linear_model import LinearRegressiony = tunnel["NumVehicles"]  # the target# The intercept is the same as the `const` feature from
# DeterministicProcess. LinearRegression behaves badly with duplicated
# features, so we need to be sure to exclude it here.# intercept 与 DeterministicProcess 中的 `const` 功能相同。 LinearRegression 对重复特征表现不佳,因此我们需要确保在此处排除它。
model = LinearRegression(fit_intercept=False)
model.fit(X, y)y_pred = pd.Series(model.predict(X), index=X.index)

我们的“线性回归”模型发现的趋势几乎与移动平均图相同,这表明在这种情况下使用线性趋势是正确的决定。


ax = tunnel.plot(style=".", color="0.5", title="Tunnel Traffic - Linear Trend")
_ = y_pred.plot(ax=ax, linewidth=3, label="Trend")


为了进行预测,我们将模型应用于“样本外”特征。 “样本外”是指训练数据的观察期之外的时间。 以下是我们如何进行 30 天预测的方法:

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


让我们绘制该系列的一部分以查看未来 30 天的趋势预测:


ax = tunnel["2005-05":].plot(title="Tunnel Traffic - Linear Trend Forecast", **plot_params)
ax = y_pred["2005-05":].plot(ax=ax, linewidth=3, label="Trend")
ax = y_fore.plot(ax=ax, linewidth=3, label="Trend Forecast", color="C3")
_ = ax.legend()

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

轮到你了

商店销售中的模型趋势 并了解使用高阶多项式进行预测的风险。

Kaggle时间序列(Time Series)教程 2-趋势(Trend)相关推荐

  1. Kaggle时间序列(Time Series)教程 6-使用机器学习预测(forecasting-with-machine-learning)

    引言 在第2课和第3课中,我们将预测视为一个简单的回归问题,我们的所有特征都来自单个输入,即时间索引. 只需生成我们想要的趋势和季节性特征,我们就可以轻松地创建未来任何时间的预测. 然而,当我们在第4 ...

  2. python平稳性检验_时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)...

    时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python) 发布时间:2019-01-10 00:02, 浏览次数:620 , 标签: Python 导读: 本文介绍了数据平稳 ...

  3. R语言时间序列ARIMA新手教程

    R语言时间序列ARIMA新手教程 首先说一下ARMA回归的底层逻辑,所谓的AR模型和MA模型都是ARMA模型的一种特殊情况,有点类似正方形和长方形都是矩形.ARMA模型的表达式为: p为自回归部分的滞 ...

  4. 如何将时间序列分解为周期序列和趋势序列的和?

    时间序列分解是时序分析中的重要方法,广泛应用于时间序列预测,时间序列异常检测,时间序列聚类等场景,在工业界有很多的落地应用. 一个时间序列往往是以下几类变化形式的叠加或耦合: 长期趋势(Secular ...

  5. 时间序列预测基础教程系列(14)_如何判断时间序列数据是否是平稳的(Python)

    导读: 本文介绍了数据平稳的重要性,平稳的数据对模型有什么影响. 描述了如何从直观的数据图中,和数据分布图(钟形曲线),以及数据统计值(Dickey-Fuller)上判断数据是否是平稳的. 正文: 时 ...

  6. 时间序列模型步骤教程(ARIMA)

    目录 0.前言 一.数据准备&探索 1.平稳性 1.1 平稳性检验 1.2 数据处理(平滑.变换.差分.分解) 1.2.1 对数变换 1.2.2 平滑法(移动平均&指数平均) 1.2. ...

  7. 时间序列的三种模式:trend、seasonal、cyclic

    整理自Forecast:Principle and Practice,chapter 2.3:Time series patterns 1.Trend 数据中有长期的增长或者减少的时候,称这个数据有t ...

  8. Kaggle Tabular Playground Series - Jan 2022 的baseline和日期特征处理

    来源:DeepHub IMBA 本文共1500字,建议阅读8分钟 本文作者将使用 HistGradientBoostingRegressor 进行测试. Kaggle 决定将他们每月的表格竞赛延续到 ...

  9. 原理+论文+实战:60篇由浅入深的时间序列预测/分类教程汇总

    时间序列预测模型顶会论文资源汇总(2022.04.04更新) 包含时间序列预测,时间序列分类,时间序列异常检测,时空预测,时序推荐等领域的热门模型,以及Transformer应用于时间序列分析的变体和 ...

最新文章

  1. 第31届NIPS正式开幕,3240篇提交论文创历史新高,公布3篇最佳论文
  2. maven生命周期lifecycle和plugins介绍
  3. 回来来看初学C语言的一些有趣的图形的输出
  4. linux 正则查找email_Hello Iris简易微博类App开发教程3-查找用户和用户登录
  5. C语言,编写函数exchangeMaxMin(int arr[],int n),将该数组中最大最小值交换位置;
  6. Linux shell 脚本中, $@ 和$# 分别是什么意思?
  7. Zabbix配置文件详解之服务端——zabbix_server
  8. 可视化报表Superser
  9. ngrok下载并运行实现内网穿透
  10. 酒店管理系统(功能结构图、流程图)
  11. File Juicer for Mac(文件内容提取工具)
  12. 精品Uniapp的餐厅餐馆饮订餐点餐管理系统实现的App
  13. Google Play开发者账号注册教程(new)
  14. linux 运维工程师必备技能
  15. 搜索关键词优化 助力全网霸屏营销
  16. 依赖背包dp NOIP2006 vijos 1313 金明的预算方案
  17. 分布式监控工具zabbix 配置安装
  18. 设计模式(工厂模式)
  19. 喜剧院线电影《大夫我没病》在京开机
  20. 你妈给你介绍对象,你说自己new一个 | 程序员母亲节快乐

热门文章

  1. 大航海时代2恩斯特攻略(SFC日版)
  2. [转载]Landsat(Path Row)与行政区划、经纬度对照-----转_庄启智_新浪博客
  3. 如何选择合适企业的物联网平台
  4. iOS快速实现环形渐变进度条
  5. 优雅的接口防刷处理方案
  6. c语言 查看磁盘信息,获取磁盘列表以及磁盘信息的一些WIN32 API
  7. 最新版谷歌浏览器设置自动运行flash
  8. 黑马程序员_图形用户界面GUI_简单应用
  9. ppt转html并编辑文字,ppt转视频加字幕和音乐 制作的ppt添加精美的文字说明 然后添加温和背景音乐...
  10. 消息称高通骁龙 895 样品性能提升可达 20%