LSTM多步时间序列预测+区间预测(附代码实现)

2023-10-31

LSTM单步时间序列预测文章(联系方式在此文章)

(511条消息) 时间序列预测——LSTM模型(附代码实现)_lstm预测模型_噜噜啦啦咯的博客-CSDN博客

模型原理

长短时记忆网络( Long short-term memory,LSTM )是一种循环神经网络 (Recurrent neural network, RNN)的特殊变体,具有“门”结构,通过门单元的逻辑控制决定数据是否更新或是选择丢弃,克服了 RNN 权重影响过大、容易产生梯度消失和爆炸的缺点,使网络可以更好、更快地收敛,能够有效提高预测精度。LSTM 拥有三个门, 分别为遗忘门、输入门、输出门,以此决定每一时刻信息记忆与遗忘。输入门决定有多少新的信息加入到细胞当中,遗忘门控制每一时刻信息是否会被遗忘,输出门决定每一时刻是否有信息输出。其基本结构如图所示。

公式如下:

(1)遗忘门

(2)输入门

(3)单元

(4)输出门

(5)最终输出

模型实现

导入所需要的库

import matplotlib.pyplot as plt
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM,Dense,Dropout
from numpy import concatenate
from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score
from math import sqrt

设置随机数种子

import tensorflow as tf
tf.random.set_seed(2)

导入数据集

data = pd.read_csv(r'C:\Users\26255\Desktop\data.csv')

数据可视化

数据处理

归一化处理

# 特征的归一化处理
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(values)

时间序列转换为监督学习问题

#定义series_to_supervised()函数
#将时间序列转换为监督学习问题
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    
   #Frame a time series as a supervised learning dataset.
   #Arguments:
   #data: Sequence of observations as a list or NumPy array.
   #n_in: Number of lag observations as input (X).
   #n_out: Number of observations as output (y).
   #ropnan: Boolean whether or not to drop rows with NaN values.
   #Returns:
   #Pandas DataFrame of series framed for supervised learning.
   
    n_vars = 1 if type(data) is list else data.shape[1]
    df = DataFrame(data)
    cols, names = list(), list()
    # input sequence (t-n, ... t-1)
    for i in range(n_in, 0, -1):
        cols.append(df.shift(i))
        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
        # forecast sequence (t, t+1, ... t+n)
    for i in range(0, n_out):
        cols.append(df.shift(-i))
        if i == 0:
            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
        else:
            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
    # put it all together
    agg = concat(cols, axis=1)
    agg.columns = names
    # drop rows with NaN values
    if dropnan:
        agg.dropna(inplace=True)
    return agg

设置步数

n_in = 10
n_out = 10
n_out_fin = n_out - 1
reframed = series_to_supervised(scaled, n_in, n_out)

划分训练集和测试集

values = reframed.values
trainNum = int(len(values) * 0.7)  # 350
train = values[:trainNum, :]  # 前350
test = values[trainNum:, :]  # 后150

改变数据维度

print(train_X.shape, train_y.shape)
print(test_X.shape, test_y.shape)

搭建LSTM模型

初始化LSTM模型

设置神经元核心的个数,迭代次数,优化器等等

# define model
model = Sequential()
model.add(LSTM(100, return_sequences=True))
model.add(Dropout(0.1))
model.add(LSTM(100))
model.add(Dropout(0.1))
model.add(Dense(n_out))
model.compile(optimizer='adam', loss='mse', metrics=['mse'])
history = model.fit(train_X, train_y, epochs=100, batch_size=10, validation_data=(test_X, test_y), verbose=2,shuffle=False)

画出损失函数

模型预测

y_predict = model.predict(test_X)

评价指标

# 回归评价指标
# calculate MSE 均方误差
mse = mean_squared_error(inv_y, inv_y_predict[:, n_out_fin])
# calculate RMSE 均方根误差
rmse = sqrt(mean_squared_error(inv_y, inv_y_predict[:, n_out_fin]))
# calculate MAE 平均绝对误差
mae = mean_absolute_error(inv_y, inv_y_predict[:, n_out_fin])
# calculate R square
r_square = r2_score(inv_y, inv_y_predict[:, n_out_fin])
print('均方误差MSE: %.6f' % mse)
print('均方根误差RMSE: %.6f' % rmse)
print('平均绝对误差MAE: %.6f' % mae)
print('R_square: %.6f' % r_square)

滚动预测

传入最新收集到的数据,进行往后滚动预测,得到未来数据,与原数据进行拼接并将其可视化

获得置信区间

可以计算预测误差的标准差,然后利用该标准差计算置信区间。

标准差

标准差是指一组数据的离散程度的度量,它表示数据集中的数据偏离平均值的程度。标准差越大,表示数据越分散;标准差越小,表示数据越集中。

计算标准差的具体步骤如下:

  1. 计算平均值。将数据集中的所有数值相加,然后除以数据的个数,即可得到平均值。

  1. 计算每个数据与平均值的差值。将数据集中的每个数值与平均值进行减法运算,得到每个数据与平均值之间的差值。

  1. 计算差值的平方。将第二步得到的差值依次平方,即得到每个数据与平均值之间的差值的平方。

  1. 计算平方和。将第三步得到的差值的平方相加,即得到平方和。

  1. 计算方差。将平方和除以数据的个数,即得到方差。

  1. 计算标准差。将方差的平方根即为标准差。

用公式表示,假设有N个数据,数据集为{x1, x2, ..., xn},平均值为μ,标准差为σ,则:

μ = (x1 + x2 + ... + xn) / N

σ = sqrt[( (x1 - μ)^2 + (x2 - μ)^2 + ... + (xn - μ)^2 ) / N]

其中,sqrt表示平方根运算。

具体步骤

  1. 选择合适的回归模型。

  1. 计算模型的预测误差。使用模型来预测每天结果,然后将实际结果数量与预测结果数量进行比较,计算误差。计算每日的误差后,可以计算误差的标准差,该标准差代表了模型的预测误差大小。

  1. 计算置信区间。使用标准正态分布表来查找95%置信水平对应的z值,通常是1.96。然后将该值乘以预测误差的标准差,从而得到置信区间的半宽度。最后,将半宽度加上和减去预测结果的平均值,即可得到95%置信区间的上限和下限。

举个例子,如果使用线性回归模型拟合数据,得到每日报告结果数量的预测值为y=10+2x,其中x是从2023年1月1日到3月1日的天数。如果在过去的记录中,每日报告结果数量的标准差为s=3,那么95%置信区间的上限和下限可以计算如下:

z=1.96 (95%置信水平对应的z值)halfwidth = z * s = 1.96 * 3 = 5.88 (置信区间的半宽度)预测结果的平均值为y=10+2*60=130置信区间的上限为130+5.88=135.88置信区间的下限为130-5.88=124.12

因此,该模型预测2023年3月1日报告结果数量的95%置信区间为[124.12, 135.88]。这意味着,我们可以合理地期望2023年3月1日的报告结果数量在这个区间内。

应用实例

将其应用在此数据集中,得到预测误差的标准差:

std_error = np.std(train_y - model.predict(train_X))
print("Standard deviation of prediction error: ", std_error)

计算得到的标准差即为预测误差的标准差。

最后,我们可以利用该标准差来计算置信区间。假设我们希望计算95%的置信区间,我们可以使用scipy.stats.norm库中的ppf()函数来计算正态分布的分位数,然后计算置信区间的上下限:

from scipy.stats import norm

z = norm.ppf(0.975)
lower_bound = future_predict[:, n_out_fin] - z * std_error
upper_bound = future_predict[:, n_out_fin] + z * std_error

print("95% confidence interval: ({:.2f}, {:.2f})".format(lower_bound[0], upper_bound[0]))

