LSTM实例解析

大家好,这里是七七,今天带给大家的实例解析。以前也用过几次LSTM模型,但由于原理不是很清楚,因此不能清晰地表达出来,这次用LSTM的时候,去自习研究了原理以及代码,来分享给大家此次经历。


一、简要介绍

由于RNN(循环神经网络)模型的梯度消失现象,会导致RNN模型的失效,因此人们对RNN的隐含层神经元进行改造,便有了LSTM(长度期记忆)模型。

至于对RNN的修改,可参考循环神经网络(RNN)-CSDN博客

 本文来重点介绍这次实现过程中的代码

二、代码部分

1、数据预处理

在构建模型之前,需要先收集数据,并将各种数据存储在表格中,并用python代码导入,这部分是基础部分,与建模无关,就不展示具体代码了。

在搜集了数据之后,我们一般会对数据进行划分,分为训练集和测试集,训练集是来训练模型,测试集是用来测试模型的可信程度。

当不同特征数据的数量级差距比较大时,我们可以对数据进行归一化,从而使得不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

而要标准化的具体原因,可看这一部分机器学习——回归_机器学习 回归-CSDN博客

下面这段代码是预处理的过程:

  1. 提取文件数据中的特征数据
  2. 对数据进行归一化处理
  3. 划分测试集与训练集
# 数据预处理
feature_cols = df.columns[:4]
target_col = df.columns[4]# 提取特征和目标变量
features = df[feature_cols].values
target = df[target_col].values.reshape(-1, 1)# 将特征和目标变量分别缩放到 0 到 1 之间
scaler_features = MinMaxScaler(feature_range=(0, 1))
scaler_target = MinMaxScaler(feature_range=(0, 1))scaled_features = scaler_features.fit_transform(features)
scaled_target = scaler_target.fit_transform(target)# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(scaled_features, scaled_target, test_size=0.2, random_state=42)

2、添加时间步长

时间步长用于确定模型在观察数据时每次考虑多少个时间点的信息,这里我们设置其为1,并将时间步长加入数据中。

# 定义时间步长
n_steps = 1# 为训练集和测试集添加时间步长
X_train = X_train.reshape((X_train.shape[0], n_steps, X_train.shape[1]))
X_test = X_test.reshape((X_test.shape[0], n_steps, X_test.shape[1]))

3、构建CNN-LSTM模型

这一步就是单纯地设置模型各个层次的参数了。

  1. 首先创建一个序列,用以之后向里面加入各层
  2. 然后加入一个卷积层,设置参数:卷积核数量为32,卷积核大小为3,padding方式为’same’,步长为1,激活函数为ReLU,并指定输入数据的形状
  3. 添加池化层,设置参数:一维最大池化层,池化窗口大小为1
  4. 添加一个LSTM层,设置参数:设置神经元数量为16,输出完整的序列
  5. 添加一个LSTM层,设置参数:设置神经元数量为8,只输出最后一个时间步的输出
  6. 添加一个全连接层,输出维度为1.
  7. 编译模型,使用均方误差作为损失函数,Adam优化器用于优化模型参数。
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, padding='same', strides=1, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(MaxPooling1D(pool_size=1))
model.add(LSTM(16, return_sequences=True))
model.add(LSTM(8, return_sequences=False))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')

 4、训练模型

这一步就是用我们上面处理好的数据投入模型,就可以进行训练,很简单,就不解释了

# 训练模型,并保存训练历史
history = model.fit(X_train, y_train, epochs=100, batch_size=4, shuffle=False, validation_data=(X_test, y_test))

至此,模型已经训练好了,下一步就需要先对模型进行检测,查看可信度。

5、模型检测

这里我们用多个检测,保证模型是准确的

5.1、rmse检测

这里我们用RMSE来作为检测指标

首先将训练集和测试集输入模型,得到预测结果。由于我们的模型对数据进行了归一化,因此还要对预测数据和原始数据进行反归一化操作之后,再来计算rmse的值。

# 预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)# 反向缩放预测值
train_predict = scaler_target.inverse_transform(train_predict)
y_train = scaler_target.inverse_transform(y_train)
test_predict = scaler_target.inverse_transform(test_predict)
y_test = scaler_target.inverse_transform(y_test)# 计算RMSE
train_score = mean_squared_error(y_train, train_predict, squared=False)
print('Train Score: %.2f RMSE' % (train_score))
print(r2_score(y_train,train_predict) )
test_score = mean_squared_error(y_test, test_predict, squared=False)
print('Test Score: %.2f RMSE' % (test_score))
print(r2_score(y_test,test_predict))
# 绘制图像
plt.figure(1, figsize=(12, 6), dpi=80)
plt.plot(history.history['loss'], label='Train')
plt.plot(history.history['val_loss'], label='Validation')
plt.title('Loss Curve')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

此段代码还输出了rmse的loss图像,代表着训练过程中的损失值的变化。我们这里可以明显看出,损失值明显减小且接近0.

5.2预测数据与原始数据对比

这部分是将原始数据作为输入,得到图像,对比。

# 对特征数据进行缩放
scaled_feature_data = scaler_features.transform(features)# 将数据转换成模型期望的形状
scaled_feature_data = scaled_feature_data.reshape((scaled_feature_data.shape[0], n_steps, scaled_feature_data.shape[1]))# 使用模型进行预测
predicted_output = model.predict(scaled_feature_data)# 反向缩放预测值
predicted_output = scaler_target.inverse_transform(predicted_output)plt.figure(2, figsize=(12, 6), dpi=80)
plt.plot(df.index, target, color='k', label='真实值')  # 使用数据的索引作为横坐标
plt.plot(df.index, predicted_output, color='blue', label='预测值')  # 使用数据的索引作为横坐标
plt.xlabel('时间戳', fontsize=20)
plt.ylabel('碳排放量', fontsize=20)
plt.tick_params(labelsize=20)
plt.legend(fontsize=20)
plt.savefig("真实值和预测值对比.svg", dpi=80, format="svg")
plt.show()

5.3计算MAPE值

这部分就不解释了,单纯的实现了公式

# 计算MAPE
def mean_absolute_percentage_error(y_true, y_pred):y_true, y_pred = np.array(y_true), np.array(y_pred)return np.mean(np.abs((y_true - y_pred) / y_true)) * 100train_mape = mean_absolute_percentage_error(y_train, train_predict)
test_mape = mean_absolute_percentage_error(y_test, test_predict)print('Train MAPE: %.2f' % train_mape)
print('Test MAPE: %.2f' % test_mape)

 6、预测

这部分代码是用模型和输入数据,获得预测的输出数据。


prediction_data_path = r'C:\Users\Administrator\Desktop\统计建模\数据\数据集1\cnn-lstm预测得到的数据.xlsx'
prediction_df = pd.read_excel(prediction_data_path)# 提取特征
prediction_features = prediction_df.iloc[:, :4].values# 特征缩放
scaled_prediction_features = scaler_features.transform(prediction_features)# 重塑数据形状
scaled_prediction_features = scaled_prediction_features.reshape((scaled_prediction_features.shape[0], n_steps, scaled_prediction_features.shape[1]))# 进行预测
predictions = model.predict(scaled_prediction_features)# 反向缩放预测结果
unscaled_predictions = scaler_target.inverse_transform(predictions)# 假设你希望将结果保存到一个新的 Excel 文件中
output_path = r'C:\Users\Administrator\Desktop\统计建模\数据\数据集1\预测结果.xlsx'
prediction_df['预测结果'] = unscaled_predictions
prediction_df.to_excel(output_path, index=False)# 或者你也可以直接打印预测结果
print("预测结果:", unscaled_predictions)

三、总代码展示

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.model_selection import train_test_split
from keras.layers import Conv1D, MaxPooling1D
from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScalerplt.rcParams['font.sans-serif']=[u'simHei']
plt.rcParams['axes.unicode_minus']=False# 读取数据
file_path = r'C:\Users\Administrator\Desktop\统计建模\数据\数据集1\用于sp模型的数据.xlsx'
df = pd.read_excel(file_path)#预测
path =r'C:\Users\Administrator\Desktop\统计建模\数据\数据集1\cnn-lstm预测得到的数据.xlsx'# 数据预处理
feature_cols = df.columns[:4]
target_col = df.columns[4]# 提取特征和目标变量
features = df[feature_cols].values
target = df[target_col].values.reshape(-1, 1)# 将特征和目标变量分别缩放到 0 到 1 之间
scaler_features = MinMaxScaler(feature_range=(0, 1))
scaler_target = MinMaxScaler(feature_range=(0, 1))scaled_features = scaler_features.fit_transform(features)
scaled_target = scaler_target.fit_transform(target)# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(scaled_features, scaled_target, test_size=0.2, random_state=42)# 定义时间步长
n_steps = 1# 为训练集和测试集添加时间步长
X_train = X_train.reshape((X_train.shape[0], n_steps, X_train.shape[1]))
X_test = X_test.reshape((X_test.shape[0], n_steps, X_test.shape[1]))# 搭建CNN-LSTM融合神经网络
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=3, padding='same', strides=1, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(MaxPooling1D(pool_size=1))
model.add(LSTM(16, return_sequences=True))
model.add(LSTM(8, return_sequences=False))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')# 训练模型,并保存训练历史
history = model.fit(X_train, y_train, epochs=100, batch_size=4, shuffle=False, validation_data=(X_test, y_test))prediction_data_path = r'C:\Users\Administrator\Desktop\统计建模\数据\数据集1\cnn-lstm预测得到的数据.xlsx'
prediction_df = pd.read_excel(prediction_data_path)# 提取特征
prediction_features = prediction_df.iloc[:, :4].values# 特征缩放
scaled_prediction_features = scaler_features.transform(prediction_features)# 重塑数据形状
scaled_prediction_features = scaled_prediction_features.reshape((scaled_prediction_features.shape[0], n_steps, scaled_prediction_features.shape[1]))# 进行预测
predictions = model.predict(scaled_prediction_features)# 反向缩放预测结果
unscaled_predictions = scaler_target.inverse_transform(predictions)# 假设你希望将结果保存到一个新的 Excel 文件中
output_path = r'C:\Users\Administrator\Desktop\统计建模\数据\数据集1\预测结果.xlsx'
prediction_df['预测结果'] = unscaled_predictions
prediction_df.to_excel(output_path, index=False)# 或者你也可以直接打印预测结果
print("预测结果:", unscaled_predictions)# 预测
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)# 反向缩放预测值
train_predict = scaler_target.inverse_transform(train_predict)
y_train = scaler_target.inverse_transform(y_train)
test_predict = scaler_target.inverse_transform(test_predict)
y_test = scaler_target.inverse_transform(y_test)# 计算RMSE
train_score = mean_squared_error(y_train, train_predict, squared=False)
print('Train Score: %.2f RMSE' % (train_score))
print(r2_score(y_train,train_predict) )
test_score = mean_squared_error(y_test, test_predict, squared=False)
print('Test Score: %.2f RMSE' % (test_score))
print(r2_score(y_test,test_predict))
# 绘制图像
plt.figure(1, figsize=(12, 6), dpi=80)
plt.plot(history.history['loss'], label='Train')
plt.plot(history.history['val_loss'], label='Validation')
plt.title('Loss Curve')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()# 对特征数据进行缩放
scaled_feature_data = scaler_features.transform(features)# 将数据转换成模型期望的形状
scaled_feature_data = scaled_feature_data.reshape((scaled_feature_data.shape[0], n_steps, scaled_feature_data.shape[1]))# 使用模型进行预测
predicted_output = model.predict(scaled_feature_data)# 反向缩放预测值
predicted_output = scaler_target.inverse_transform(predicted_output)plt.figure(2, figsize=(12, 6), dpi=80)
plt.plot(df.index, target, color='k', label='真实值')  # 使用数据的索引作为横坐标
plt.plot(df.index, predicted_output, color='blue', label='预测值')  # 使用数据的索引作为横坐标
plt.xlabel('时间戳', fontsize=20)
plt.ylabel('碳排放量', fontsize=20)
plt.tick_params(labelsize=20)
plt.legend(fontsize=20)
plt.savefig("真实值和预测值对比.svg", dpi=80, format="svg")
plt.show()# 计算MAPE
def mean_absolute_percentage_error(y_true, y_pred):y_true, y_pred = np.array(y_true), np.array(y_pred)return np.mean(np.abs((y_true - y_pred) / y_true)) * 100train_mape = mean_absolute_percentage_error(y_train, train_predict)
test_mape = mean_absolute_percentage_error(y_test, test_predict)print('Train MAPE: %.2f' % train_mape)
print('Test MAPE: %.2f' % test_mape)
# 绘制MAPE图像
plt.figure(figsize=(12, 6), dpi=80)
plt.plot(y_test, label='真实值')
plt.plot(test_predict, label='预测值')
plt.title('MAPE图像')
plt.xlabel('样本编号')
plt.ylabel('碳排放量')
plt.legend()
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT‑4o普通账户也可以免费用

