时间序列数据集可能包含一种趋势。
序列中的趋势是随着时间的推移不断的增加或减少。能够识别,建模,甚至去除时间序列数据集趋势信息是有益的。
在本教程中,你会发现如何在Python中建模以及去除时间序列数据的趋势信息。
完成本教程之后,你就会知道︰
时间序列中可能存在的趋势的重要性和类型以及如何识别它们。
如何使用简单的差分方法去除趋势。
如何建立线性趋势模型以及去除时间系列数据集中的趋势。
让我们开始吧。
Python中如何使用以及去除时间序列数据的趋势信息
图片来自john78727,保留部分权利
时间序列的趋势
趋势是时间序列水平的长期增加或减少。
“一般来说,不表现为周期性的时间序列的系统变化被称为趋势。”
——第5页,R语言时间序列介绍
识别和理解趋势信息可以帮助提高模型的性能;下面是几点原因︰
更快地建模:相关的知识会使模型的选择和评估更为有效。
简化问题:我们可以更正或消除趋势来简化建模和改善模型性能。
更多的数据:我们可以直接利用趋势信息,或者向模型提供附加信息来提高模型性能。
趋势的类型
趋势的类型有很多。
两种常见的类型是︰
确定性趋势:趋势始终如一地增加或减少。
随机的趋势:趋势的增加,减少不一致。
一般情况下,确定性趋势更容易识别和消除,但在本教程中介绍的方法还可用于随机趋势。
我们可以根据观察的范围来考虑趋势。
全局趋势:这些都是适用于整个时间序列的趋势。
局部趋势:这些都是适用于零件或子序列的时间序列的趋势。
一般来说,全局趋势更容易识别和解决。
确定趋势
您可以绘制时间序列数据,看看趋势是否明显。
困难在于实践中,确定时间序列的趋势是一个主观的过程。因此,从时间序列中提取或移除趋势是主观的。
创建您的数据线图并查看有没有明显的趋势。
将线性和非线性趋势线添加到图中,看看趋势是否明显。
去除趋势
有趋势的时间序列是非平稳的。
可以模拟确定的趋势。建模之后,它可以从时间系列数据集中去除。这就是时间序列去趋势。
如果数据集没有趋势或我们成功地去除了趋势,数据集就是趋势平稳的。
在机器学习中使用时间系列趋势
从机器学习的角度来看,数据中的趋势有两种可能性︰
1.删除信息:去除扭曲输入和输出变量之间关系的系统信息。
2.添加信息:添加提高输入和输出变量之间关系的系统信息。
具体来说,趋势可以在数据准备和清理活动中从时间序列数据中剔除。这在运用统计学方法进行时间序列预测时是常见的,但使用机器学习模型时不一定能改善结果。
或者,可以直接添加趋势或添加趋势作为一个新的输入变量来预测输出变量。
这两种方法可能都与您的时间序列预测问题相关,所以都值得研究。
接下来,让我们看看有趋势的数据集。
洗发水销售数据集
此数据集描述了过去3年每月的洗发水销售量。
单位是销售计数,有36个观察点。原始数据集被归入Makridakis,Wheelwright和Hyndman(1998)。
下面是前5行数据,包括标题行。
"Month","Sales"
"1-01",266.0
"1-02",145.9
"1-03",183.1
"1-04",119.3
"1-05",180.3
下面是取自数据集市的整个数据集,你可以从数据集市了解更多信息并下载数据集。
数据集呈增涨的趋势。
洗发水销售数据集
加载洗发水销售数据集
下载数据集并将其放置在当前工作目录中,文件命名为“shampoo-sales.csv”
数据集可以使用自定义的解析器加载,如下所示:
运行示例加载数据集,并创建一个图。
洗发水销售数据集图
差分法去趋势
时间序列去趋势最简单的方法就是差分。
具体而言,在等时间步长的基础上,计算前一观察点和观察点之差构造出新的序列。
value(t) = observation(t) - observation(t-1)
这可以从时间序列中去除趋势。
我们可以在Python中直接实现,创建一个差分数据集。
下面是洗发水销售数据集差分去趋势的例子。
运行本示例创建新的去趋势数据集,然后绘制时间序列。
因为第一个观察点没有差值可以创建(没有可以提取的),新的数据集会少一条记录。我们可以看到趋势的确已经被消除。
洗发水销售数据集差分去趋势
这种方法非常适合于线性趋势的数据。如果趋势是二次的(趋势的变化也同样增加或减少),然后已经差分数据集也可以采取差分,第二个层次的差分。如果需要的话,此过程可以进一步重复。
因为差分只要求当前时间的前一刻的数据,它可以很容易地应用于预处理看不见输出的样本数据或为监督式学习提供额外的输入。
接下来,我们将用拟合模型来描述趋势。
拟合模型去趋势
趋势通常可视化为一条直线穿过。
线性趋势可以用线性模型总结,非线性趋势可以用多项式或其它曲线拟合方法概括。
由于确定趋势的主观和特定域的性质,这种方法有助于确定是否存在趋势。即使将确定是超线性或指数的趋势拟合为线性模型也是有帮助的。
除了被用作趋势识别工具,这些适合的模型还可以用于时间序列去趋势。
例如,一个线性模型适用于时间指标预测。数据集如下所示︰
X,y
1,obs1
2,obs2
3,obs3
4,obs4
5,obs5
这个模型的预测将形成一条直线,可以作为该数据集的趋势线。这些预测也可以从原始时间序列中减去,以提供数据集的去趋势版本。
value(t) = observation(t) - prediction(t)
模型的拟合残差是数据集的去趋势形式。也可以用多项式曲线拟合及其它非线性模型。
我们可以在Python中实现,使用scikit-learn LinearRegression模型。
运行示例,符合线性模型,在原始数据集(蓝色)上绘制趋势线 (绿色)。
洗发水销售数据集趋势图
下一步,原始数据集减去这一趋势,然后绘制结果,结果为去趋势数据集。
除趋势的洗发水销售数据集模型
我们再次看到这种方法可以有效去除数据集的趋势。残差可能是一条抛物线,这表明,多项式拟合可能会有更好的效果。
因为趋势模型的输入是整数索引,它可用于新数据的去趋势,或为模型提供一个新的输入的变量。
进一步阅读
下面是趋势估计和时间序列去趋势的一些其他资料。
Linear trend estimation on Wikipedia
Detrending Notes, GEOS 585A, Applied Time Series Analysis [PDF]
总结
在本教程中,你发现时间序列数据中的趋势以及如何利用Python消除趋势。
具体来说,你学到了:
时间序列中趋势信息的重要性,以及如何在机器学习中使用。
如何使用差分去除时间序列中的趋势。
如何建立线性趋势的模型以及去除时间序列中的趋势。
英文原文:http://machinelearningmastery.com/time-series-trends-in-python/