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)) * 100

train_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 StandardScaler

plt.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)) * 100

train_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()

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

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

相关文章

【漏洞复现】海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行

0x01 漏洞名称 海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行 0x02 漏洞影响 0x03 搜索引擎 app"HIKVISION-综合安防管理平台"0x04 漏洞详情 POST /bic/ssoService/v1/applyCT HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Wi…

【30天精通Prometheus:一站式监控实战指南】第6天:mysqld_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们👋   欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀   Prometheus是云原生和DevOps的…

【Linux】网络层——IP协议

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Linux 目录 👉🏻IP协议基本概念👉🏻IP的协议头格式👉🏻IP协议的网段划分五类IP地址子…

大数据技术原理(一):还记得你大数据入门的第一份测试题吗

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

真实案例分享,终端pc直接telnet不到出口路由器。

1、背景信息 我终端pc的网卡地址获取的网关是在核心交换机上,在核心交换机上telnet出口路由器可以实现。 所有终端网段都不能telnet出口路由器,客户希望能用最小的影响方式进行解决。 2、现有配置信息 终端的无线和有线分别在两个网段中,…

c++设计模式-->访问者模式

#include <iostream> #include <string> #include <memory> using namespace std;class AbstractMember; // 前向声明// 行为基类 class AbstractAction { public:virtual void maleDoing(AbstractMember* member) 0;virtual void femaleDoing(AbstractMemb…

【Linux】套接字的理解 基于TCP协议的套接字编程(单/多进程 / 线程池|英汉互译 / C++)

文章目录 1. 前言1.1 网络方面的预备知识&#x1f447;1.2 了解TCP协议 2. 关于套接字编程2.1 什么是套接字 Socket2.2 socket 的接口函数2.3 Udp套接字编程的步骤2.4 sockaddr 结构 3. 代码实现3.1 makefile3.2 log.hpp3.3 tcp_server.hpp① 框架② service() 通信服务③ init…

Linux安装刻录软件

在工作场景经常使用光盘和刻录机&#xff0c;在windows系统下有nero软件&#xff0c;在linux下有k3b,但是原始的k3b只能一次刻录&#xff0c;十分浪费光盘&#xff0c;这里我们使用经优麒麟优化过的刻录软件&#xff0c;实现多次追加刻录。 进入优麒麟软件仓库&#xff0c;需要…

CentOS7.9安装mysql-8.0.36踩坑小记

前言&#xff1a; 最近想在一台测试服务器上&#xff0c;安装下最新的MySQL 8.0 版本数据库&#xff0c;想着挺简单的一件事&#xff0c;之前也手搓过 8.0 安装&#xff0c;这不手到擒来&#xff0c;没想到马失前蹄&#xff0c;遇到了一个小坑&#xff0c;耗费了不少时间&…

docker 安装RabbitMQ-web版本

直接拉去web版本 docker pull rabbitmq:management启动命令 设置用户名 admin 密码123456 docker run -dit --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASS123456 rabbitmq:management访问地址 http://127.0.0.1:…

AIGC实践|探索用AI实现小游戏开发全流程

前言&#xff1a; 在上一篇中&#xff0c;我们已经深入探讨了AI工具在动态绘本创作中的应用&#xff0c;体验了AI在创意内容生成上的魅力。本篇文章将带领大家进入一个全新的探索领域——游戏开发。 本文将详细介绍如何利用AI工具探索实现游戏开发的全过程&#xff0c;从概念…

第三期【数据库主题文档上传激励活动】已开启!快来上传文档赢奖励

2023年9月、11月&#xff0c;墨天轮社区相继举办了第一期与第二期【数据库主题文档上传激励活动】&#xff0c;众多用户积极参与、上传了大量优质的数据库主题干货文档&#xff0c;在记录经验的同时也为其他从业者带来了参考帮助&#xff0c;这正实现了“乐知乐享、共同成长”的…

存储+调优:存储-Cloud

存储调优&#xff1a;存储-Cloud Master Server 配置&#xff1a; IP192.168.1.254 useradd mfs tar zxf mfs-1.6.11.tar.gz.gz cd mfs-1.6.11 ./configure --prefix/usr --sysconfdir/etc --localstatedir/var/lib --with-default-usermfs --with-default-groupmfs --disabl…

CDN管理平台安装说明

CDN管理平台安装说明 系统需求 操作系统&#xff1a;Linux CPU不少于1核心 可用内存不少于1G 可用硬盘空间不小于10G 对于每日千万访问以上的CDN系统推荐配置如下&#xff1a; CPU不少于8核心 可用内存不少于8G 可用硬盘空间不小于200G 准备工作 在安装GoEdge之前&#xff0…

ClickHouse 几年内数据查询及细节

在 ClickHouse 中&#xff0c;查询三年内的时间数据可以使用以下方法&#xff1a; 1. 使用日期函数 可以使用 ClickHouse 支持的日期函数来筛选出三年内的数据。例如&#xff0c;使用 today() 函数获取当天日期&#xff0c;使用 toDate() 函数将日期转换为指定格式&#xff0…

前端更改线上请求地址

由于后台接口更改 , 线上请求地址需从 /api/api/ 改成 /api/ , 需实现的效果如下图 1 在原本的vite.config.js中将前端做的端口转发内容更改 , 更改一行即可 import { defineConfig } from vite import react from vitejs/plugin-react import path from path import * as fs …

520主题趣味小游戏玩法线上互动的作用是什么

行业商家借势520气氛&#xff0c;往往能低成本达到预期效果&#xff0c;包括但不限于品牌传播、渠道引流涨粉、用户促活引导等&#xff0c;除了前面推荐的互动玩法外&#xff0c;在【雨科】平台的这几款520趣味小游戏同样值得关注。 1、爱你不止520 这是一款九宫格抽奖活动&am…

浅谈后端整合Springboot框架后操作基础配置

boot基础配置 现在不访问端口8080 可以吗 我们在默认启动的时候访问的是端口号8080 基于属性配置的 现在boot整合导致Tomcat服务器的配置文件没了 我们怎么去修改Tomcat服务器的配置信息呢 配置文件中的配置信息是很多很多的... 复制工程 保留工程的基础结构 抹掉原始…

文件预览的实现

1.pdf预览 使用iframe 如果是预览本地文件&#xff0c;且是vue项目&#xff0c;pdf文件需要放在public文件夹下。 调试环境&#xff1a;vue、vant、js <template><div style"height: 100%;width: 100%"><iframe :src"pageUrl" style&quo…

vue3 路由跳转 携带参数

实现功能&#xff1a;页面A 跳转到 页面B&#xff0c;携带参数 路由router.ts import { createRouter, createWebHistory } from "vue-router";const routes: RouteRecordRaw[] [{path: "/demo/a",name: "aa",component: () > import(&quo…