网址 https://chatgpt.com/ 试了一下,免费的确实显示GPT‑4o的模型,问了一下可以联网,不知道能不能通过插件出图 有兴趣的可以试试

3.6 enum枚举类型

本节必须掌握的知识点: 示例十一 代码分析 汇编解析 3.6.1 示例十一 enum定义枚举类型,它本质是一种整数类型(等同int)。所谓枚举就是一一列举的意思。在实际应用中,一个星期有七天,一年有十二个月等。如…

FBB-Frontiers in Bioengineering and Biotechnology

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 Frontiers in Bioengineering and Biotechnology是专注生物工程和生物技术领域的开放获取期刊。 研究范围涵盖生物材料、生物力学、生物工艺工程、生物安全和生物安保,生物传…

SpringCloud(1)-Eureka相关配置

1.新建Module-注册中心 作为注册中心 1.1配置 pom.xml <!-- 引入 eureka-server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency&g…

面向对象-----继承

前面向大家介绍了面向对象中的封装性&#xff0c;今天再来向大家介绍面向对象的继承和多态的两大特性。 1.继承 1.1 为什么需要继承&#xff1f; 在java语言中&#xff0c;我们用类来描述世间万物&#xff0c;虽然万物非常复杂&#xff0c;但总有一些共同点&#xff0c;如果…

【贪心算法题目】

1. 柠檬水找零 这一个题目是一个比较简单的模拟算法&#xff0c;只需要根据手里的钱进行找零即可&#xff0c;对于贪心的这一点&#xff0c;主要是在20元钱找零的情况下&#xff0c;此时会出现两种情况&#xff1a;10 5 的组合 和 5 5 5 的组合&#xff0c;根据找零的特点&a…

网络模型-Qinq配置与应用

Qinq配置与应用 通过配置Qinq来实现利用公网提供的VLAN100使企业1互通&#xff0c;利用公网提供的VLAN200使企业2互通不同企业之间互相隔离。并通过在连接其它厂商设备的接口上配置修改0in0外层VLAN Tag的TPID值&#xff0c;来实现与其它厂商设备的互通。 一、创建VLAN #在Swi…

C - Sigma Problem(AtCoder Beginner Contest 353)

