你不必按照原样对你的时间序列预测问题进行建模。
有很多方法可以重新构建您的预测问题,既可以简化预测问题,也可以揭示更多或不同的信息进行建模。重构最终可以导致更好和/或更强大的预测。
在本教程中,您将了解如何使用Python重构您的时间序列预测问题。
完成本教程后,您将知道:
让我们开始吧。
重新审视你的问题,是探索对将要预测的事物的另一种观点。
探索时间序列预测问题的替代框架有两个潜在的好处:
这两个好处最终将导致更加巧妙和/或更强大的预测。
也许在预测项目上取得的最大好处是来自于重新构建问题。
这是因为预测问题的结构和类型有比其它问题如数据转换的选择,模型选择或模型超参数的选择多得多影响。
这是一个项目中影响最大的部分而且必须仔细考虑。
除了改变你正在处理的问题之外,重构还有另外一个作用:它可以为你提供一套你可以建模的不同问题,这些不同问题是高度相关的。
这样做的好处是,框架可能会有所不同,需要在数据准备和建模方法上有所不同。
关于同一问题的不同观点模型可能会从数据输入中获取不同的信息,从而导致由不同方式产生的巧妙预测。这些预测可以被合并在一个集合中,以产生更好的预测。
在本教程中,我们将探讨可以考虑重新构建时间序列预测问题的三种不同的方法。
在我们进入之前,我们来看一个作为案例的简单单变量时间序列预测最低日温的问题。
这个数据集描述了澳大利亚墨尔本市十年(1981-1990)的最低日温度。
单位是摄氏度,有3650个观测值。数据的来源是澳大利亚气象局。
使用文件名“ daily-minimum-temperatures.csv ” 将最低日温度下载到当前工作目录。
注意:下载的文件包含一些问号(“?”)字符,在使用数据集之前必须将其删除。在文本编辑器中打开文件并删除“?”字符。也删除该文件中的任何页脚信息。
下面的例子将数据集加载为Pandas系列。
from pandas import Series
from matplotlib import pyplot
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
print(series.head())
series.plot()
pyplot.show()
运行该示例将输出加载数据集的前5行。
Date Temperature
1981-01-01 20.7
1981-01-02 17.9
1981-01-03 18.8
1981-01-04 14.6
1981-01-05 15.8
时间序列的折线图也被创建。
朴素预测方法就是将上一期的实际数据作为下一期的预测值。
作为参考,我们把这个方法做出的预测成为朴素时序预测。
在这种情况下,我们可以移除时序中的季节性因素以达到时序的季节性平稳。
然后我们可以基于滞后观察的结果对时序建模。
例如:
Temp(t+1) = B0 + B1*Temp(t-1) + B2*Temp(t-2) ... Bn*Temp(t-n)
其中Temp(t + 1)是预测时序的下一个温度,B0到Bn是从训练数据中学习到的系数,Temp(t-1)到Temp(tn)是滞后的观察值。
这个方法的预测结果可能会很好甚至很多预测问题就是需要这种方法。
但此方法的风险在于,一个预先设想的关于如何构建问题的想法可能影响数据收集,进而可能限制结果。
大多数时间序列预测问题是回归问题,需要预测实值输出。
下面是5种不同的方式,这个预测问题可以被重新表述为一个交替的回归问题:
把温度看成一个线性变换可能并不会使问题变得简单且更容易预测,但它有可能会刺激新想法的生成,甚至产生可能让你考虑的新数据来源。
它也可以帮助你更清楚地思考如何使用预测以及对预测价值的实际要求是什么。
改变预测问题的粒度确实改变了问题的难度,如果问题的要求允许这样的重新定义,这个问题就非常有用。
下面是一个例子,重新设置最低日温度预测问题,以预测每日温度四舍五入到最接近的5倍数的值。
from pandas import Series
from pandas import DataFrame
from pandas import concat
from math import floo
# 加载数据
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
# 创建滞后数据集
values = DataFrame(series.values)
dataframe = concat([values.shift(1), values], axis=1)
dataframe.columns = ['t-1', 't+1']
# 把预测值四舍五入到最近的5的倍数值
for i in range(len(dataframe['t+1'])):
dataframe['t+1'][i] = int(dataframe['t+1'][i] / 5) * 5.0
print(dataframe.head(5))
运行该示例将输出重构的问题的前5行。
问题被定义为给定最低温度的前一天,摄氏度,最小值,精确到5度。
t-1 t+1
0 NaN 20.0
1 20.7 15.0
2 17.9 15.0
3 18.8 10.0
4 14.6 15.0
分类涉及预测分类或标签输出(如“热”和“冷”)。
下面是5种不同的方式,这个预测问题可以改写为一个分类问题:
转向分类可以简化预测问题。
这种方法打开了标签和二进制分类框架的概念。
输出变量的原始回归表示意味着大多数分类框架可能保持序数结构(例如冷,中,热)。这意味着所预测的类别之间存在有序的关系,预测“狗”和“猫”这样的标签可能不是这种情况。
序数关系允许一个难的分类问题以及一个整数预测问题,这个问题可以被事后整理成一个特定的类别。
以下是将最低日温度预测问题转化为分类问题的一个例子,其中每个温度值是冷,中,或热的序数值。这些标签被映射为整数值,定义如下:
from pandas import Series
from pandas import DataFrame
from pandas import concat
from math import floo
# 加载数据
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
# 创建滞后数据集
values = DataFrame(series.values)
dataframe = concat([values.shift(1), values], axis=1)
dataframe.columns = ['t-1', 't+1']
# 四舍五入预测值到最近的5的倍数
for i in range(len(dataframe['t+1'])):
value = dataframe['t+1'][i]
if value < 10.0:
dataframe['t+1'][i] = 0
elif value >= 25.0:
dataframe['t+1'][i] = 2
else:
dataframe['t+1'][i] = 1
print(dataframe.head(5)
运行该示例将输出重新构建的问题的前5行。
给定前一天的最低温度(摄氏度),目标是预测温度为冷,中,热(分别为0,1,2)。
t-1 t+1
0 NaN 1.0
1 20.7 1.0
2 17.9 1.0
3 18.8 1.0
4 14.6 1.0
另一个可以改变的轴是时间范围。
时间范围是正在预测的未来时间步数。
下面是5种不同的方式,这个预测问题可以在不同的时间范围内重新表达:
但我们会很容易陷入需要一步预测的想法中。
关注时间范围内的问题的折射,会迫使你思考点与多步预测,以及未来要考虑的距离。
你可能能够预测到未来,但技能可能会有所不同,进一步降低你的计划。在考虑预测的视野时,还要考虑预测的最小可接受性。
下面的例子将最小日温度预测问题转换为预测未来7天的最低温度。
from pandas import Series
from pandas import DataFrame
from pandas import concat
from math import floo
# load data
series = Series.from_csv('daily-minimum-temperatures.csv', header=0)
# Create lagged dataset
values = DataFrame(series.values)
dataframe = concat([values.shift(1), values, values.shift(-1),
values.shift(-2), values.shift(-3), values.shift(-4), values.shift(-5),
values.shift(-6)], axis=1)
dataframe.columns = ['t-1', 't+1', 't+2', 't+3', 't+4', 't+5', 't+6', 't+7']
print(dataframe.head(14))
运行该示例将输出转换数据集的前14条记录。
问题的定义是:给定从前一天的最低日温度,以摄氏度为单位,预测未来7天的最低日温度。
t-1 t+1 t+2 t+3 t+4 t+5 t+6 t+7
0 NaN 20.7 17.9 18.8 14.6 15.8 15.8 15.8
1 20.7 17.9 18.8 14.6 15.8 15.8 15.8 17.4
2 17.9 18.8 14.6 15.8 15.8 15.8 17.4 21.8
3 18.8 14.6 15.8 15.8 15.8 17.4 21.8 20.0
4 14.6 15.8 15.8 15.8 17.4 21.8 20.0 16.2
5 15.8 15.8 15.8 17.4 21.8 20.0 16.2 13.3
6 15.8 15.8 17.4 21.8 20.0 16.2 13.3 16.7
7 15.8 17.4 21.8 20.0 16.2 13.3 16.7 21.5
8 17.4 21.8 20.0 16.2 13.3 16.7 21.5 25.0
9 21.8 20.0 16.2 13.3 16.7 21.5 25.0 20.7
10 20.0 16.2 13.3 16.7 21.5 25.0 20.7 20.6
11 16.2 13.3 16.7 21.5 25.0 20.7 20.6 24.8
12 13.3 16.7 21.5 25.0 20.7 20.6 24.8 17.7
13 16.7 21.5 25.0 20.7 20.6 24.8 17.7 15.5
在本教程中,您了解了如何使用Python重构您的时间序列预测问题。
具体来说,你了解到: