基于时间序列的回归问题(4)——时间序列预测的基本思路

2023-11-08

前言:

大家好,这个系列之前以及写了几篇博客,都是对于时间序列回归预测的一些前期准备知识,相信很多人(包括笔者在内)第一次接触这种项目,可能大体的思路方案都不是很清楚,那么,这么博客将为大家梳理一下做基于时间序列数据回归预测问题的大体思路。


1、数据预处理

对于大多数基于数据挖掘的预测项目来说,得到的数据一般情况都会有噪声的,这时,就需要对数据进行预处理。
数据预处理包括对数据的清洗、数据规约等步骤。
数据清洗主要是对数据中的缺失值和异常值进行处理,对于时间序列的数据,可以看做是信号,相信大家都了解之前学习的信号与系统和数字信号处理,那时候我们经常用的就是傅里叶变换呀什么的,通过一定的滤波器从而实现信号的去噪,得到有用的信号,其实我们这里做的工作和那些类似,只不过对于实际生活中的一些数据,并不是完全满足周期性,如果我们再用傅里叶什么这时候就不能符合实际生活中的客观性,这时候便引入了前面讲的奇异普分析(SSA)经验模态分解,这两种方法的具体内容可参照前面的博客,这里就不多说了,经过这两种方法去噪后,可使我们得到更有利于未来预测的数据。
对于数据规约,这里一般需要对数据进行归一化处理,这里最常用的包括(0,1)标准化和Z-score标准化(这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化)。

2、特征提取思路

对于之前了解分类问题的人们,大家都知道要对数据提取所需的特征,有时候也会对数据集直接进行预测,这时候不再构造新的特征,而是直接使用原有数据集中的特征,其实我们这里基于时间序列的预测与之前的思路还是一直的,比如可以采用要预测时间点的前一个月所有数据作为特征,或通过特种工程,统计出要预测时间点前所有数据的部分特征,比如前1,2,3,4,5,6…天的平均值,最大最小值等统计量等,可以看出基于时间序列的预测与之前的分类问题只是具体操作的手段不一致,下面针对不同情况将具体介绍几种基本思路:

2.1、单维单步

对于采用前n个点的数据预测下一个数据点的数据,这里为了方便大家理解,我们以前2的点预测下一个点的例子举例。
如我们基于时间序列为:1234567
那么我们的特征集为train_x和label(train_y)为:

train_x=[ [1,2][2,3][3,4][4,5][5,6]]
train_y=[3,4,5,6,7]

可以看出,用前两个数据预测下一个数据,比如用第一、第二个数据1和2作为特征,label为第三数据3。

2.2单维多部

由于我们在很多预测项目中,需要对未来一段时间进行预测,而不单单仅是预测未来一天的数值,所以这里就引入了单维多部的方法,这里以通过过去2个点的数据预测未来2个点的数据举例:
如我们基于时间序列为:1234567
那么我们的特征集为train_x和label(train_y)为:

train_x=[ [1,2][2,3][3,4][4,5]]
train_y=[[3,4],[4,5], [5,6],[6,7]]

2.3多维单步法

这种方法适用于同时对多组数据进行预测,且这两组数据彼此之间有一定联系,这里我们用两维数据,通过前三个点预测后一个点:
如我们基于时间序列为:
123456
11,12,13,14,15,16
那么我们的特征集为train_x和label(train_y)为:

train_x=[ [[1,11],[2,12],[3,13]],
          [[2,12],[3,13],[4,14]],
          [[3,13],[4,14],[5,15]]]
          
train_y=[[4,14],[5,15], [6,16]]

这里我们可看出,此时的特征集为3维(3, 3, 2)的数组,即3个sample,每个sample有3组feature,每组feature为2维数据。

2.4统计特征

之前的3种方法只是单纯建立在了对时间序列的预测,只是通过之前时间的数据来预测未来的数据,这种方法具有一定的局限性,这里可以引入其他的统计特征,比如引入会影响未来该数据值的其他特征,比如前n天的平均值、最大最小值等,这里也可以加入一些会影响未来数据但未在之前数据中体现出来的特征,比如应用在对股票价格的预测,不仅仅要对之前价格作为影响因素,同样要考虑当下的政策与具体情况,当然,这里只是举个例子,就不具体说了。

3程序实例

这里通过一个正弦和余弦函数的实例来简单说明一下:
首先拟定一个二维的数据对其进行实验 这个数据长度是1000条,一维是sin函数 另一维是cos函数使用前200步去预测后50步

data = np.zeros(2000)
data.dtype = 'float64'
data = data.reshape(1000,2)
sinx=np.arange(0,40*np.pi,2*np.pi/50,dtype='float64')
siny=np.sin(sinx)
cosx=np.arange(0,40*np.pi,2*np.pi/50,dtype='float64')
cosy=np.cos(sinx)

data[:,0] = siny
data[:,1] = cosy

print(data)
plt.plot(data[:,0])
plt.show()
plt.plot(data[:,1])
plt.show()

