天气数据集2-应用RNN做天气预测

二、用循环神经网络做天气(温度)预测

本项目是基于Pytorch的 RNN&GRU模型,用于预测未来温度

  • 数据集: https://mp.weixin.qq.com/s/08BmF4RnnwQ-jX5s_ukDUA

  • 项目代码: https://github.com/disanda/b_code/tree/master/Weather_Prediction

  1. RNN
  • 模型本质是用于预测数据的时序关系

  • 模型的输入和输出是”序列长度可变的”

以下是Pytorch的RNN输入和输出样例

import torchinput_size = 10 #输入数据的维度
output_size= 1  #输出数据的维度
num_layers= 3 #有几层rnnrnn_case = torch.nn.RNN(input_size, output_size, num_layers, batch_first=True)batch_size = 4 #模型可以批处理数据序列
seq_length1 = 5 #序列长度为5,即输入一个序列的5个连续点
seq_length2 = 9 #序列长度为9,即输入一个序列有9个连续点x1 = torch.randn(batch_size,seq_length1,input_size)
x2 = torch.randn(batch_size,seq_length2,input_size)h1_0 = torch.zeros(num_layers,batch_size,output_size)
h2_0 = torch.zeros(num_layers,batch_size,output_size)y1, h1_1 = rnn_case(x1,h1_0)  
# y1.shape = (batch_size, seq_length1, output_size)  
# h1_1.shape = (num_layers, batch_size, output_size) y2, h2_1 = rnn_case(x2,h2_0)
# y2.shape = (batch_size, seq_length1, output_size)  
# h2_1.shape = (num_layers, batch_size, output_size) #如果通过前n-1个数据预测第n个数据
y1_out = y1[:,-1,:]
y2_out = y2[:,-1,:]
  1. 数据预处理

2.1 输出数据特征

pandas下是frame的列(columns)

import pandas as pd
import matplotlib.pyplot as pltcsv_path = "mpi_saale_2021b.csv"
data_frame = pd.read_csv(csv_path)
print(data_frame.columns)# Index(['Date Time', 'p (mbar)', 'T (degC)', 'rh (%)', 'sh (g/kg)', 'Tpot (K)',
#        'Tdew (degC)', 'VPmax (mbar)', 'VPact (mbar)', 'VPdef (mbar)',
#        'H2OC (mmol/mol)', 'rho (g/m**3)', 'wv (m/s)', 'wd (deg)', 'rain (mm)',
#        'SWDR (W/m**2)', 'SDUR (s)', 'TRAD (degC)', 'Rn (W/m**2)',
#        'ST002 (degC)', 'ST004 (degC)', 'ST008 (degC)', 'ST016 (degC)',
#        'ST032 (degC)', 'ST064 (degC)', 'ST128 (degC)', 'SM008 (%)',
#        'SM016 (%)', 'SM032 (%)', 'SM064 (%)', 'SM128 (%)'], dtype='object')

2.2 删掉一些特征

data = df.drop(columns=['Date Time']) #去掉字符串特征# 去掉其他degC特征
deg_columns = df.filter(like='degC').columns 
filtered_list = [item for item in deg_columns if item != 'T (degC)']
data = data.drop(columns=pd.Index(filtered_list))
#print(data.columns)

2.3 数据标准化

可以把所有特征看成不同货币,完成货币的计量统一


# 标准化特征
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
#print(data_scaled)

2.4 序列化和Pytorch批处理

  • y = f(x): x是输入,y是输出,f是模型

  • x序列化, 目的是一个数据单位是一个序列(n-1个数据,每个数据有n个特征)

  • 制作y标签,即预测值(第n个数据的”温度”特征)


