使用 LSTM(长短期记忆网络) 模型对时间序列数据(航空旅客人数数据集)进行预测

代码功能

  1. 数据准备
    加载数据:从公开的航空旅客人数数据集(Airline Passengers Dataset)中读取时间序列数据。
    对数变换和平稳化:对数据应用 log1p 函数减少趋势和波动,使模型更容易学习规律。
    归一化处理:将数据缩放到 [0, 1] 区间,以适应神经网络训练。
  2. 数据集创建
    滑动窗口机制:使用过去 seq_length(12个月)作为输入,预测下一个月的值。
    划分数据集:将时间序列数据划分为训练集(80%)和测试集(20%)。
  3. 模型定义
    LSTM 模型:
    输入特征维度:每个月的数据点作为输入特征(维度为 1)。
    隐藏层维度:每层隐藏层包含 128 个神经元。
    层数:10 层 LSTM 堆叠,增加模型的表达能力。
    全连接层(FC Layer):LSTM 的输出通过全连接层,生成最终预测值。
  4. 模型训练
    损失函数:使用均方误差(MSE),衡量预测值与真实值之间的误差。
    优化器:使用 Adam 优化器,动态调整学习率提高收敛速度。
    GPU 加速:如果设备支持,则将模型和数据移至 GPU,显著加速训练。
    训练过程中,模型使用批量数据更新权重,逐步最小化损失函数。
  5. 模型评估
    预测值生成:在测试集上进行预测。
    反归一化和还原对数变换:将预测值和真实值转换回原始规模,便于直观对比。
    性能评估:计算均方误差(MSE),衡量模型的预测准确性。
  6. 可视化结果
    实际值 vs. 预测值:绘制原始数据的真实值与预测值对比图,直观展现模型效果。
    在这里插入图片描述

代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import torch
from torch import nn
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from torch.utils.data import DataLoader, TensorDataset# 1. 加载数据
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')
data_values = data['Passengers'].values.astype(float).reshape(-1, 1)# 对数变换使数据平稳化
data_log = np.log1p(data_values)# 归一化数据
scaler = MinMaxScaler(feature_range=(0, 1))
normalized_data = scaler.fit_transform(data_log)# 2. 创建数据集函数
def create_dataset(data, seq_length):X, y = [], []for i in range(len(data) - seq_length):X.append(data[i:i + seq_length])y.append(data[i + seq_length])return np.array(X), np.array(y)seq_length = 12  # 使用过去12个月预测下一个月
X, y = create_dataset(normalized_data, seq_length)# 划分训练集和测试集
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]# 转换为 PyTorch 张量
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32)# 创建 DataLoader
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 3. 定义 LSTM 模型
class LSTMModel(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim, num_layers):super(LSTMModel, self).__init__()self.hidden_dim = hidden_dimself.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True, dropout=0.2)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):h0 = torch.zeros(num_layers, x.size(0), self.hidden_dim).to(x.device)c0 = torch.zeros(num_layers, x.size(0), self.hidden_dim).to(x.device)out, _ = self.lstm(x, (h0, c0))out = self.fc(out[:, -1, :])return out# 超参数设置
input_dim = 1
hidden_dim = 128
output_dim = 1
num_layers = 10  # 增加到10层 LSTM
learning_rate = 0.0001
num_epochs = 300# 初始化模型、损失函数和优化器
model = LSTMModel(input_dim, hidden_dim, output_dim, num_layers)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)# 检查 GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)# 4. 模型训练
for epoch in range(num_epochs):model.train()for X_batch, y_batch in train_loader:X_batch, y_batch = X_batch.to(device), y_batch.to(device)outputs = model(X_batch)optimizer.zero_grad()loss = criterion(outputs, y_batch)loss.backward()optimizer.step()if (epoch + 1) % 10 == 0:print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")# 5. 模型评估
model.eval()
with torch.no_grad():y_pred = model(X_test.to(device)).cpu().numpy()# 反归一化预测结果
y_test_inv = scaler.inverse_transform(y_test.numpy())
y_pred_inv = scaler.inverse_transform(y_pred)# 计算均方误差 (MSE)
mse = mean_squared_error(np.expm1(y_test_inv), np.expm1(y_pred_inv))  # 还原对数变换
print(f"Mean Squared Error: {mse:.4f}")# 6. 可视化预测结果
plt.figure(figsize=(12, 6))
plt.plot(data.index[-len(y_test):], np.expm1(y_test_inv), label='Actual')
plt.plot(data.index[-len(y_test):], np.expm1(y_pred_inv), label='Predicted', color='orange')
plt.title('Airline Passenger Data Prediction')
plt.xlabel('Date')
plt.ylabel('Passengers')
plt.legend()
plt.show()

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

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

相关文章

《操作系统 - 清华大学》5 -2:覆盖技术