然后我们利用转换函数,将数据按照第二部分讲的方法转换为相应的特征和label集:

def create_dataset(data,n_predictions,n_next):
    '''
    对数据进行处理
    '''
    dim = data.shape[1]
    train_X, train_Y = [], []
    for i in range(data.shape[0]-n_predictions-n_next-1):
        a = data[i:(i+n_predictions),:]
        train_X.append(a)
        tempb = data[(i+n_predictions):(i+n_predictions+n_next),:]
        b = []
        for j in range(len(tempb)):
            for k in range(dim):
                b.append(tempb[j,k])
        train_Y.append(b)
    train_X = np.array(train_X,dtype='float64')
    train_Y = np.array(train_Y,dtype='float64')

    return train_X, train_Y
    
train_X,train_Y = create_dataset(data,200,50)

之后就是训练模型,由于本博客偏向于应用,就不再具体介绍回归模型了,这里就直接用神经网路Keras库中LSTM,如果想具体了解这个训练模型,可以关注本人博客,后续将持续更新,或自行百度。

def trainModel(train_X, train_Y):
    '''
    trainX,trainY: 训练LSTM模型所需要的数据
    '''
    model = Sequential()
    model.add(LSTM(
        140,
        input_shape=(train_X.shape[1], train_X.shape[2]),
        return_sequences=True))
    model.add(Dropout(0.3))

    model.add(LSTM(
        140,
        return_sequences=False))
    model.add(Dropout(0.3))

    model.add(Dense(
        train_Y.shape[1]))
    model.add(Activation("relu"))

    model.compile(loss='mse', optimizer='adam')
    model.fit(train_X, train_Y, epochs=100, batch_size=64, verbose=1)

    return model
model = trainModel(train_X,train_Y)

这个时候,模型已经训练好了,下面将对数据进行预测,我们预测时,同样构造一组正弦函数和一组余弦函数:

def reshape_y_hat(y_hat,dim):
    re_y = []
    i = 0
    while i < len(y_hat):
        tmp = []
        for j in range(dim):
            tmp.append(y_hat[i+j])
        i = i + dim
        re_y.append(tmp)
    re_y = np.array(re_y,dtype='float64')
    return  re_y


data = np.zeros(400)
data.dtype = 'float64'
data = data.reshape(200,2)
sinx=np.arange(0,8*np.pi,2*np.pi/50,dtype='float64')
siny=np.sin(sinx)
cosx=np.arange(0,8*np.pi,2*np.pi/50,dtype='float64')
cosy=np.cos(sinx)
data[:,0] = siny
data[:,1] = cosy

model = load_model("./MultiSteup2.h5")
test_X = data.reshape(1,data.shape[0],data.shape[1])
y_hat  =  model.predict(test_X)
#重组
y_hat = y_hat.reshape(y_hat.shape[1])
y_hat = reshape_y_hat(y_hat,2)

print(y_hat.shape)
plt.plot(y_hat[:,0])
plt.show()
plt.plot(y_hat[:,1])
plt.show()