# 创建序列数据
X, y = [], []for i in range(len(data_scaled) - sequence_length):X.append(data_scaled[i:i+sequence_length-1])  # 前9个时间步的特征y.append(data_scaled[i+sequence_length-1, 1])  #  第10个时间步的第2个特征'T (degC)'作为目标X = np.array(X)
y = np.array(y)# 转换为 PyTorch 张量
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  # 默认为 CPU
X = torch.tensor(X, dtype=torch.float32).to(device)
y = torch.tensor(y, dtype=torch.float32).to(device)# 划分训练集和测试集
dataset = TensorDataset(X, y)
train_size = int(0.8 * len(dataset))
#test_size = len(dataset) - train_size
#train_dataset, test_dataset = random_split(dataset, [train_size, test_size])train_dataset = TensorDataset(*dataset[:train_size])
test_dataset = TensorDataset(*dataset[train_size:])train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=False, drop_last=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, drop_last=True)
  1. 超参数选择
  • input_size = len(data.columns)

  • hidden_size = 64

  • output_size = 1

  • num_layers = 2

  • num_epochs = 30

  • learning_rate = 5e-5 #0.001

  • batch_size = 8

  • sequence_length = 8 # 输入9个特征,预测第10个特征

  • model_type =‘RNN’ # GRU

  1. 模型

4.1 模型设计

单独放一个文件夹,解耦程序


import torch.nn as nn
class WeatherRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size, num_layers=1, model_type='RNN'):super(WeatherRNN, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersif model_type == 'RNN':self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True) # batch_first=True, nonlinearity = 'relu'elif model_type == 'GRU':self.rnn = nn.GRU(input_size, hidden_size, num_layers, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)#self.dropout = nn.Dropout(p=0.2) 效果变差def forward(self, x, h0):out, hn = self.rnn(x, h0)#out = out[:, -1, :]#out = self.dropout(out)out = self.fc(out[:, -1, :])#out = torch.tanh(out)return out, hn

4.2 模型训练

  • 初始化: 1.模型,2.损失函数,3.优化器

  • 训练(前向传播): 输入输出 y= f(x)

  • 训练(反向传播): 输入输出 w’ = f’(x)


# 初始化模型、损失函数和优化器
model = models.WeatherRNN(input_size, hidden_size, output_size, num_layers, model_type = model_type).to(device)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
model.train()
h0 = torch.zeros(num_layers, batch_size, hidden_size).to(device)
for epoch in range(num_epochs):for inputs, targets in train_loader:# print(inputs.shape)# print(targets.shape)# 训练时每次输入 sequence_length - 1 个数据,预测第 sequence_length 个数据output, hn = model(inputs, h0)   #inputs = [batch_size, sequence_length-1, features]h0 = hn.detach() # [layers, batch_size, hidden_size]#print(output.shape)#print(hn.shape)predictions = output[:, -1]loss = criterion(predictions, targets)optimizer.zero_grad()loss.backward() # retain_graph=Truemax_norm = 2.0  # 设定梯度的最大范数torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm) # 使用clip_grad_norm_()函数控制梯度optimizer.step()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.7f}')print("Training complete.")

4.3 模型评估


# 模型评估
model.eval()
test_loss = 0.0
h0 = torch.zeros(num_layers, batch_size, hidden_size).to(device)
with torch.no_grad():for inputs, targets in test_loader:#print(inputs.shape)#print(targets.shape)# 预测时每次输入 sequence_length - 1 个数据,预测第 sequence_length 个数据output, hn = model(inputs, h0)h0 = hn.detach()predictions = output[:, -1]loss = criterion(predictions, targets)test_loss += loss.item()test_loss /= len(test_loader)
print(f'Test Loss: {test_loss:.7f}')
  1. 小结 & 参考链接

后续可以扩张到股票型数据

5.1 调参

通过看 tain_loss, test_loss 调参
  • Hidden_size,Layer_nums: 与数据规模成正比, 本例应适当调低

  • Learn_rate: 变化过快或震荡可调低

  • Epoch: Loss 有效下降可以增大