其中,ppf()函数的参数0.975表示95%置信度对应的分位数。计算得到的上下限即为置信区间。

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

LSTM多步时间序列预测+区间预测(附代码实现) 的相关文章

  • python - 如何删除每行中的重复列表(pandas)?

    我的每一行中都包含一个列表 我想通过保留分数中的最高值来删除重复元素 这是我的数据框 df1 中的数据 pair score 0 A A 1 0000 1 A F 0 9990 2 A G 0 9985 3 A G 0 9975 4 A H
  • 在二维数组中进行所有可能的组合

    我正在尝试制作具有所有可能组合的 4x4 16 像素黑白图像数组 我制作了以下数组作为模板 template 0 0 0 0 start with all white pixels 0 0 0 0 0 0 0 0 0 0 0 0 然后我想迭
  • 需要根据数据框中的行号应用不同的公式

    我正在努力在数据框中找到某种移动平均值 该公式将根据正在计算的行数而变化 实际场景是我需要计算Z列 Edit 2 以下是我正在使用的实际数据 Date Open High Low Close 0 01 01 2018 1763 95 176
  • 使用ideone时如何传入命令行参数?

    我正在使用 ideone 在线解释器 http ideone com http ideone com 来测试一些 C 和 Python 程序 如何指定命令行参数而不是使用 STDIN 输入 看起来你不能 但是快速破解应该做的伎俩 stati
  • 是否可以在 IPython 控制台中显示 pandas 样式?

    是否可以显示熊猫风格 https pandas pydata org pandas docs stable user guide style html在 iPython 控制台中 Jupyter 笔记本中的以下代码 import panda
  • 删除 tkinter 文本默认绑定

    我正在制作一个简单的 tkinter 文本编辑器 但我想要所有默认绑定文本小部件如果可能的话删除 例如当我按Ctrl i它默认插入一个制表符 我制作了一个事件绑定来打印文本框中有多少行 我将事件绑定设置为Ctrl i以及 当我运行它时 它会
  • 在 python 中发送标头[重复]

    这个问题在这里已经有答案了 我有以下 python 脚本 我想发送 假 标头信息 以便我的应用程序就像 Firefox 一样运行 我怎么能这么做呢 import urllib urllib2 cookielib username passw
  • 为什么我会收到 ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

    以下代码给出了值错误 major males for row in recent grads if recent grads Men gt recent grads Women major males append recent grads
  • Python Apache Beam 端输入断言错误

    我对 Apache Beam Cloud Dataflow 还很陌生 所以如果我的理解不正确 我深表歉意 我正在尝试通过管道读取大约 30 000 行长的数据文件 我的简单管道首先从 GCS 打开 csv 从数据中提取标题 通过 ParDo
  • lmfit模型拟合然后预测

    我正在领养lmfit进行曲线拟合并使用拟合模型进行预测 然而下面的代码并没有达到我想要的效果 能否请你帮忙 谢谢 import numpy as np from lmfit import Model def linearModel x a0
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • matplotlib vlines 图中未应用 y 轴的最小值

    我正在 matplotlib 中绘制 vlines 图 数据集中的所有 y 值如下 gt 0 我希望 y 轴最底部的刻度能够读取0 但相反 我得到 500 这是代码 usr bin env python import numpy as np
  • ImproperlyConfigured at / 不允许空静态前缀 - Django

    我正在使用 Django 上传 显示图像 该网站部署在 Heroku 上 下列的this https coderwall com p bz0sng教程我能够成功上传图像 但是 图像并未显示在模板中 然后我了解到我的 urls py 末尾应该
  • Pygame:有人可以帮我实现双跳吗?

    我知道已经有其他关于此问题的帖子了 但我的运动系统与我发现的有点不同 所以随后我问这个问题 我的运动系统基于一个名为的命名元组Move up left right down 然后就是这个 def update self move block
  • Kivy TextInput 水平和垂直对齐(文本居中)

    如何在 Kivy 的 TextInput 中水平居中文本 I have the following screen But I want to centralize my text like this 这是我的 kv 语言的一部分 BoxLa
  • 在自定义 keras 层的调用函数中传递附加参数

    我创建了一个自定义 keras 层 目的是在推理过程中手动更改前一层的激活 以下是基本层 它只是将激活值乘以一个数字 import numpy as np from keras import backend as K from keras
  • JSONDecodeError:额外数据:Python [重复]

    这个问题在这里已经有答案了 我使用以下代码从文件加载 json file file name obj list with open file as f for json obj in f obj list append loads json
  • 将函数按元素应用于两个 DataFrame

    如何应用函数z ij f x ij y ij 来自数据框X and Y相同大小并将结果保存到 DataFrameZ 这取决于你有什么样的功能 很多功能已经被矢量化为数据框 例如 等等 所以对于这些功能 你可以简单地做Z X Y or Z X
  • 将二进制数转换为包含每个二进制数的数组

    我试图将二进制值转换为每个 1 0 的列表 但我得到默认的二进制值而不是列表 我有一个字符串 我将每个字符转换为二进制 它给了我一个列表 其中每个字符都有一个字符串 现在我试图将每个字符串拆分为值为 0 1 的整数 但我什么也得不到 if