题目的链接: C - Sigma Problem (atcoder.jp) 题目&#xff1a; 样例&#xff1a; 题目大致含意: 给你n个数&#xff0c;让你对这n个数进行操作&#xff0c;比如当前是第i个&#xff0c;那么让a[i] 和 后面的每个数进行相加, 例如a[i] a[i 1] 注意的是a[i] a[i 1]的结果…

Stable Diffusion 3报告

报告链接&#xff1a;Stable Diffusion 3: Research Paper — Stability AI 文章目录 要点表现架构细节通过重新加权改善整流流量Scaling Rectified Flow Transformer Models灵活的文本编码器RF相关论文 引言 随着人工智能技术的飞速发展&#xff0c;文本到图像生成领域正经…

【map、set】C++用红黑树来封装map、set容器

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解map和set之用红黑树来封装map、set容器的相关内容。 如果看到最后您…

CasaOS系统玩客云安装内网穿透工具实现无公网IP远程访问

文章目录 前言1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 前言 2月底&#xff0c;玩客云APP正式停止运营&#xff0c;不再提供上传、云添加功能。3月初&#xff0c;有用户进行了测试&#xff0c;局域网内的各种服务还能继续使用&am…

kubeadm部署k8s v1.28

一、主机准备 主机硬件配置说明 作用IP地址操作系统配置k8s-master01192.168.136.55openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node01192.168.136.56openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node02192.168.136.57openEuler-22.03-LTS-SP12颗CPU 4G内存 50G…

C++: 多态

目录 一、多态的概念 二、多态的定义及实现 2.1虚函数 2.2虚函数的重写 2.3多态的构成条件 2.4虚函数重写的两个例外 1.协变 2.析构函数的重写 2.5虚函数重写的实质 2.6override 和 final&#xff08;C11&#xff09; 1.final 2.override 2.7重载、覆盖&#xff0…

Leetcode刷题笔记2:数组基础2

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录数组基础1部分的题目&#xff0c;主要题目包括&#xff1a; 977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 知识点 滑动窗口 所谓滑动窗口&#xff0c;就是不断的调节子序列的起始位…

反射获取或修改对象属性的值

利用反射既可以获取也可以写入,首先咱们先写几个获取的例子。 一:利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege" Dog dog = new Do…

Docker快速搭建Oracle服务

服务器&#xff1a;CentOS7.9 1.安装docker yum install -y docker 2. 设置镜像加速 修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值 阿里云的docker镜像需要自己注册账号&#xff0c;也可以不注册账号&#xff0c;直接使用下面的连接。 也可以写入多…

C语言 数组——计算最大值的函数实现

目录 计算最大值 计算最大值的函数实现 应用实例&#xff1a;计算班级最高分​编辑​编辑 返回最大值所在的下标位置 返回最大值下标位置的函数实现​编辑 一个综合应用实例——青歌赛选手评分​编辑​编辑​编辑​编辑​编辑 计算最大值 计算最大值的函数实现 应用实例&…

键盘盲打是练出来的

键盘盲打是练出来的&#xff0c;那该如何练习呢&#xff1f;很简单&#xff0c;看着屏幕提示跟着练。屏幕上哪里有提示呢&#xff1f;请看我的截屏&#xff1a; 截屏下方有8个带字母的方块按钮&#xff0c;这个就是提示&#xff0c;也就是我们常说的8个基准键位&#xff0c;我…

【蓝桥杯】

题目列表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using llunsigned long long; #define int ll const int N2e510; int k0; std::string s; int a,b,c,d; void solve() {char op;std::cin>>op;if(opA){std::string s;for(int i1;i&l…

Kafka-偏移量(含消费者事务)

Kafka概述 1.什么是偏移量&#xff1a; 在 Kafka 中&#xff0c;每个分区的消息都会被分配一个唯一的偏移量&#xff08;offset&#xff09;。偏移量简单来说就是消息在分区中的位置标识。 偏移量从 0 开始递增&#xff0c;每条消息的偏移量都会比前一条消息的偏移量大 1。 消…