首页 > 编程语言 >基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数据

基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数据

时间:2023-12-16 12:06:19浏览次数:26  
标签:预测 Keras testY testPredict print np model data LSTM

简介

LSTM是一种常用的循环神经网络,其全称为“长短期记忆网络”(Long Short-Term Memory Network)。相较于传统的循环神经网络,LSTM具有更好的长期记忆能力和更强的时间序列建模能力,因此在各种自然语言处理、语音识别、时间序列预测等任务中广泛应用。

问题场景:

对一节火车进行装载货物,火车轨道上有仪表称,我们希望利用LSTM模型对装车数据进行训练、预测,已经收集到12小时内的仪表重量的时序数据,通过训练模型从而预测未来时间段内的仪表数据,方便进行装车重量调控。

思路

首先训练模型预测未来时间段内数据的能力,训练完后,我们使用收集的数据预测第13h的数据,预测后,我们将13h的数据看做真实数据,放入历史数据中,再用它预测第14h的数据,依次类推,最终预测完未来的数据。

代码

导入模块

import math
import torch
import keras
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import read_csv,Series
from keras.models import Sequential
from keras.layers import LSTM,Dense,Dropout,Activation
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error


读入数据

# 定义随机种子,以便重现结果
np.random.seed(7)
# 加载数据
dataframe = read_csv('装车训练数据.csv',encoding='gbk',usecols=[0],engine='python')
print(dataframe)
data = dataframe.values
data = data.astype('float32')

基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数据_时间序列

数据归一化,分割训练集和测试集

# # 缩放数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
data = scaler.fit_transform(data)
# 分割数据作为训练集和测试集
train_size = int(len(data) * 0.8)
test_size = len(data) - train_size
train, test = data[0:train_size, :], data[train_size:len(data), :]

设置数据预测步长,转为监督学习格式

# 预测数据步长为100,100个数据为一组预测1个数据,100->1 步长需要和保存模型时的一致  步长越小对现有数据集的拟合越好,对未来值的预测越差
look_back = 100
def create_dataset(data, look_back=1):
	dataX, dataY = [], []
	for i in range(len(data) - look_back - 1):
		a = data[0:(i + look_back), 0]
		dataX.append(a)
		dataY.append(data[i + look_back, 0])
	return np.array(dataX), np.array(dataY)
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# 重构输入数据格式 [samples, time steps, features] = [样本数,1,100]
# 输入必须是三维 包括样本(数据的行) 时间步 特征(数据的行)
#samples 输入LSTM的样本的数量 timesteps 窗口大小,即截取的样本长度(拿多长的样本进行预测) features 样本的维度
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
print(trainX)
print(trainX.shape)
print(trainY)
print(trainY.shape)

搭建LSTM模型

train=True
if train:
	# 构建 LSTM
	# 1.定义网络
	model = Sequential()  # 创建层序列 Sequential类
	model.add(LSTM(256, input_shape=(1, look_back),
				   return_sequences=True))  # units 神经元的数量 input_shape = (TIME_STEPS,INPUT_SIZE)),第一个代表每个输入的样本序列长度,第二个元素代表
	# 每个序列里面的1个元素具有多少个输入数据。
	model.add(Dropout(0.2))  # Dropout把上一层神经元进行随机丢弃,减少过拟合
	model.add(LSTM(128, return_sequences=False))
	model.add(Dropout(0.2))
	model.add(Dense(1))  # 全连接层 用于输出预测
	# model.add(Activation("tanh"))
	# 2.编译网络
 
	model.compile(loss='mean_squared_error',optimizer=keras.optimizers.SGD(lr=0.001))  # 编译网络 优化算法 sgd--随机梯度下降 Adam RMSprop等优化算法
	print(model.summary())
	# 3.适合网络
	history = model.fit(trainX, trainY, epochs=25, batch_size=1, verbose=1,
						validation_data=(testX, testY), )  # verbose是日志显示,有三个参数可选择,分别为0,1和2。
	# 4.评估网络
	plt.plot(history.history['loss'], label='train')
	plt.plot(history.history['val_loss'], label='test')
	plt.legend()
	plt.show()
	# loss,accuracy=model.evaluate(trainX,trainY)
	torch.save(model, 'Tang-model.pt')  # 16
else:
	# #加载模型
	model = torch.load('Tang-model.pt')

基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数据_时间序列_02

基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数据_数据_03

训练集和测试集预测

#5.预测
# 对训练数据的Y进行预测
trainPredict = model.predict(trainX)
# 对测试数据的Y进行预测
testPredict = model.predict(testX)
# 对数据进行逆缩放
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])

模型评估指标

# 计算RMSE误差
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))
# 计算均方误差(MSE)
mse = mean_squared_error(testY[0], testPredict[:,0])
# 计算R平方值(R^2)
r2 = r2_score(testY[0], testPredict[:,0])
# 计算平均绝对误差(MAE)
mae = mean_absolute_error(testY[0], testPredict[:,0])
# 计算平均绝对百分比误差(MAPE)
mape = np.mean(np.abs((testY[0] - testPredict[:,0]) / testY[0])) * 100
#对称平均绝对百分比误差(SMAPE)
smape=2.0 * np.mean(np.abs(testPredict[:,0] - testY[0]) / (np.abs(testPredict[:,0]) + np.abs(testY[0]))) * 100
# 模型评估性能指标
print(f"均方误差 (MSE): {mse:.2f}")
print(f"R平方值 (R-Square): {r2:.2f}")
print(f"平均绝对误差 (MAE): {mae:.2f}")
print(f"平均绝对百分比误差 (MAPE): {mape:.2f}%")
print(f"对称平均绝对百分比误差 (SMAPE): {smape:.2f}%")

