【数据挖掘】使用 LSTM 进行时间和序列预测

一、说明

        每天,人类在执行诸如过马路之类的任务时都会做出被动预测,他们估计汽车的速度和与汽车的距离,或者通过猜测球的速度并相应地定位手来接球。这些技能是通过经验和实践获得的。然而,由于涉及众多变量,预测天气或经济等复杂现象可能很困难。在这种情况下使用时间和序列预测,依靠历史数据和数学模型对未来趋势和模式进行预测。在本文中,我们将看到使用航空公司数据集使用数学概念进行预测的示例。

 

二、第1部分:

2.1 数学概念

        在本文使用的时间序列预测算法的上下文中,该算法不是手动计算线的斜率和截距,而是使用具有 LSTM 层的神经网络来学习时间序列数据中的基础模式和关系。神经网络在一部分数据上进行训练,然后用于对剩余部分进行预测。在该算法中,下一个时间步长的预测基于前面n_inputs的时间步长,类似于线性回归示例中使用 y(t) 预测 y(T+1) 的概念。但是,该算法中的预测不是使用简单的线性方程,而是使用 LSTM 层的激活函数生成的。激活函数允许模型捕获数据中的非线性关系,使其更有效地捕获时间序列数据中的复杂模式。

2.2 激活功能

摄影:@learnwithutsav

        LSTM 模型中使用的激活函数是整流线性单元 (ReLU) 激活函数。这种激活函数通常用于深度学习模型,因为它在处理梯度消失问题方面简单有效。在 LSTM 模型中,ReLU 激活函数应用于每个 LSTM 单元的输出,以在模型中引入非线性,并允许它学习数据中的复杂模式。ReLU 函数具有简单的阈值行为,其中任何负输入都映射到零,任何正输入都保持不变地通过,从而使其计算效率高。

三、第 2 部分:

3.1 实施

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('airline-passengers.csv', index_col='Month', parse_dates=True)
df.index.freq = 'MS'
df.shape
df.columns
plt.figure(figsize=(20, 4))
plt.plot(df.Passengers, linewidth=2)
plt.show()

        该代码导入了三个重要的库:numpy、pandas 和 matplotlib。熊猫库用于读取“航空公司乘客.csv”文件,并将“月”列设置为索引,从而允许随时间分析数据。然后,该代码使用 matplotlib 库创建一个线图,显示一段时间内的航空公司乘客数量。最后,使用“plt.show”功能显示绘图。此代码对于任何对分析时序数据感兴趣的人都很有用,它演示了如何使用 pandas 和 matplotlib 来可视化数据趋势。

nobs = 12
df_train = df.iloc[:-nobs]
df_test = df.iloc[-nobs:]
df_train.shape
df_test.shape

        此代码通过将现有时间序列数据帧“df”拆分为训练集和测试集来创建两个新的数据帧“df_train”和“df_test”。“nobs”变量设置为 12,这意味着“df”的最后 12 个观测值将用于测试,而其余数据将用于训练。训练集存储在“df_train”中,由“df”中除最后12行以外的所有行组成,而测试集存储在“df_test”中,仅由“df”的最后12行组成。然后使用“shape”属性打印每个数据框中的行数和列数,从而确认拆分正确完成。此代码通过将时序数据拆分为两组,可用于准备用于建模和测试目的的时序数据。

3.2 模型架构

图片来源:@learnwithutsav

from keras.preprocessing.sequence import TimeseriesGenerator
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(df_train)
scaled_train = scaler.transform(df_train)
scaled_test = scaler.transform(df_test)
n_inputs = 12
n_features = 1
generator = TimeseriesGenerator(scaled_train, scaled_train, length = n_inputs, batch_size =1)

for i in range(len(generator)):
    X, y = generator[i]
    print(f' \n {X.flatten()} and {y}')

        此代码片段演示了如何使用 Keras 的“TimeseriesGenerator”类和 scikit-learn 的“MinMaxScaler”类为时间序列预测模型生成输入和输出数组。代码首先创建“MinMaxScaler”类的实例,并将其拟合到训练数据集(“df_train”),以便缩放数据。然后将缩放后的数据存储在“scaled_train”和“scaled_test”数据框中。时间步长数 ('n_inputs“) 设置为 12,要素数 ('n_features') 设置为 1。使用“scaled_train”数据创建“TimeseriesGenerator”对象,窗口长度为“n_inputs”,批大小为 1。最后,循环用于迭代“生成器”对象并打印出每个时间步的输入和输出数组。“X”和“y”变量分别表示每个时间步长的输入和输出数组。“flatten()”方法用于将输入数组转换为一维数组,以便于打印。总体而言,此代码对于准备使用滑动窗口方法预测模型的时间序列数据非常有用。

X.shape

此代码返回数组或矩阵“X”的形状。“shape”属性是 NumPy 数组的一个属性,并返回一个表示数组维度的元组。该代码没有提供任何其他上下文,因此不清楚“X”的形状是什么。输出将采用以下格式(行、列)。

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM

model = Sequential()
model.add(LSTM(200, activation='relu', input_shape = (n_inputs, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

model.summary()

        此代码演示如何使用 Keras 创建用于时间序列预测的 LSTM 神经网络模型。首先,导入必要的 Keras 类,包括“顺序”、“密集”和“LSTM”。该模型被创建为“顺序”对象,并添加了一个包含 200 个神经元、“relu”激活函数以及由“n_inputs”和“n_features”定义的输入形状的 LSTM 层。然后将 LSTM 层输出传递到具有单个输出神经元的“密集”层。该模型使用“adam”优化器和均方误差(“mse”)损失函数进行编译。'summary()' 方法用于显示架构的摘要,包括参数的数量以及每层输入和输出张量的形状。此代码可用于创建用于时间序列预测的 LSTM 模型,因为它提供了一个易于遵循的示例,可以适应不同的数据集和预测问题。

3.3 训练阶段

model.fit(generator, epochs = 50)

        此代码使用 Keras 中的“fit()”方法训练 LSTM 神经网络模型 50 个 epoch。“TimeseriesGenerator”对象生成成批的输入/输出对,供模型学习。'fit()' 方法使用基于模型编译期间定义的损失函数和优化器的反向传播来更新模型参数。通过训练模型,它学习根据训练数据中学习的模式对新的、看不见的数据进行预测。

plt.plot(model.history.history['loss'])

last_train_batch = scaled_train[-12:]

last_train_batch = last_train_batch.reshape(1, 12, 1)

last_train_batch

model.predict(last_train_batch)

此代码使用经过训练的 LSTM 神经网络模型对新数据点进行预测。从训练数据中选择、缩放并调整为模型的适当格式。在模型上调用“predict()”方法,将重塑的数据作为输入,输出是时间序列中下一个时间步长的预测值。这是使用 LSTM 模型进行时间序列预测的重要步骤。

<span style="background-color:#f9f9f9"><span style="color:#242424">scaled_test[0]</span></span>

此代码打印缩放测试数据数组的第一个元素。“scaled_test”变量是使用“MinMaxScaler”对象转换的测试数据的 NumPy 数组。打印此数组的第一个元素将显示测试数据中第一个时间步长的缩放值。

3.4 预测

y_pred = []

first_batch = scaled_train[-n_inputs:]
current_batch = first_batch.reshape(1, n_inputs, n_features)

for i in range(len(scaled_test)):
    batch = current_batch
    pred = model.predict(batch)[0]
    y_pred.append(pred)
    current_batch = np.append(current_batch[:,1:, :], [[pred]], axis = 1)


y_pred


scaled_test

此代码使用经过训练的 LSTM 模型生成测试数据的预测。它使用 for 循环循环遍历缩放测试数据中的每个元素。在每次迭代中,当前批处理用于使用模型的“predict()”方法进行预测。然后将预测值添加到“y_pred”列表中,并更新当前批次。最后,将“y_pred”列表与“scaled_test”数据一起打印,以将预测值与实际值进行比较。此步骤对于评估 LSTM 模型在测试数据上的性能至关重要。

df_test

y_pred_transformed = scaler.inverse_transform(y_pred)

y_pred_transformed = np.round(y_pred_transformed,0)

y_pred_final = y_pred_transformed.astype(int)

y_pred_final

此代码使用 scaler 对象的“inverse_transform()”方法将上一步中生成的预测值转换回原始比例。转换后的值使用 'round()' 函数舍入到最接近的整数,并使用 'astype()' 方法转换为整数。打印生成的预测值数组“y_pred_final”,以显示测试数据的最终预测值。此步骤对于评估 LSTM 模型在数据原始尺度上的预测的准确性非常重要。

df_test.values, y_pred_final

df_test['Predictions'] = y_pred_final

df_test

        上面的代码显示了添加到原始测试数据集的 LSTM 模型生成的预测值。首先,“values”属性用于提取“df_test”数据帧的值,然后将其与预测值“y_pred_final”配对。然后,将一个名为“预测”的新列添加到“df_test”数据帧以存储预测值。最后,使用新添加的“预测”列打印“df_test”数据帧。此步骤对于直观地将测试数据集的实际值与预测值进行比较并评估模型的准确性非常重要。

plt.figure(figsize=(15, 6))
plt.plot(df_train.index, df_train.Passengers, linewidth=2, color='black', label='Train Values')
plt.plot(df_test.index, df_test.Passengers, linewidth=2, color='green', label='True Values')
plt.plot(df_test.index, df_test.Predictions, linewidth=2, color='red', label='Predicted Values')
plt.legend()
plt.show()

此代码块正在使用库生成绘图。它首先设置图形大小,然后将训练数据绘制为黑线,将真实测试值绘制为绿线,将预测的测试值绘制为红线。它还向绘图添加图例,并使用该方法显示图例。matplotlibshow()

3.5均方误差

        均方误差 (MSE) 是回归线与一组点的接近程度的度量。它是通过取预测值和实际值之间的平方差的平均值来计算的。MSE 的平方根称为均方根误差 (RMSE),这是预测准确性的常用度量。在此代码块中,RMSE 是使用模块中的函数和模块 中的函数计算的 。RMSE 用于评估 LSTM 模型预测的准确性与测试集中的真实值相比。mean_squared_errorsklearn.metricssqrtmath

from sklearn.metrics import mean_squared_error
from math import sqrt

sqrt(mean_squared_error(df_test.Passengers, df_test.Predictions))

        此代码计算测试集中的实际乘客值 () 与预测乘客值 () 之间的均方根误差 (RMSE)。RMSE 是评估回归模型性能的常用指标。它测量预测值和实际值之间的平均距离,同时考虑它们之间差值的平方。RMSE 是一个有用的指标,因为它对大误差的惩罚比小误差更严重,使其成为模型预测整体准确性的良好指标。df_test.Passengersdf_test.Predictions

        总之,我们在 Keras 中使用 LSTM 算法实现了时间序列预测模型。我们在每月航空公司乘客数据集上训练了模型,并使用它来预测未来 12 个月。该模型表现良好,均方根误差为 30.5。真实值、预测值和训练值的可视化表明,该模型能够捕获数据中的总体趋势和季节性。这证明了 LSTM 在捕获时间序列数据中复杂时间关系方面的强大功能及其进行准确预测的潜力。

四、结论

        本文示例是一个典型的时间序列处理办法,可以当作经典来用。读者可以多花一些时间消化该案例;事实表明,用LSTM这种工具不仅可以处理NLP,而且可以针对任何的时间序列,比如股票预测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/45098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux命令200例】chown修改文件或目录的所有者

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

iOS-持久化

目的 1.快速展示&#xff0c;提升体验 已经加载过的数据&#xff0c;用户下次查看时&#xff0c;不需要再次从网络&#xff08;磁盘&#xff09;加载&#xff0c;直接展示给用户 2.节省用户流量&#xff08;节省服务器资源&#xff09; 对于较大的资源数据进行缓存&#xf…

MonoBehaviour 组件

MonoBehaviour 组件是指继承了 MonoBehaviour 类的脚本组件&#xff0c;可以附加到游戏对象上&#xff0c;用于控制游戏对象的行为和交互。 MonoBehaviour 类是 Unity 中的一个基类&#xff0c;提供了许多方法和事件&#xff0c;用于处理输入、渲染、碰撞、协程等操作。 Unity…

vue项目启动npm run serve常见报错及解决办法

报错1&#xff1a; 如图&#xff1a; 解决方法&#xff1a;重新安装core-js , npm i core-js 报错2&#xff1a; Syntax Error: EslintPluginImportResolveError: unable to load resolver “alias”. 解决方法&#xff1a;npm install eslint-import-resolver-alias -D 报…

【数据结构和算法15】二叉树的实现

二叉树是这么一种树状结构&#xff1a;每个节点最多有两个孩子&#xff0c;左孩子和右孩子 重要的二叉树结构 完全二叉树&#xff08;complete binary tree&#xff09;是一种二叉树结构&#xff0c;除最后一层以外&#xff0c;每一层都必须填满&#xff0c;填充时要遵从先左后…

配置SQL提示

问题描述 SpringBoot工程中&#xff1a;使用Select注入的时候没有提示 例如&#xff1a; 在正常情况下&#xff1a; 在没有配置SQL提示的时候&#xff1a; 原因分析&#xff1a; 没有进行SQL配置 解决方案&#xff1a; 选中Select注入中的SQL语句&#xff0c;使用IDEA中的快…

自学网络安全(黑客)的误区

前言 网络安全入门到底是先学编程还是先学计算机基础&#xff1f;这是一个争议比较大的问题&#xff0c;有的人会建议先学编程&#xff0c;而有的人会建议先学计算机基础&#xff0c;其实这都是要学的。而且这些对学习网络安全来说非常重要。 一、网络安全学习的误区 1.不要…

Vite 4.4 正式版发布,全面拥抱 Lightning CSS

一、什么是 Vite Vite 是由 Evan You 推出的下一代前端构建工具,是官方 Vue CLI 的替代品,速度非常快。Vite 利用原生 ESM 并使用 Rollup 处理开发和打包工作。 从功能上讲,它的工作方式类似于预配置的 webpack 和 webpack-dev-server,但在速度方面具有无可比拟的优势。 …

elasticsearch报错问题

标题1.报错问题 标题2.新建一个配置类 package cn.itcast.hotel.config;import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import o…

redis 1

shell 1&#xff1a;安装1. 源码安装&#xff08;CENTOS&#xff09; 2.999:可能会出现得问题1. 编译出错 1&#xff1a;安装 1. 源码安装&#xff08;CENTOS&#xff09; 官方下载源码包 wget https://download.redis.io/redis-stable.tar.gz # 安装依赖 yum install gcc解压…

前端学习——ajax (Day4)

同步代码和异步代码 回调函数地狱和 Promise 链式调用 回调函数地狱 Promise - 链式调用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&quo…

【Linux命令200例】cmp文件比较工具

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

Tangible Software Solutions Crack

Tangible Software Solutions Crack 有形软件解决方案-最准确可靠的源代码转换器&#xff0c;在VB.NET、C#、Java、C和Python之间进行转换&#xff0c;同时节省了无数小时的艰苦工作和宝贵的时间。 主要优点&#xff1a; 节省宝贵时间 准确全面 安全-您的代码永远不会离开您的机…

HTML中的焦点管理

前言 焦点作为页面交互中的重要一环&#xff0c;涉及到的知识点也比较多&#xff0c;有必要做一个统一的总结。 HTML 中的可获取焦点的元素 具有 href 属性的 HTMLAnchorElement/HTMLAreaElement非禁用态的 HTMLInputElement/HTMLSelectElement/HTMLTextAreaElement/HTMLBut…

《零基础入门学习Python》第063讲:论一只爬虫的自我修养11:Scrapy框架之初窥门径

上一节课我们好不容易装好了 Scrapy&#xff0c;今天我们就来学习如何用好它&#xff0c;有些同学可能会有些疑惑&#xff0c;既然我们懂得了Python编写爬虫的技巧&#xff0c;那要这个所谓的爬虫框架又有什么用呢&#xff1f;其实啊&#xff0c;你懂得Python写爬虫的代码&…

RocketMQ教程-(5)-功能特性-顺序消息

顺序消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍顺序消息的应用场景、功能原理、使用限制、使用方法和使用建议。 应用场景​ 在有序事件处理、撮合交易、数据实时增量同步等场景下&#xff0c;异构系统间需要维持强一致的状态同步&#xff0c;上游的事…

JavaWeb银行项目

主要功能 实现了贷款、存款、理财、提现、充值、开户、绑卡、转账等功能。 介绍 1、这个是一个类似有支付宝一样的web项目。 2、登录和注册&#xff0c;都是通过手机号来进行的。 3、注册的新用户需要先进行开户操作&#xff0c;然后进行绑卡操作。 4、在开户的时候回给你…

Linux 学习记录57(ARM篇)

Linux 学习记录57(ARM篇) 本文目录 Linux 学习记录57(ARM篇)一、外部中断1. 概念2. 流程图框 二、相关寄存器1. GIC CPU Interface (GICC)2. GIC distributor (GICD)3. EXTI registers 三、EXTI 寄存器1. 概述2. 内部框图3. 寄存器功能描述4. EXTI选择框图5. EXTI_EXTICR1 &…

金融中的数学:贝叶斯公式

1.贝叶斯定理 贝叶斯定理是概率论中的一项重要定理&#xff0c;用于在已知某一事件的条件下&#xff0c;求另一事件发生的概率。它是根据条件概率推导出来的&#xff0c;得名于英国数学家托马斯贝叶斯。 贝叶斯定理可以表示为&#xff1a; 这个式子就是贝叶斯公式&#xff0c…

Hadoop 之 Spark 配置与使用(五)

Hadoop 之 Spark 配置与使用 一.Spark 配置1.Spark 下载2.单机测试环境配置3.集群配置 二.Java 访问 Spark1.Pom 依赖2.测试代码1.计算 π 三.Spark 配置 Hadoop1.配置 Hadoop2.测试代码1.统计字符数 一.Spark 配置 环境说明环境版本AnolisAnolis OS release 8.6Jdkjava versi…
最新文章