周周星分享7.3—基于氣象大數據的自動站實況聯合預測

賽題

2024中國高校計算機大賽 — 大數據挑戰賽

在這里插入圖片描述

經驗分享

大家好,我是掃地僧團隊的隊長,以前參加這樣打榜的比賽比較少,了解的打榜技巧不是太多,所以想從科研的角度給大家一點分享。

這次比賽主要從以下五個步驟進行:數據集構造👉Baseline選擇👉模型優化👉模型調參👉模型集成

1. 數據集構造

官方已經給了數據集,可以嘗試根據溫度篩選出與中國溫度類似的場站,但是不確定是否會有效果:

import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as pltroot_path = '../dataset/global'
data_path = 'temp.npy'
data = np.load(os.path.join(root_path, data_path))data_oneyear = data[:365*24,:,0]
df = pd.DataFrame(data_oneyear)# 夏天平均溫度大于15攝氏度
summer_df = df.iloc[4000:5500]
print(summer_df.shape)
summer_index = summer_df.mean(axis=0).apply(lambda x: x > 15)
summer_index = summer_index[summer_index].index.to_list()
print(len(summer_index))# 冬天平均溫度小于20攝氏度
winter_df = df.iloc[0:500]
print(winter_df.shape)
winter_index = winter_df.mean(axis=0).apply(lambda x: x < 20)
winter_index = winter_index[winter_index].index.to_list()
print(len(winter_index))# 取兩個表的交集
index = list(set(summer_index) & set(winter_index))
print(len(index))# 取兩個表的交集
index = list(set(summer_index) & set(north_index) & set(winter_index))
print(len(index))
# 篩選電站
root_path= '../dataset/global'
temp_path = 'temp.npy'
wind_path = 'wind.npy'
global_data_path = 'global_data.npy'
temp_data = np.load(os.path.join(root_path, temp_path))
wind_data = np.load(os.path.join(root_path, wind_path))
global_data = np.load(os.path.join(root_path, global_data_path))
print(temp_data.shape)
print(wind_data.shape)
print(global_data.shape)temp_seleted = temp_data[:,index,:]
wind_seleted = wind_data[:,index,:]
global_seleted = global_data[:,:,:,index]
print(temp_seleted.shape)
print(wind_seleted.shape)
print(global_seleted.shape)# 劃分訓練集和驗證集
l = temp_seleted.shape[0]
train_size = int(l * 0.9)
temp_seleted_train = temp_seleted[:train_size,:,:]
wind_seleted_train = wind_seleted[:train_size,:,:]
global_seleted_train = global_seleted[:int(train_size/3),:,:]
temp_seleted_val = temp_seleted[train_size:,:,:]
wind_seleted_val = wind_seleted[train_size:,:,:]
global_seleted_val = global_seleted[int(train_size/3):,:,:]
print("train:",temp_seleted_train.shape,wind_seleted_train.shape,global_seleted_train.shape)
print("val:",temp_seleted_val.shape,wind_seleted_val.shape,global_seleted_val.shape)# 保存訓練集和驗證集
if not os.path.exists(os.path.join('../dataset', 'seleted_global_train_val')):os.makedirs(os.path.join('../dataset', 'seleted_global_train_val'))
selected_path = os.path.join('../dataset', 'seleted_global_train_val')
np.save(os.path.join(selected_path, 'temp_train.npy'), temp_seleted_train)
np.save(os.path.join(selected_path, 'temp_val.npy'), temp_seleted_val)
np.save(os.path.join(selected_path, 'wind_train.npy'), wind_seleted_train)
np.save(os.path.join(selected_path, 'wind_val.npy'), wind_seleted_val)
np.save(os.path.join(selected_path, 'global_train.npy'), global_seleted_train)
np.save(os.path.join(selected_path, 'global_val.npy'), global_seleted_val)

篩選后溫度和風速形狀如圖所示:

在這里插入圖片描述

2. Baseline選擇

官方Baseline給的是iTransformer,關于iTransformer模型的解讀請參考:【PaperInFive-時間序列預測】iTransformer:轉置Transformer刷新時間序列預測SOTA(清華)

可以關注近近兩年開源的SOTA模型,這里分享一個Github,可以去上面找近年的SOTA模型:https://github.com/ddz16/TSFpaper

3. 模型優化

選好效果好的Baseline后就可以進行模型優化,比如iTransformer只建模了特征信息,那么可以在模型中補充對時序特征的建模,比如進行一些卷積操作,或者在時間維度上進行self-Attention,關于時間維度上的建模大家也可以參考SOTA論文,可以把不同論文里的模塊進行一個融合,說不定會有好效果。

4. 模型調參

確定了模型結構后就可以進行模型超參數的調整,比如模型的維度和層數,學習率和batch size等,經過測試增加模型的dimention在一定程度上可以提高模型表現,但是增加層數好像效果不太明顯。

學習率方面我初始值為0.01或0.005,每一輪除以2進行衰減。batch size我設為40960。

5. 模型集成

