你不必按照原样对你的时间序列预测问题进行建模
有很多方法可以重新构建您的预测问题, 既可以简化预测问题, 也可以揭示更多或不同的信息进行建模重构最终可以导致更好和 / 或更强大的预测
在本教程中, 您将了解如何使用 Python 重构您的时间序列预测问题
完成本教程后, 您将知道:
如何将你的时序预测问题作为一个能替代的回归问题来进行重构
如何将你的时序预测问题作为一个分类预测问题来进行重构
如何用不同的时间范围重构时序预测问题
让我们开始吧
重构预测问题的好处
重新审视你的问题, 是探索对将要预测的事物的另一种观点
探索时间序列预测问题的替代框架有两个潜在的好处:
简化你的问题
为集合预报提供基础
这两个好处最终将导致更加巧妙和 / 或更强大的预测
1. 简化你的问题
也许在预测项目上取得的最大好处是来自于重新构建问题
这是因为预测问题的结构和类型有比其它问题如数据转换的选择, 模型选择或模型超参数的选择多得多影响
这是一个项目中影响最大的部分而且必须仔细考虑
2. 集合预报
除了改变你正在处理的问题之外, 重构还有另外一个作用: 它可以为你提供一套你可以建模的不同问题, 这些不同问题是高度相关的
这样做的好处是, 框架可能会有所不同, 需要在数据准备和建模方法上有所不同
关于同一问题的不同观点模型可能会从数据输入中获取不同的信息, 从而导致由不同方式产生的巧妙预测这些预测可以被合并在一个集合中, 以产生更好的预测
在本教程中, 我们将探讨可以考虑重新构建时间序列预测问题的三种不同的方法
在我们进入之前, 我们来看一个作为案例的简单单变量时间序列预测最低日温的问题
最低每日温度数据集
这个数据集描述了澳大利亚墨尔本市十年 (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 种不同的方式, 这个预测问题可以被重新表述为一个交替的回归问题:
预测与前一天相比最低气温的变化
预测过去 14 天内相对于平均值的最低温度
预测相对于去年同月的平均最低温度
预测四舍五入到最接近 5 摄氏度的最低温度
预测未来 7 天的平均最低温度
把温度看成一个线性变换可能并不会使问题变得简单且更容易预测, 但它有可能会刺激新想法的生成, 甚至产生可能让你考虑的新数据来源
它也可以帮助你更清楚地思考如何使用预测以及对预测价值的实际要求是什么
改变预测问题的粒度确实改变了问题的难度, 如果问题的要求允许这样的重新定义, 这个问题就非常有用
下面是一个例子, 重新设置最低日温度预测问题, 以预测每日温度四舍五入到最接近的 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 种不同的方式, 这个预测问题可以改写为一个分类问题:
预测一个最低温度是冷的, 中等的还是温暖的
预测最低温度的变化是小还是大
预测最低温度是否是每月最低
预测最小值是高于还是低于上一年的最低值
预测未来 7 天的最低气温是会上升还是下降
转向分类可以简化预测问题
这种方法打开了标签和二进制分类框架的概念
输出变量的原始回归表示意味着大多数分类框架可能保持序数结构 (例如冷, 中, 热) 这意味着所预测的类别之间存在有序的关系, 预测狗和猫这样的标签可能不是这种情况
序数关系允许一个难的分类问题以及一个整数预测问题, 这个问题可以被事后整理成一个特定的类别
以下是将最低日温度预测问题转化为分类问题的一个例子, 其中每个温度值是冷, 中, 或热的序数值这些标签被映射为整数值, 定义如下:
0(冷):<10 摄氏度
1(中度):> = 10 和 < 25 摄氏度
2(热):> = 25 摄氏度
- 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 天的最低温度
预测 30 天内的最低温度
预测下个月的平均最低气温
预测下周最低气温最低的一天
预测一年的最低温度值
但我们会很容易陷入需要一步预测的想法中
关注时间范围内的问题的折射, 会迫使你思考点与多步预测, 以及未来要考虑的距离
你可能能够预测到未来, 但技能可能会有所不同, 进一步降低你的计划在考虑预测的视野时, 还要考虑预测的最小可接受性
下面的例子将最小日温度预测问题转换为预测未来 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
- NaN 20.7 17.9 18.8 14.6 15.8 15.8 15.8
- 20.7 17.9 18.8 14.6 15.8 15.8 15.8 17.4
- 17.9 18.8 14.6 15.8 15.8 15.8 17.4 21.8
- 18.8 14.6 15.8 15.8 15.8 17.4 21.8 20.0
- 14.6 15.8 15.8 15.8 17.4 21.8 20.0 16.2
- 15.8 15.8 15.8 17.4 21.8 20.0 16.2 13.3
- 15.8 15.8 17.4 21.8 20.0 16.2 13.3 16.7
- 15.8 17.4 21.8 20.0 16.2 13.3 16.7 21.5
- 17.4 21.8 20.0 16.2 13.3 16.7 21.5 25.0
- 21.8 20.0 16.2 13.3 16.7 21.5 25.0 20.7
- 20.0 16.2 13.3 16.7 21.5 25.0 20.7 20.6
- 16.2 13.3 16.7 21.5 25.0 20.7 20.6 24.8
- 13.3 16.7 21.5 25.0 20.7 20.6 24.8 17.7
- 16.7 21.5 25.0 20.7 20.6 24.8 17.7 15.5
概要
在本教程中, 您了解了如何使用 Python 重构您的时间序列预测问题
具体来说, 你了解到:
如何设计你的时间序列问题的替代回归问题
如何将您的预测问题作为分类问题
如何设计预测问题的替代时间范围
来源: https://cloud.tencent.com/developer/article/1039296