天氣數據集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.pswp.cn/web/23603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23603.shtml
英文地址,請注明出處:http://en.pswp.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前端如何…