基于Jamba模型的天氣預測實戰

深入探索Mamba模型架構與應用 - 商品搜索 - 京東

?DeepSeek大模型高性能核心技術與多模態融合開發 - 商品搜索 - 京東

由于大氣運動極為復雜,影響天氣的因素較多,而人們認識大氣本身運動的能力極為有限,因此以前天氣預報水平較低?。預報員在預報實踐中,每次預報的過程都極為復雜,需要綜合分析,并預報各氣象要素,比如溫度、降水等。現階段,以往極少出現的極端天氣現象越來越多,這極大地增加了預報的難度,如圖11-20所示。

圖11-20? 天氣預報

本小節將使用Jamba完成天氣預測,即在給定天氣因素下,預測城市是否下雨。

1. 數據集的準備

這里作者準備了來自澳大利亞多個氣候站的日常共15萬條收集[wy1]?[曉王2]?的數據,如圖11-21所示。

圖11-21? 澳大利亞天氣數據集前5條內容

其中的變量解釋如下所示。

  • Location?? ?獲取該信息的氣象站的名稱
  • MinTemp?? ?以攝氏度為單位的低溫度
  • MaxTemp?? ?以攝氏度為單位的高溫度
  • Rainfall?? ?當天記錄的降雨量,單位為mm
  • Evaporation?? ?到早上9點之前的24小時的A級蒸發量(mm)
  • Sunshine?? ?白日受到日照的完整小時
  • WindGustDir?? ?在到午夜12點前的24小時中的強風的風向
  • WindGustSpeed?? ?在到午夜12點前的24小時中的強風速(km/h)
  • WindDir9am?? ?上午9點時的風向
  • WindDir3pm?? ?下午3點時的風向
  • WindSpeed9am?? ?上午9點之前每10分鐘的風速的平均值(km/h)
  • WindSpeed3pm?? ?下午3點之前每10分鐘的風速的平均值(km/h)
  • Humidity9am?? ?上午9點的濕度(百分比)
  • Humidity3am?? ?下午3點的濕度(百分比)
  • Pressure9am?? ?上午9點平均海平面上的大氣壓(hpa)
  • Pressure3pm?? ?下午3點平均海平面上的大氣壓(hpa)
  • Cloud9am?? ?上午9點的天空被云層遮蔽的程度,這是以oktas來衡量的,這個單位記錄了云層遮擋天空的程度。0表示完全晴朗的天空,而8表示完全是陰天
  • Cloud3pm?? ?下午3點的天空被云層遮蔽的程度
  • Temp9am?? ?上午9點的攝氏度溫度
  • Temp3pm?? ?下午3點的攝氏度溫度
  • RainToday?? ?今日是否有雨
  • RainTomorrow?? ?明日是否有雨

通過觀察可以發現,這個特征矩陣由一部分分類變量和一部分連續變量組成,其中云層遮蔽程度雖然是以數字表示的,但是其本質卻是分類變量。大多數特征都是采集的自然數據,比如蒸發量、日照時間、濕度等,而少部分特征則是人為構成的。還有一些是單純表示樣本信息的變量,比如采集信息的地點,以及采集的時間。

在我們知道了數據情況后,下一步就是確定目標標簽,簡單來說,就是我們的標簽:明天下雨嗎?目標特征RainTomorrow表示明天是否會下雨,即是或否。

2. 特征的選擇與程序實現

在特征選擇過程中,我們需要根據目標精準地挑選最合適的特征進行計算。以天氣為例,我們推測昨天的天氣狀況可能會對今天的天氣狀況有所影響,同樣,今天的天氣狀況也可能影響明天的天氣狀況。換言之,在樣本之間,隨著時間的推移,是存在相互影響的。然而,傳統的算法往往只能捕捉到樣本特征與標簽之間的關系,即列與列之間的聯系,而無法把握樣本與樣本之間的關聯,也就是行與行之間的聯系。

要讓算法能夠理解前一個樣本標簽對后一個樣本標簽的潛在影響,我們需要引入時間序列分析。時間序列分析是通過將同一統計指標的數據按其發生的時間順序排列,以數列形式呈現出來。其主要目的是依據歷史數據預測未來趨勢。但據作者了解,時間序列分析通常適用于單調且唯一的時間線,即它一次只能預測一個地點的數據,而無法同時預測多個地點,除非進行循環操作。然而,我們的時間數據并非單調或唯一的,尤其是在抽樣后,數據的連續性也可能被破壞。我們的數據混雜了多個地點和不同時間段的信息,這使得使用時間序列分析來處理問題變得相當復雜。