这是就会画出预测后的效果了,当然,本篇博客只是想简单介绍一下大体思路,程序只是一个简单举例而已,如果想做具体项目,还要后续考虑更多的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于时间序列的回归问题(4)——时间序列预测的基本思路 的相关文章

  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 如何在 __init__ 中使用await设置类属性

    我如何定义一个类await在构造函数或类体中 例如我想要的 import asyncio some code class Foo object async def init self settings self settings setti
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • Pycharm 在 os.path 连接上出现“未解析的引用”

    将pycharm升级到2018 1 并将python升级到3 6 5后 pycharm报告 未解析的引用 join 最新版本的 pycharm 不会显示以下行的任何警告 from os path import join expanduser
  • 打印数字时添加千位分隔符[重复]

    这个问题在这里已经有答案了 我真的不知道这个问题的 名称 所以它可能是一个不正确的标题 但问题很简单 如果我有一个数字 例如 number 23543 second 68471243 我想要它使print 像这样 23 54368 471
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • qsort用法

    轉自 http www cnblogs com ForeverJoker archive 2013 05 25 qsort sort html qsort函数 sort函数 精心整理篇 qsort函数 sort函数 精心整理篇 先说明一下q
  • JaCoCo助您毁灭线上僵尸代码

    一 现状 问题 随着需求不断迭代 业务系统的业务代码突飞猛进 在你自豪于自己的代码量产出很高时 有没有回头看看线上真正的客户使用量又有多少呢 费事费力耗费大量人力 成本上线的功能 可能一年没人使用 如果不进行适当的下线 就会增加系统维护成本
  • 自定制命令(让scrapy在pycharm下跑起来)

    pytcharm运行单个爬虫 coding utf 8 Time 2019 7 19 下午 5 19 Author lh Email xx lh com File manage py Software PyCharm import sys
  • 合同比对

    for i 15 i lt 174 i do if d i then cd i echo 当前产品sn i ls ltr pdf grep v tmp wc l cd fi done mysql uroot p xxxxxx e selec
  • 硬件加速导致的flv播放不出视频(拉流)

    问题 前段时间我们做项目的时候 涉及到PC端拉流 但是出现了一些奇怪的情况 我们多台设备 安装的都是谷歌Chrome浏览器 但是在从流媒体服务器拉流的时候 出现笔记本win10最新版本Chrome 台式机win7低版本Chome 版本 58
  • vm虚拟机搭建服务器docker,服务器(虚拟机vm搭建的)重启后docker的所有镜像都无法启动...

    root localhost docker start csphere controller Error response from daemon Cannot start container csphere controller Erro
  • SpringBoot 性能优化

    1 服务监控 在开始对SpringBoot服务进行性能优化之前 我们需要做一些准备 把SpringBoot服务的一些数据暴露出来 比如 你的服务用到了缓存 就需要把缓存命中率这些数据进行收集 用到了数据库连接池 就需要把连接池的参数给暴露出
  • HashMap底层原理全解析

    作为面试中的高频题目 我相信每一个java程序员都有必要搞懂HashMap的底层原理和实现细节 废话不多说直接开撸 首先简单说一下HashMap的实现原理 首先有一个Node
  • win10双屏让任务栏显示不相同的方法

    经常使用win10的双屏幕模式 在使用的过程中 发现有些不太合适的地方 就是底部的任务栏的图标 两个屏幕 两个任务栏 这个无可厚非 但是 第二个屏幕上的程序 在第一个屏幕上还保留有任务栏位置 这个就比较有些匪夷所思了 点击第一个屏幕上的任务
  • 学妹毕业一年拿40万offer,经验其实就两点

    我经常和一位小学妹聊天 交流经验 昨天她告诉我 她终于实现了当年发过的誓 毕业2年内 进BAT 拿30万年薪 最终超额完成目标 毕业1年进了阿里 年薪40万 学妹聊起毕业后这一年来的经历时 颇有感慨 刚毕业的时候 学妹一心想进大厂 可是偏偏
  • Beautiful Soup 基本使用方法

    我们就来介绍一个强大的解析工具Beautiful Soup 它借助网页的结构和属性等特性来解析网页 有了它 我们不用再去写一些复杂的正则表达式 只需要简单的几条语句 就可以完成网页中某个元素的提取 1 简介 简单来说 Beautiful S
  • 入门级题解142. 环形链表 II

    给定一个链表 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos来表示链表尾连接到链表中的位置
  • OnnxRunTime的推理流程

    文章目录 一 torch转onnx模型 二 python下推断onnx模型 三 C 下用OnnxRunTime来推断模型 一 torch转onnx模型 用pytorch训练得到模型后 这时候需要转成onnx模型 torch提供函数 torc
  • excel将数据按某一列值分组并绘制分组折线图

    目录 一 实现按id分组 二 绘制分组折线图 今天在处理数据的时候发现了一个很巧妙的EXCEL绘制分组折现图的方法 简单记录分享一下 我的数据大概长这样 我希望实现的目标是根据产品id分组绘制不同产品的销量图 一 实现按id分组 复制产品i
  • python3.5 实现批量修改json文件中的中文字段

    改了好久才改好 关键问题编码格式 要改成gbk coding gbk import os import json 获取目标文件夹的路径 filedir os getcwd updatejson 获取文件夹中的文件名称列表 filenames
  • Axure RP暗黑色高保真中后台原型组件模板库及组件库素材

    Axure RP暗黑色高保真中后台原型组件模板库及组件库素材 黑色一直以来就可以给人以高级 神秘的语义象征 相比于浅色模式 暗色模式藏着更多可能性 色彩具有层级关系 深色会在视觉感官上自动后退 浅色部分则会向前延展 这样对比强烈的层次关系可
  • 2023网络安全毕业设计选题推荐 - 信息安全毕业设计题目大全

    文章目录 0 简介 2 如何选题 1 最新网安毕设选题 3 最后 0 简介 毕业季马上就要开始了 不少同学询问学长管理选题开题类的问题 今天跟大家分享信息安全毕设选题 最新的信息安全 网络安全 专业毕设选题 难度适中 适合作为毕业设计 大家
  • redis 由浅入深之 简介和开发环境搭建

    简介 redis是一个key value 存储系统 和Memcached类似 它支持存储的value类型相对更多 包括string 字符串 list 链表 set 集合 zset sorted set 有序集合 和hash 哈希类型 这些
  • Centos7 安装Tesseract-OCR

    第一步 依赖安装 yum install y autoconf automake libtool libjpeg libpng libtiff zlib libjpeg devel libpng devel libtiff devel zl
  • 基于时间序列的回归问题(4)——时间序列预测的基本思路

    前言 大家好 这个系列之前以及写了几篇博客 都是对于时间序列回归预测的一些前期准备知识 相信很多人 包括笔者在内 第一次接触这种项目 可能大体的思路方案都不是很清楚 那么 这么博客将为大家梳理一下做基于时间序列数据回归预测问题的大体思路 1