最后可以把不同特征的模型進行集成,比如可以把多個模型的結果取平均,或者可以在訓練時采用Mixture of Expert的方式加權求和。

幫助代碼

1. 模型測試

加在exp_long_term_forecasting.py里面:

    def val(self, setting):_, _, val_data, val_loader = self._get_data()time_now = time.time()criterion = self._select_criterion()if self.args.use_amp:scaler = torch.cuda.amp.GradScaler()self.model.load_state_dict(torch.load(self.args.state_dict_path,map_location=torch.device('cuda:0')))self.model.eval()val_loss = []for i, (batch_x, batch_y) in enumerate(val_loader):batch_x = batch_x.float().to(self.device)batch_y = batch_y.float().to(self.device)# encoder - decoderif self.args.use_amp:with torch.cuda.amp.autocast():if self.args.output_attention:outputs = self.model(batch_x)[0]else:outputs = self.model(batch_x)f_dim = -1 if self.args.features == 'MS' else 0outputs = outputs[:, -self.args.pred_len:, f_dim:]batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)loss = criterion(outputs, batch_y)print("\titers: {0} | loss: {2:.7f}".format(i + 1, loss.item()))val_loss.append(loss.item())else:if self.args.output_attention:outputs = self.model(batch_x)[0]else:outputs = self.model(batch_x)f_dim = -1 if self.args.features == 'MS' else 0outputs = outputs[:, -self.args.pred_len:, f_dim:]batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device)loss = criterion(outputs, batch_y)if (i + 1) % 50 == 0:print("\titers: {0} | loss: {1:.7f}".format(i + 1, loss.item()))val_loss.append(loss.item())val_loss = np.average(val_loss)print("Val Loss: {0:.7f}".format(val_loss))return self.model

2. 驗證集Dataloader

加在data_factory.py里面:

def data_provider(args):Data = data_dict[args.data]shuffle_flag = Truedrop_last = Falsebatch_size = args.batch_size train_data_set = Data(root_path=args.root_path,data_path=args.train_data_path,global_path=args.train_global_path,size=[args.seq_len, args.label_len, args.pred_len],features=args.features)train_data_loader = DataLoader(train_data_set,batch_size=batch_size,shuffle=shuffle_flag,num_workers=args.num_workers,drop_last=drop_last)val_data_set = Data(root_path=args.root_path,data_path=args.val_data_path,global_path=args.val_global_path,size=[args.seq_len, args.label_len, args.pred_len],features=args.features)val_data_loader = DataLoader(val_data_set,batch_size=int(batch_size/8),shuffle=False,num_workers=args.num_workers,drop_last=drop_last)return train_data_set, train_data_loader, val_data_set, val_data_loader

最后

希望大家以賽為友,共同進步,一起分享一些有用的小技巧。

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

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

相關文章

Linux Doxygen快速生成文檔

此前寫過一篇編寫Doxygen格式的注釋以用于生成文檔,點擊以查閱, Doxygen常用語法與字段記錄,但是當時用的windows桌面版的doxygen,最近使用ubuntu編寫代碼想直接使用doxygen生成,故寫下此博客 Doxygen Doxygen是一個用于生成軟件文檔的工具&#xff0c;它可以從代碼中提取注釋…

(四)opengl函數加載和錯誤處理

#include <glad/glad.h>//glad必須在glfw頭文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void frameBufferSizeCallbakc(GLFWwindow* window, int width, int height) {glViewport(0, 0, width, height);std::cout << width << &qu…

PHP多線程爬蟲:高效解析電商網頁內容

如何使用php多線程編寫高效的網頁爬蟲 隨著互聯網的發展和數據的不斷增長&#xff0c;網頁爬蟲成為了一種非常重要的工具。通過網頁爬蟲&#xff0c;我們可以自動地從各種網站上獲取大量的數據&#xff0c;并進行進一步的處理和分析。而PHP作為一種廣泛使用的編程語言&#xf…

Android高級面試_6_性能優化

Android 高級面試-7&#xff1a;網絡相關的三方庫和網絡協議等 1、網絡框架 問題&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的區別&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

SwanLinkOS首批實現與HarmonyOS NEXT互聯互通,軟通動力子公司鴻湖萬聯助力鴻蒙生態統一互聯

在剛剛落下帷幕的華為開發者大會2024上&#xff0c;伴隨全場景智能操作系統HarmonyOS Next的盛大發布&#xff0c;作為基于OpenHarmony的同根同源系統生態&#xff0c;軟通動力子公司鴻湖萬聯全域智能操作系統SwanLinkOS首批實現與HarmonyOS NEXT互聯互通&#xff0c;率先攻克基…

大模型與機器人精彩碰撞-7月5日晚上八點不見不散!

在瞬息萬變的科技時代&#xff0c;新興人工智能和機器人技術的結合正在引領新一輪的創新浪潮。你是否想成為未來科技的領航者&#xff1f;你是否想了解最前沿的AI與機器人技術&#xff1f;行麥科技重磅推出的“AIGC時代的生存法則”AI系列課&#xff0c;將為你揭開大模型與機器…

創建kset