那么,我們可以嘗試另一種思路。既然算法擅長處理的是列與列之間的關系,我們是否可以將“今天的天氣影響明天的天氣”這一因素轉換為一個具體的特征呢?實際上,這是可行的。

我們注意到數據中有一個特征列名為RainToday,表示當前日期和地區的降雨量,即“今日的降雨量”。基于常識,我們認為今天是否下雨很可能會影響明天的天氣狀況。例如,在某些氣候區域,一旦開始下雨,可能會持續數日;而在另一些地方,暴雨可能來得快,去得也快。因此,我們可以將時間對氣候的連續影響轉換為“今天是否下雨”這一特征。這樣,我們可以巧妙地將原本樣本間(行與行之間)的聯系轉換為特征與標簽之間的聯系(列與列之間)。

下面將使用其中6個特征'Location'、'WindGustDir'、'WindDir9am'、'WindDir3pm'、'Date'和'RainToday'完成對明日天氣的預測。代碼如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as npdef preprocessing(df, index):labels = set([])for label in df[index]:labels.add(label)labels = list(labels)# print(labels)column = df[index]df.drop(axis=1, columns=index, inplace=True)if 'RainT' in index:temp = column.map(lambda x: labels.index(x))elif index == 'Date':temp = column.map(lambda x: x[5] if x[6] == '/' else x[5:7])else:temp = column.map(lambda x: labels.index(x) + 1)df.insert(0, index, temp)return dfdef get_dataset(location):  # 獲取數據集df = pd.read_csv(location)# df = df[['Location', 'MinTemp', 'MaxTemp', 'Rainfall', 'Evaporation', 'Sunshine', 'WindGustDir', 'WindGustSpeed',#          'WindSpeed9am', 'WindSpeed3pm', 'Humidity9am', 'Humidity3pm', 'Pressure9am', 'Pressure3pm',#          'Cloud9am', 'Cloud3pm', 'Temp9am', 'Temp3pm', 'RainToday', 'RainTomorrow']]df = df.dropna()  # 去除包含缺失值的行# 用整數標簽代替字符串型數據for label in ['Location', 'WindGustDir', 'WindDir9am', 'WindDir3pm', 'Date', 'RainToday', 'RainTomorrow']:df = preprocessing(df, label)# Date列格式轉換date = df['Date'].astype(float)df.drop(axis=1, columns='Date', inplace=True)df.insert(2, 'Date', date)# 刪除相關系數過低的數據for key in df.corr()['RainTomorrow'].keys():if (df.corr()['RainTomorrow'][key] < 0.1) & (df.corr()['RainTomorrow'][key] > -0.1):df.drop(axis=1, columns=key, inplace=True)return dfdf = get_dataset('./weatherAUS.csv')
df_list = df.values.tolist()
feature = df.drop(['RainTomorrow'], axis=1).values.tolist()
label = df['RainTomorrow'].values.tolist()feature = np.array(feature)
label = np.array(label)

可以看到,我們使用Pandas抽取了6個特征作為訓練特征,而RainTomorrow作為預測值被記錄。數據量的多少讀者可以打印完成。

下面將生成數據整理成PyTorch數據讀取格式為模型訓練做準備,代碼如下:

import torch
from torch.utils.data import Dataset, random_splitclass TextSamplerDataset(torch.utils.data.Dataset):def _ _init_ _(self, feature = feature, label = label):super()._ _init_ _()self.feature = torch.from_numpy(feature)/4.self.label = torch.from_numpy(label).int()def _ _getitem_ _(self, index):return self.feature[index],self.label[index]def _ _len_ _(self):return len(self.label)dataset = TextSamplerDataset(feature,label)# 定義分割比例
train_ratio = 0.9
val_ratio = 0.1# 計算每個分割的數據量
total_size = len(dataset)
train_size = int(train_ratio * total_size)
val_size = int(val_ratio * total_size)# 進行數據分割
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])

在這里,TextSamplerDataset作為數據的文本讀取類,對結果進行整合,并且由于特征值普遍較大,因此在計算時我們采用除以4的方法對其進行修正。random_split的作用是將完整的數據集按9:1的比例劃分為訓練集與測試集。

