如何重构你的时间序列预测问题
你不必按照原样对你的时间序列预测问题进行建模。
有很多方法可以重新构建您的预测问题,既可以简化预测问题,也可以揭示更多或不同的信息进行建模。重构最终可以导致更好和/或更强大的预测。
在本教程中,您将了解如何使用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
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重构您的时间序列预测问题。
具体来说,你了解到:
- 如何设计你的时间序列问题的替代回归问题。
- 如何将您的预测问题作为分类问题。
- 如何设计预测问题的替代时间范围。
- C++中_onexit()用法简述
- tomcat请求处理分析(六)servlet的处理过程
- FFmpeg菜鸡互啄#第1篇#一些基本概念
- FFmpeg菜鸡互啄#第2篇#配置VS开发环境
- FFmpeg菜鸡互啄#第3篇#视频解码
- FFmpeg菜鸡互啄#第4篇#音频解码
- FFmpeg菜鸡互啄#第5篇#视频帧格式转换
- tomcat请求处理分析(三) 绑定本地端口监听请求
- 利用FFmpeg对火眼一体摄像机的回调数据进行处理:YUV转H264,H264封装flv,所有输入都是在内存中。
- MySQL 传统复制中常见故障处理和结构优化案例分析
- sql带条件查找最小缺失编号
- activiti学习笔记(六) 监听器
- activiti学习笔记(五) 流程部署
- 打开文件open()函数的使用方法详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 好用到飞起的12个jupyter lab插件
- Debug LinkedList
- Java对象公约
- 【Flutter 专题】96 图解 Draggable + DragTarget 基本拖拽效果
- Spring 基于注解(annotation)的配置之@Autowired注解
- 人心易变,这段有趣的C代码也一样!!!
- matplotlib绘制常见统计图形(一)
- python与安全(二)格式化字符串和Flask session
- ROS2机器人笔记20-07-24
- Postgresql 渗透利用总结
- Spring 基于注解(annotation)的配置之@Required注解
- 由一个系统激活工具引起的一次简单测试
- Golang channel 快速入门
- 潘石屹用Python解决100个问题 | 素数
- Spring 自动装配模式之构造函数装配方式