1、kset介紹 2、相關結構體和api介紹 2.1 struct kset 2.2 kset_create_and_add kset_create_and_addkset_createkset_registerkobject_add_internalkobject_add_internal2.3 kset_unregister kset_unregisterkobject_delkobject_put3、實驗操作 #include<linux/module.…

【leetcode64-69二分查找、70-74棧、75-77堆】

二分查找[64-69] 時間復雜度O(log n)&#xff0c;要想到二分排序 35.搜索插入位置 class Solution:def searchInsert(self, nums: List[int], target: int) -> int:left 0right len(nums)-1while left < right: #左閉右閉mid (leftright)//2if nums[mid] < target…

【算法訓練記錄——Day39】

Day39——動態規劃Ⅱ 1.leetcode_62不同路徑2.leetcode_63不同路徑Ⅱ3.leetcode_343整數拆分4.leetcode_96不同的二叉樹搜索 1.leetcode_62不同路徑 思路&#xff1a;經典的動態規劃問題&#xff1a; dp[i][j]表示到達&#xff08;i&#xff0c;j&#xff09;位置時的不同路徑…

運維鍋總淺析云原生DevOps工具

本文從Tekton與Kubevela、Jenkins、GitLab CI的區別與聯系對常見的云原生DevOps工具進行對比分析&#xff0c;最后給出DevOps工具選型思路。希望對您有所幫助&#xff01; 一、DevOps簡介 DevOps是一種結合了軟件開發&#xff08;Development&#xff09;和IT運維&#xff08…

怎么在windows、linux、mac上安裝pnpm呢?

怎么在windows、linux、mac上安裝pnpm呢&#xff1f; 前言 如果您不使用獨立腳本或 pnpm/exe 來安裝 pnpm&#xff0c;則需要在系統上安裝 Node.js&#xff08;至少 v16.14&#xff09;。 原址&#xff1a;https://pnpm.io/zh/installation 使用獨立腳本安裝 即使沒有安裝…

登錄功能和校驗

基礎版 controller package com.web.management.controller;import com.web.management.pojo.Emp; import com.web.management.pojo.Result; import com.web.management.service.EmpService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.anno…

Ignis 應用: 社交 + 游戲 + 工業4.0,Ignis 構建Web3生態圈

引言 在數字經濟快速發展的今天&#xff0c;Web3技術為我們帶來了前所未有的變革。作為Ardor平臺的主要子鏈&#xff0c;Ignis公鏈在推動Web3生態系統建設中扮演了重要角色。本文將通過介紹Vessel Chain、Mythical Beings和Bridge Champ等應用&#xff0c;探討Ignis公鏈如何通…

GB/T 43566-2023中小學人造草面層足球場地檢測

人造草面層是指以類似天然草的合成纖維經機械編織固定于底布上形成人造草&#xff0c;至現場粘接并與彈性墊層等必要的其他材料組裝成整體的面層。 GB/T 43566-2023中小學人造草面層足球場地檢測項目&#xff1a; 測試項目 測試方法 人造草物理性能 GB/T 20394 人造草有害…

html+css+js文章模板

圖片 源代碼在圖片后面&#xff0c;點贊加關注&#xff0c;謝謝&#x1f604; 源代碼 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width,…

redis的數據類型對應的使用場景

Redis提供了多種數據類型&#xff0c;每種數據類型都有其特定的適用場景。以下是Redis主要數據類型及其典型應用場景&#xff1a;1. 字符串(String) 應用場景&#xff1a;適用于存儲簡單的鍵值對數據&#xff0c;如用戶基本信息、計數器&#xff08;如網頁訪問次數&…

停車場車牌識別計費系統,用Python如何實現?

關注星標&#xff0c;每天學習Python新技能 前段時間練習過的一個小項目&#xff0c;今天再看看&#xff0c;記錄一下~ 項目結構 說明&#xff1a; datefile文件夾&#xff1a;保存車輛信息表的xlsx文件 file文件夾&#xff1a;保存圖片文件夾。ic_launcher.jpg是窗體的右上角…

周下載量20萬的npm包---store

https://www.npmjs.com/package/store <script setup> import { onMounted } from vue import store from storeonMounted(() > {store.set(user, { name: xutongbao })let user store.get(user)console.log(user) //對象console.log(localStorage.getItem(user)) //…

基于深度學習的換頭特效

基于深度學習的換頭特效是一項計算機視覺和圖像處理技術&#xff0c;旨在將一個人的臉部特征無縫替換到另一個人的頭部&#xff0c;同時保持自然和真實的視覺效果。這項技術廣泛應用于電影制作、虛擬現實、娛樂和社交媒體等領域。以下是關于這一領域的系統介紹&#xff1a; 1.…

linux nfs的使用

版權聲明&#xff1a;來自百度AI&#xff0c;此處記錄是方便日后查看&#xff0c;無任何商業用途 linux網絡文件共享服務之nfs NFS&#xff08;Network File System&#xff09;是一種允許計算機用戶或者操作系統通過網絡以類似本地的方式訪問文件的協議。以下是一個簡單的NF…