3. 天氣預測模型的實現

對于天氣預測模型的實現,我們將使用Jamba作為計算核心完成預測模型,而在輸入的部分,由于輸入的是一個1D數據,首先需要對其維度進行調整,整理成一個新的2D向量,從而進行后續的計算。

而輸出層我們采用一個全連接層,將輸入向量計算后整理成一個二分類,從而對結果進行預測。完整的天氣預報模型如下:

class PredicateWeather(torch.nn.Module):def _ _init_ _(self,jamba_dim = 384,jamba_head = 6,feature_num = 13):super()._ _init_ _()self.feature_num = feature_numself.linear = torch.nn.Linear(feature_num,feature_num * jamba_dim)self.jamba = model.Jamba(dim=jamba_dim,attention_head_num=jamba_head)self.logits_layer = torch.nn.Linear(feature_num * jamba_dim,2)def forward(self,x):x = self.linear(x)x = einops.rearrange(x,"b (f d) -> b f d",f = self.feature_num)x = self.jamba(x)x = torch.nn.Flatten()(x)x = torch.nn.Dropout(0.1)(x)logits = self.logits_layer(x)return logits

4. 天氣預報模型的訓練與驗證

最后,我們將使用模型在澳大利亞天氣數據集上完成預測任務。在這里,我們可以同時對損失值和正確率進行監測,并通過tqdm類具體實現,代碼如下:

import torch
from tqdm import tqdm
import weather_predicate
import get_weather_datasetfrom torch.utils.data import DataLoadermodel = weather_predicate.PredicateWeather()batch_size = 256
device = "cuda"model = model.to(device)# 創建數據加載器
train_loader = DataLoader(get_weather_dataset.train_dataset, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(get_weather_dataset.val_dataset, batch_size=batch_size, shuffle=False)import torch
optimizer = torch.optim.AdamW(model.parameters(), lr = 2e-4)
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer,T_max = 6000,eta_min=2e-6,last_epoch=-1)
criterion = torch.nn.CrossEntropyLoss()for epoch in range(24):correct = 0  	# 用于記錄正確預測的樣本數量total = 0  		# 用于記錄總樣本數量pbar = tqdm(train_loader,total=len(train_loader))for feature,label in pbar:optimizer.zero_grad()feature = feature.float().to(device)label = label.long().to(device)logits = model(feature)loss = criterion(logits.view(-1, logits.size(-1)), label.view(-1))loss.backward()optimizer.step()lr_scheduler.step()  							# 執行優化器# 計算正確率_, predicted = torch.max(logits.data, 1)  		# 得到預測結果total += label.size(0) 							# 更新總樣本數量correct += (predicted == label).sum().item()	# 更新正確預測的樣本數量accuracy = 100 * correct / total  # 計算正確率pbar.set_description(f"epoch:{epoch +1},accuracy:{accuracy:.3f}%, train_loss:{loss.item():.5f}, lr:{lr_scheduler.get_last_lr()[0]*1000:.5f}")# 測試模型
model.eval()
test_correct = 0  		# 用于記錄正確預測的樣本數量
test_total = 0  		# 用于記錄總樣本數量
with torch.no_grad():for feature, label in val_loader:feature = feature.float().to(device)label = label.long().to(device)logits = model(feature)# 計算正確率_, predicted = torch.max(logits.data, 1)	# 得到預測結果test_total += label.size(0)  				# 更新總樣本數量test_correct += (predicted == label).sum().item()# 更新正確預測的樣本數量test_accuracy = 100 * test_correct / test_total  # 計算正確率print(f"在測試集上的準確率為:{test_accuracy}")

在這里,我們同時完成了模型的訓練以及對結果的預測,并且在劃分的驗證集上獲得了對結果準確率的驗證,如下所示:

epoch:1,accuracy:69.912%, train_loss:3.56852 100%|██████████| 199/199 [00:26<00:00,  7.60it/s]
epoch:2,accuracy:74.985%, train_loss:3.15288 100%|██████████| 199/199 [00:26<00:00,  7.64it/s]
...
epoch:24,accuracy:82.689%, train_loss:0.4148 100%|██████████| 199/199 [00:26<00:00,  7.48it/s]在測試集上的準確率為:84.36724565756823