基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数据_数组_04

绘制图像

# 构造一个和dataset格式相同的数组 dataset为总数据集
trainPredictPlot = np.empty_like(data)
# 用nan填充数组
trainPredictPlot[:, :] = np.nan
# 将训练集预测的Y添加进数组
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict
 
# 构造一个和dataset格式相同的数组 把预测的测试数据放进去
testPredictPlot = np.empty_like(data)
testPredictPlot[:, :] = np.nan
# 将测试集预测的Y添加进数组
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(data)-1, :] = testPredict
 
# 画图
plt.plot(scaler.inverse_transform(data),color='r',label='original data')
plt.plot(trainPredictPlot,color='g',label='trianPredict data')
plt.plot(testPredictPlot,color='b',label='testPredict data')
plt.legend()
plt.show()

基于LSTM模型的时间序列预测(车厢重量预测),Python中Keras库实现LSTM,实现预测未来未知数据_时间序列_05

标签:预测,Keras,testY,testPredict,print,np,model,data,LSTM
From: https://blog.51cto.com/u_16445372/8851159

相关文章

  • 机器学习的方法主要可以分为以下几类¹²³: 1. **监督学习**:在监督学习中,我们有一个
    机器学习的方法主要可以分为以下几类¹²³:1.**监督学习**:在监督学习中,我们有一个标记的数据集,我们的目标是训练一个模型,使其能够预测新数据的标签。常见的监督学习算法包括:  -线性回归  -逻辑回归  -支持向量机(SVM)  -最近邻居(KNN)  -决策树......
  • 2024年视频监控行业发展趋势预测及EasyCVR视频分析技术应用
    随着技术的改进,视频监控领域在过去十年迅速发展。与此同时,该行业正在通过先进创新技术(如人工智能和云计算等技术)的积极商业化,获得了新的增长机会。视频监控系统不再仅仅用于记录图像,而是已经成为全球企业改善运营、提高生产力和增强安全性的重要工具。传统视频安防解决方案转变为......
  • R语言结构方程模型SEM、路径分析房价和犯罪率数据、预测智力影响因素可视化2案例|附代
    原文链接:http://tecdat.cn/?p=25044原文出处:拓端数据部落公众号最近我们被客户要求撰写关于结构方程模型的研究报告,包括一些图形和统计输出。1简介在本文,我们将考虑观察/显示所有变量的模型,以及具有潜在变量的模型。第一种有时称为“路径分析”,而后者有时称为“测量模型”。......
  • 基于小波神经网络的网络流量预测算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022A 3.算法理论概述       网络流量能直接反映网络性能的好坏,网络流量的建模与预测对于大规模网络的规划设计、网络资源管理以及用户行为的调节等方面都具有积极意义。本课题首先介绍了网络流量的特征......
  • HanLP — HMM隐马尔可夫模型 -- 训练和预测
    BMES=>B-begin:词语开始、M-middle:词语中间、E-end:词语结束、S-single:单独成词训练的过程,就是求三个矩阵的过程初始概率矩阵转移概率矩阵发射矩阵每个字有4种可能性,上图中有7个字,就是4^7种可能性维特比算法,从众多路径中,挑出最优的那条,他和隐马尔可夫没有强关联初......
  • 数据分享|R语言用RFM、决策树模型顾客购书行为的数据预测|附代码数据
    全文链接:http://tecdat.cn/?p=30330最近我们被客户要求撰写关于RFM、决策树模型的研究报告,包括一些图形和统计输出。团队需要分析一个来自在线零售商的数据该数据包含了78周的购买历史。该数据文件中的每条记录包括四个字段。客户的ID(从1到2357不等),交易日期,购买的书籍数量,以及......
  • 基于机器学习的时间序列温度预测
    本次研究是使用GRU模型和GRU-Attention模型对长时间序列温度数据进行预测拟合,对于这两个模型有兴趣的可以去网上了解一下,首先是日数据预测,由于日数据存在缺失值需要对缺失值进行填补,在对存在缺失值的数据中我使用三次样方插值对数据进行处理,其代码如下:importpandasaspdimp......
  • 事件发生预测
    突发奇想想实现一个对事件发生进行预测的程序,例如根据历史上每次出现月食的时间,推测下次出现月食的时间。下面是我的一个简单实现(对时间序列预测并不了解,所以我相信有更合适的源数据处理方法和更优秀的算法模型可以用),日后有机会再优化!......
  • 论文精读:STMGCN利用时空多图卷积网络进行移动边缘计算驱动船舶轨迹预测(STMGCN: Mobile
    《STMGCN:MobileEdgeComputing-EmpoweredVesselTrajectoryPredictionUsingSpatio-TemporalMultigraphConvolutionalNetwork》论文链接:https://doi.org/10.1109/TII.2022.3165886摘要利用移动边缘计算MEC范例提出基于时空多图卷积网络(STMGCN)的轨迹预测框。STMGCN由三......
  • 论文精读:基于具有时空感知的稀疏多图卷积混合网络的大数据驱动船舶轨迹预测(Big data d
    论文精读:基于具有时空感知的稀疏多图卷积混合网络的大数据驱动船舶轨迹预测《Bigdatadrivenvesseltrajectorypredictionbasedonsparsemulti-graphconvolutionalhybridnetworkwithspatio-temporalawareness》论文链接:https://doi.org/10.1016/j.oceaneng.2023.115......