5.2 技巧

  • 梯度更新限制
    max_norm = 2.0 # 设定梯度的最大范数
    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm) # 使用clip_grad_norm_()函数控制梯度

  • Dropout

    适用于参数规模更大的RNN, 不适用本例

5.3 参考链接:

  • 代码: https://blog.paperspace.com/weather-forecast-using-ltsm-networks/
  • 天气数据集: https://www.bgc-jena.mpg.de/wetter/

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

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

相关文章

MySQL(四)查询

1、MySQL限性约束 —非空、唯一(自增)、主外键、检查(MySQL存在但是不能用)。 约束主要完成对数据的校验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。 1)常用五类约束 not null :非空约束,指定某列不为空。 unique:唯一约束,指定某列和几列组…

基于springboot的-仓库 管理系统【附:资料➕文档】

前言:我是源码分享交流Coding,专注JavaVue领域,专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享,定制和毕业设计服务! 免费获取方式--->>文章末尾处! 项目介绍: 管理员…

【VUE】el-table表格 实现滚动到底部加载更多数据

废话不多说&#xff0c;直接上代码 <template></template>部分代码 <!-- 表格 --> <el-tableid"mytable"v-loading"listLoading"highlight-current-rowrow-key"project_id":data"tableData"border:reload"…

java中的三种拷贝方法

在Java编程中&#xff0c;理解深拷贝&#xff08;Deep Copy&#xff09;、浅拷贝&#xff08;Shallow Copy&#xff09;和引用拷贝&#xff08;Reference Copy&#xff09;是非常重要的。这三种拷贝方式涉及对象复制和内存管理。以下是对它们的详细解释&#xff1a; 1. 引用拷…

数字IC后端物理验证PV | TSMC 12nm Calibre Base Layer DRC案例解析

基于TSMC 12nm ARM A55 upf flow后端设计实现训练营将于6月中旬正式开班&#xff01;小班教学&#xff01;目前还有3个名额&#xff0c;招满为止&#xff01;有需要可以私信小编 ic-backend2018报名。吾爱IC社区所有训练营课程均为直播课&#xff01; 这个课程支持升级成双核A…

服务器禁止密码登陆

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/139444224 文章目录 一、前言二、编辑sshd_config文件三、重启服务四、总结 一、前言 复杂的密码&#xff0c;登陆服务器的时候&#xff0c;也是很不方便的。并且频繁登陆&#xff0c;暴露给外界&am…

事件总线vueEvent

一个组件结束后要更新另一个组件数据&#xff0c;但是另一个组件和这个组件没有上下级关系 在 Vue 中&#xff0c;非父子组件之间进行通信通常需要使用事件总线或者其他的全局事件管理器。在你的代码片段中&#xff0c;vueEvent 似乎是一个事件总线对象&#xff0c;通过 emit 方…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,编译器选择哪个执行呢?

看大师写的代码时&#xff0c;除了在类里定义了 copy 构造函数&#xff0c;移动构造函数&#xff0c;还定义了对形参采取万能引用的构造函数&#xff0c;因此有个疑问&#xff0c;这时候的构造函数优先级是什么样的呢&#xff1f;简化逻辑测试一下&#xff0c;如下图&#xff0…

如何实现JavaScript中的寄生组合式继承?

在JavaScript中&#xff0c;寄生组合式继承是一种继承机制&#xff0c;它结合了寄生式继承和组合继承的特点。其核心思想是通过构造函数来继承属性&#xff0c;同时通过原型链来继承方法。以下是实现寄生组合式继承的基本步骤&#xff1a; 首先定义一个辅助函数 inheritProtot…

Pygame:新手指南与入门教程

在游戏开发领域,pygame 是一个广受欢迎的 Python 库,它提供了开发二维游戏的丰富工具和方法。这个库让开发者可以较少地关注底层图形处理细节,更多地专注于游戏逻辑和玩法的实现。本文将详细介绍 pygame,包括其安装过程、基本概念、主要功能和一个简单游戏的开发流程。 一…

【Vue】路由的封装抽离