可以看到,經過24輪的預測,在訓練集上我們獲得了82.69%的準確率,而將模型和訓練參數遷移到驗證集上,我們獲得了84.37%的準確率。當然,從訓練集上的結果來看,此時可能還沒有充分完成特征的訓練,模型仍舊除于“欠擬合”狀態,還需要繼續訓練,這一點有興趣的讀者可以繼續嘗試完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77457.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GAMES202-高質量實時渲染(Real-Time Shadows)

目錄 Shadow MappingshadowMapping的問題shadow mapping背后的數學PCF&#xff08;Percentage Closer Filtering&#xff09;PCSS&#xff08;Percentage closer soft shadows&#xff09;VSSM&#xff08;Variance Soft Shadow Mapping&#xff09;優化步驟3優化步驟1SAT&…

iphonex uniapp textarea標簽兼容性處理過程梳理

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“iphonex uniapp textarea標簽兼容性處理過程梳理”。 在uniapp項目中&#xff0c;經常會使用到uniapp原生的textarea標簽&#xff0c;但在手機兼容性這塊&#xff0c;textarea并不是很好用&#xff0c;會出現一些…

C++ 區分關鍵字和標識符

1. 關鍵字&#xff08;Keywords&#xff09; 定義&#xff1a;關鍵字是編程語言預定義的具有特定意義的單詞。它們是語言的一部分&#xff0c;C編譯器具有特殊的理解規則&#xff0c;不能作為用戶自定義的標識符。作用&#xff1a;關鍵字用于定義語言結構&#xff0c;如聲明變…

杭電oj(1087、1203、1003)題解

DP 即動態規劃&#xff08;Dynamic Programming&#xff09;&#xff0c;是一種通過把原問題分解為相對簡單的子問題&#xff0c;并保存子問題的解來避免重復計算&#xff0c;從而解決復雜問題的算法策略。以下從幾個方面簡述動態規劃&#xff1a; 基本思想 動態規劃的核心在…

一鍵多環境構建——用 Hvigor 玩轉 HarmonyOS Next

引言 在 HarmonyOS Next 的應用開發中&#xff0c;常常需要針對不同環境&#xff08;測試、預發、線上&#xff09;或不同簽名&#xff08;調試、正式&#xff09;輸出多個 APP/HAP 包。雖然 HarmonyOS 提供了多目標構建&#xff08;Multi-Target Build&#xff09;能力&#…

qt/c++云對象瀏覽器

簡介 本項目為基于QT5和C11的云對象存儲可視化管理工具 源碼獲取 int main(){ printf("源碼聯系綠泡泡:%s","joyfelic"); return 0; }

【Ubuntu】提升 docker ps -a 輸出的可讀性:讓 Docker 容器狀態更清晰

提升 docker ps -a 輸出的可讀性&#xff1a;讓 Docker 容器狀態更清晰 當我們使用 docker ps -a 查看所有 Docker 容器時&#xff0c;輸出的信息通常會非常多&#xff0c;尤其是在容器數量較多時。默認輸出中包含容器 ID、名稱、鏡像、狀態、端口等信息&#xff0c;容易讓人眼…

Spring Security自定義身份認證

盡管項目啟動時&#xff0c;Spring Security會提供了默認的用戶信息&#xff0c;可以快速認證和啟動&#xff0c;但大多數應用程序都希望使用自定義的用戶認證。對于自定義用戶認證&#xff0c;Spring Security提供了多種認證方式&#xff0c;常用的有In-Memory Authentication…

在亞馬遜云服務器上部署WordPress服務

在亞馬遜云服務器上部署WordPress服務第一步&#xff1a;創建EC2實例第二步&#xff1a;初始設置與安裝第三步&#xff1a;配置MySQL與WordPress第四步&#xff1a;配置Apache與WordPress第五步&#xff1a;訪問WordPress第六步&#xff1a;測試數據庫連接第七步&#xff1a;使…

Web3.0的認知補充(去中心化)

涉及開發技術&#xff1a; Vue Web3.js Solidity 基本認知 Web3.0含義&#xff1a; 新一代互聯網思想&#xff1a;去中心化及用戶為中心的互聯網 數據&#xff1a;可讀可寫可授權 核心技術&#xff1a;區塊鏈、NFT 應用&#xff1a;互聯網上應用 NFT &…