随机推荐

  • esp学习笔记一环境搭建

    文章目录 开发板资料 环境安装 编译程序 wsl终端 开发板资料 https docs espressif com projects esp idf zh CN latest get started get started devkitc
  • eladmin代码生成详细过程

    eladmin代码生成详细过程 笔记介绍 大家好 这里是千寻简笔记 我是作者星辰 笔记内容整理并发布 内容有误请指出 笔记源码已开源 前往Gitee搜索 chihiro notes 感谢您的观看 作者各大平台直链 GitHub Gitee
  • 基于Android网上在线学生选课系统

    老师要求 1 调研了解学生选课的流程 并做好需求分析 2 APP模式 3 设计角色 学生 工作人员等 4 工作人员管理课程信息 教师信息 学生信息 选课信息等 设置选课时间 选课班级等 5 学生登录 选课 查询成绩等 6 扩展功能 短信提示
  • windows scp下载较大文件出错

    在 ssh config中加入 Host 断开时重试连接的次数 ServerAliveCountMax 10 每隔30秒自动发送一个空的请求以保持连接 ServerAliveInterval 30 参考 https zhuanlan zhi
  • idea 2023.1设置:字体设置及自动调整大小

    一 原界面截图 二 修改字体设置 2 1 Font设置字体及大小 与下面相比 能调整字体和行高 2 2 鼠标滚轮调整字体大小 与上面相比 Ctrl 滑轮 只能调整字体大小 如果找不到 可直接搜 wheel 三 修改后界面截图 组合键在修改字
  • 《算法二》选择排序算法及它的时间复杂度

    1 选择排序算法 选择排序算法的时间复杂度为O N 2 选择排序算法规则 1 指定位置的数和后面的数比较 2 如果指定位置的数大 则两个数交换位置 3 向后移动一个位置 和指定位置的数进行比较 假设数组大小 n 第一轮比较n 1次 最小的数
  • 【如何训练一个中英翻译模型】LSTM机器翻译模型部署之ncnn(python)(五)

    系列文章 如何训练一个中英翻译模型 LSTM机器翻译seq2seq字符编码 一 如何训练一个中英翻译模型 LSTM机器翻译模型训练与保存 二 如何训练一个中英翻译模型 LSTM机器翻译模型部署 三 如何训练一个中英翻译模型 LSTM机器翻译
  • Pytorch 基础之张量合并与分割

    本次介绍一下 Tensor 张量合并与分割常用的一些方法 1 torch cat tensors dim 0 out None Tensor 方法释义 对除了要合并维度之外 其它维度 shape 都一样的 tensor 序列 数组或列表 进
  • 新手学习须注意的问题

    注意事项 1 最新版本的MDK软件Keil的编译器版本已更新到v6 且与v5版本不兼容 之前老的项目编译使用v6版编译器都会出错 建议使用老版本的Keil 如v5 36等 单纯安装v5版本的编译器比较麻烦 Keil v536同时自带v5 v
  • linux用rdate命令实现同步时间

    author skate time 2010 05 07 用rdate命令实现同步时间 前两天说到用ntp时间服务器和ntpdate命令同步时间 今天简单记录下用rdate同步时间 http blog csdn net wyzxg arch
  • Webplus网站群管理平台介绍

    简介 Webplus网站群管理平台采用模块化设计 无需用户编程 便可轻松规划 建设一个或多个功能强大的动态信息门户网站 可以同时建立多个信息相关联的网站 所有网站制作和管理均基于统一的身份认证 简单而实用的流程管理 可以做到单个网站的多部门
  • Long类型雪花算法ID返回前端后三位精度缺失问题解决

    目录 一 问题描述 二 问题复现 1 Maven依赖 2 application yml 配置 3 DemoController java 4 snowflakePage html 页面 5 DemoControllerAdvice jav
  • matlab用抛物线族表示马鞍面,matlab画马鞍面

    118 125 H sig ci ttest x 115 H sig ci ttest y 115 h sig ci ttest2 x y 1 在同一平面中的两个窗口分别画出心形线和马鞍面 的图形 例如 螺旋曲线 以及难以靠手工绘制得到理想
  • 自媒体、短视频博主都在用这5个免费视频网站

    相信不少朋友在剪辑短视频的的时候 不是因为技术不过关 而是没有合适的素材 没有素材情况下 第一想到的就是百度找素材网站 好不容易找到可能还需收费 如果你要是在剪辑的时候没有素材 那么可以看看我推荐的这个几个网站 基本都是可以免费下载的 对你
  • Matlab:数据拟合工具箱与实例

    Matlab 数据拟合工具箱与实例 Matlab 的数据拟合工具箱 Curve Fitting Toolbox 是一个非常实用的工具 可以帮助研究人员和工程师解决各种数据拟合问题 该工具箱包含了多个经典的数据拟合算法 例如最小二乘法 非线性
  • soso313.cn、dao234.com等劫持浏览器,tlntsvi_1547.exe、ydzyh.exe、scvhost.exe等做怪

    soso313 cn dao234 com等劫持浏览器 tlntsvi 1547 exe ydzyh exe scvhost exe等做怪 一位网友的电脑中了病毒 用超级巡警查杀后 每次开机进入Windows桌面后都会弹出对话框 提示找不到
  • 2021年IDEA通过jdbc连接MySql的方式

    很崩溃的几天 这篇文章解决一个问题 在运行 Class forName com mysql cj jdbc Driver 时报错 java lang ClassNotFoundException com mysql cj jdbc Driv
  • 使用YAML代替Properties

    23 6 使用YAML代替Properties YAML是JSON的一个超集 也是一种方便的定义层次配置数据的格式 无论你何时将SnakeYAML 库放到classpath下 SpringApplication类都会自动支持YAML作为pr
  • websocket心跳的实现(包括全部代码)

    本文主要讲的是如果设计websocket心跳已经需要考虑哪些问题 前言 在使用websocket的过程中 有时候会遇到客户端网络关闭的情况 而这时候在服务端并没有触发onclose事件 这样会 多余的连接 服务端会继续给客户端发数据 这些数
  • LSTM多步时间序列预测+区间预测(附代码实现)

    LSTM单步时间序列预测文章 联系方式在此文章 511条消息 时间序列预测 LSTM模型 附代码实现 lstm预测模型 噜噜啦啦咯的博客 CSDN博客 模型原理 长短时记忆网络 Long short term memory LSTM 是一种