问题&#xff1a;所有的路由配置都在main.js中合适吗&#xff1f; 目标&#xff1a;将路由模块抽离出来。 好处&#xff1a;拆分模块&#xff0c;利于维护 路径简写&#xff1a; 脚手架环境下 指代src目录&#xff0c;可以用于快速引入组件 完整代码 router/index.js // 但…

探索贷款交易平台的技术架构与创新应用

随着金融科技的快速发展&#xff0c;贷款交易平台作为金融行业的重要组成部分&#xff0c;正扮演着越来越重要的角色。本文将深入探讨贷款交易平台的技术架构和创新应用&#xff0c;从前端设计、后端系统、安全保障和智能化服务等方面进行全面解析&#xff0c;帮助读者更好地了…

【Python报错】已解决AttributeError: list object has no attribute ’shape‘ ( Solved )

解决Python报错&#xff1a;AttributeError: ‘list’ object has no attribute ‘shape’ (Solved) 在Python中&#xff0c;AttributeError表明你试图访问的对象没有你请求的属性或方法。如果你遇到了AttributeError: list object has no attribute shape的错误&#xff0c;这…

为什么要用Git

1. Git是什么 1.1. 概述 Git是分布式版本控制系统&#xff0c;与SVN类似的集中化版本控制系统相比&#xff0c;集中化版本控制系统如果中央服务器宕机则会影响数据和协同开发。 Git是分布式的版本控制系统&#xff0c;客户端不只是提取最新版本的快照&#xff0c;而且将整个…

【Java毕业设计】基于Java的特色美食推荐网站的设计与实现

文章目录 摘 要ABSTRACT目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 Java编程语言1.4.2 SpringBoot框架1.4.3 MySQL数据库1.4.4 B/S结构1.4.5 MVC模式 2 系统需求分析2.1 可行性分析2.2 任务概述2.3 功能性需求3.2.2 数据库逻辑结构设…

全面解析如何租用免备案海外服务器

租用免备案海外服务器是许多企业和个人在全球范围内开展业务或访问国际互联网资源时选择的一种方式。这种服务具有无需经过中国互联网备案流程的优势&#xff0c;能够快速部署并使用。下面将详细介绍免备案海外服务器租用的相关信息&#xff0c;rak部落为您整理发布。 1. **国外…

外汇天眼:FSCS确认TenetConnect Services Ltd已任命管理人

2024年6月5日&#xff0c;Tenet Group Ltd的董事们任命了Interpath Ltd的Ed Boyle、Howard Smith和Rob Spence为联合管理人。Ed Boyle和Rob Spence也被任命为其子公司Tenet Ltd、TenetConnect Ltd和TenetConnect Services Ltd的联合管理人。Tenet Mortgage Services Ltd和Tenet…

【计算机视觉(8)】

基于Python的OpenCV基础入门——图像直方图 直方图图像直方图 图像直方图代码以及实现效果 直方图 直方图是一种用于描述图像亮度分布的统计工具。它将图像的像素亮度值按照不同的亮度等级进行计数&#xff0c;并以直方图的形式呈现出来。图像直方图可以显示图像中每个亮度级别…

点击式的excel电子表格查找修改功能,比xlookup和vlookup简单,多列关联查询速度更快

经过实际测试&#xff0c;excel的xlookup确实非常简单&#xff0c;有部分功能也非常快。但是有的人不会公式&#xff0c;或者不喜欢用公式&#xff0c;或者没有excel2021以上的版本。而且xlookup确实也有些还不是很完美的地方&#xff0c;比如对多列关联查询很慢。所以我们还是…

MVC前端怎么写:深入解析与实战指南

MVC前端怎么写&#xff1a;深入解析与实战指南 在Web开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一种广泛使用的架构模式&#xff0c;它将应用程序的数据、界面和控制逻辑分离&#xff0c;使得代码更加清晰、易于维护。本文将详细探讨MVC前端如何…