如何修復寶可夢時時刻刻冒險無法正常工作

寶可夢的時時刻刻冒險模式是一項強大的功能&#xff0c;即使應用程序關閉&#xff0c;它也能追蹤你的步行距離。它的工作原理是將你的步數與 iOS 上的 Apple Health 或 Android 上的 Google Fit 同步。它對于孵化寶可夢蛋和賺取好友糖果至關重要&#xff0c;但一旦它停止工作&a…

redis常用集合操作命令

在 Redis 的命令行界面&#xff08;redis-cli&#xff09;中&#xff0c; Redis 的集合&#xff08;Set&#xff09;是無序的&#xff0c;且集合中的元素是唯一的。Redis 本身沒有直接提供獲取集合中某個特定屬性的命令&#xff0c;因為集合中的元素是簡單的值&#xff0c;而不…

初識數據結構——二叉樹從基礎概念到實踐應用

數據結構專欄 ?(click) 初識二叉樹&#xff1a;從基礎概念到實踐應用&#x1f333; 一、樹型結構基礎 1.1 樹的基本概念 樹是一種非線性的數據結構&#xff0c;由n(n>0)個有限節點組成一個具有層次關系的集合。它看起來像一棵倒掛的樹&#xff0c;根朝上而葉朝下。 關鍵特…

駝峰命名法(Camel Case)與匈牙利命名法(Hungarian Notation)詳解

駝峰命名法&#xff08;Camel Case&#xff09;與匈牙利命名法&#xff08;Hungarian Notation&#xff09;詳解及對比? ?1. 駝峰命名法&#xff08;Camel Case&#xff09;? ?定義? 駝峰命名法&#xff08;Camel Case&#xff09;是一種變量、函數、類等標識符的命名方…

keil 中優化等級的bug

一&#xff0c;問題描述 程序中代碼有的執行&#xff0c;有的不執行&#xff0c;仔細研究&#xff0c;查詢人工智能。 程序中printf打印后面的代碼不執行&#xff0c; 然后過幾十個函數又開始正常了。 二.分析問題 跳過函數一般又判斷和Goto等語句&#xff0c;其它的溢出和錯誤…

織夢dedecms網站如何修改上一篇下一篇的標題字數

一般情況下&#xff0c;如果你的上一篇和下一篇是2行布局就不需要限制標題的字數了&#xff0c;如果你要一行布局上一篇和下一篇標題過長就會打亂網頁布局&#xff0c;那么限制上一篇和下一篇的標題字數是需要的&#xff0c;避免頁面看起來雜亂不堪。 織夢dedecms網站如何修改…

信創系統 sudoers 權限配置實戰!從小白到高手

好文鏈接&#xff1a;實戰&#xff01;銀河麒麟 KYSEC 安全中心執行控制高級配置指南 Hello&#xff0c;大家好啊&#xff01;今天給大家帶來一篇關于信創終端操作系統中 sudoers 文件詳解的實用文章&#xff01;在 Linux 系統中&#xff0c;sudo 是一項非常重要的權限控制機制…

《明解C語言入門篇》讀書筆記四

目錄 第四章&#xff1a;程序的循環控制 第一節&#xff1a;do語句 do語句 復合語句&#xff08;程序塊&#xff09;中的聲明 讀取一定范圍內的值 邏輯非運算符 德摩根定律 德摩根定律 求多個整數的和及平均值 復合賦值運算符 后置遞增運算符和后置遞減運算符 練習…

vite+vue2+elementui構建之 vite.config.js

webpack版本太低&#xff0c;構建依賴太多&#xff0c;頭大。 各種查閱資料&#xff0c;弄了一份直通構建vite構建elementUi核心文件&#xff0c; 構建基于開源若依vue2vue3版本改造&#xff0c;感謝開源&#xff0c;感謝若依。 package.json 地址 vitevue2elementui構建之…

超參數詳解:從基礎概念到優化策略的全面指南

摘要 本文深入解析機器學習中超參數的核心概念&#xff0c;詳細對比參數與超參數的本質區別&#xff0c;系統介紹學習率、隱含層數量等常見超參數類型&#xff0c;以及網格搜索、貝葉斯優化等主流尋優方法。結合超參數搜索的標準流程&#xff0c;通過具體案例演示如何高效調整…