文章目录 1. 目标2. 覆盖的基本原理3. 覆盖技术的不足 1. 目标 覆盖技术产生于上世纪80年代和90年代初的时候,在那时候操作系统能力是很弱的,所以说当初目标是要在能够比较小的可用内存中运行比较大的程序,这个比较小,比较大的相对…

使用 Nginx 在 Ubuntu 22.04 上安装 LibreNMS 开源网络监控系统

#LibreNMS 是一个功能强大的开源网络监控系统,它能够为你的网络性能和设备提供全面的监控。本文将引导你通过一系列步骤,在 Ubuntu 22.04 服务器上安装和配置 LibreNMS,使用 Nginx 作为 Web 服务器。 简介 LibreNMS 提供了对网络设备和性能…

Spring注入Map学习

Spring注入Map学习 在Spring中 在策略模式中, 会经常用到 根据Bean名称获取Bean的实例 有2个方法很好用 1. 使用Autowired注入 2. 使用构造方法注入 但是奇怪的一点是: 日志打印并没有看到结果, 第一行的 Autowired的结果 是个null 那是因为 注入时机 的问题 注入时机&…

【Redis_Day5】String类型

【Redis_Day5】String类型 String操作String的命令set和get:设置、获取键值对mset和mget:批量设置、获取键值对setnx/setex/psetexincr和incrby:对字符串进行加操作decr/decrby:对字符串进行减操作incrbyfloat:浮点数加…

谷歌云无法ssh登录(修改sshd_config也不行)

sudo -i vi /etc/ssh/sshd_config passwd root /etc/init.d/ssh restart service sshd restart 这是网站大部分教程讲的,但是我实际试了还是连不上 参考https://linux.do/t/topic/260732/15 原来/etc/ssh/sshd_config.d/下面有个60开头的文件,也需…

【FPGA-MicroBlaze】串口收发以及相关函数讲解

前言 工具:Vivado2018.3及其所对应的SDK版本 目前网上有许多MicroBlaze 的入门教程,比如下面的这个参考文章,用串口打印一个hello world。 【FPGA】Xilinx MicroBlaze软核使用第一节:Hello World!_fpga软核microblaze-CSDN博客 个…

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动,先不着急直接上手撸应用层的代码,先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码(vlc好像不支持h265,这个后边我试试)的视频流,先需要支持上rtsp server,了解rtsp协议是必…

渗透测试---shell(7)for循环2与while循环

声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人与泷羽sec团队一律不承担一切后果 视频地址:泷羽--shell&a…

CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读

abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同,(Radford et al., 2021) 引入了一种新范式,该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中,通…

C++初阶(十五)--STL--list 的深度解析与全面应用

文章目录 一、头文件与基本概念 二、构造函数和析构函数 1.构造函数 2.析构函数 三、元素访问 front back 四、迭代器相关函数 begin end rebegin(反向迭代器) rend(反向迭代器) 五、容量相关函数 empty size max…

一个关于 CSS Modules 的陷阱

我在引用 less 文件样式的时候&#xff0c;发现 index.less .drag_upload {width: 100%;height: 90vh;padding: 20px; }index.jsx import React, { useState, useEffect } from react; import styles from ./index.less;export default ({ }) > {return (<div classNa…

基于STM32的智能家居电器控制系统

目录 引言环境准备 2.1 硬件准备 2.2 软件准备智能家居电器控制系统基础 3.1 控制系统架构 3.2 功能描述代码实现&#xff1a;实现智能家居电器控制系统 4.1 数据采集模块 4.2 控制逻辑与设备管理 4.3 通信与远程控制实现 4.4 用户界面与数据可视化应用场景&#xff1a;家庭自…

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…

vue3【实战】响应式的登录界面

效果预览 WEB 端效果 移动端效果 技术方案 vue3 vite Element Plus VueRouter UnoCSS TS vueUse AutoImport 技术要点 响应式设计 移动端&#xff1a;图片切换为绝对定位&#xff0c;下移一层&#xff0c;成为背景图片 <el-imageclass"w-screen h-screen lt-md…

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…

AIGC学习笔记(6)——AI大模型开发工程师

文章目录 AI大模型开发工程师005 OpenAI大模型案例实践1 AI 翻译助手需求分析项目起源市场价格和市场前景基于大模型的翻译软件核心功能设计 2 AI 翻译助手架构设计架构设计代码结构设计 3 AI 翻译助手核心功能文档解析文档操作PDF文档操作表格操作图片操作 Prompt封装 4 AI 翻…

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#xff08;GenAI HW…

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程 引言 微信小程序作为一种新兴的轻量级应用,凭借其便捷性和丰富的功能受到了广泛的欢迎。在开发小程序的过程中,合理配置全局属性是提升用户体验的关键。本文将深入探讨小程序的全局配置中的window选项,重点介绍导…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…