Datawhale AI夏令营-AI极端降水预报 ##AI夏令营Datawhale#夏令营第三期
该笔记分为三个部分:
一、比赛介绍
二、baseline介绍
三、我的打榜思路
一、比赛介绍
比赛链接:
http://competition.sais.com.cn/competitionDetail/532234/format
夏令营链接:
https://linklearner.com/activity/12
比赛背景
在全球变暖背景下,极端降水发生频次更多、范围更广、强度更强,其时空尺度上也呈现出非典型的特征。2023年夏季,我国共发生 17次暴雨过程,引发严重洪涝灾害,对人民生活和社会经济造成极大影响。2022年以来基于数据驱动的大模型开始逐步超过基于物理的气象模型预报能力。
比赛任务
本次大赛要求选手利用伏羲气象大模型提供的未来72小时内逐小时的多种气象要素及相应的ERA5降水数据,来进行AI极端降水预测。目标是在给定的时间段内,基于伏羲气象大模型的输出,进一步优化和提高未来三天极端降水事件的预测准确性。
比赛数据
1.ERA5
比赛目标数据来自欧洲中期天气预报中心(ECMWF)的再分析数据ERA5,使用了ERA5的子集,1个地面变量,时间间隔1小时,空间分辨率0.25度,覆盖区域(N18 ~ N32, E103 ~ E123)。
2.FuXi
比赛输入数据来自伏羲气象大模型的输出,伏羲大模型是复旦大学发布的数据驱动的气象大模型,数据分辨率0.25度,时间间隔1小时,包含地面和高空气压层多个气象要素。
二、baseline介绍
数据加载与处理
安装xarray库,并解压训练集weather.round1.train.gt.2019-2021.zip和测试集数据weather.round1.test.zip。将数据集分为特征数据和地面真实值数据两个部分。初始化特征部分数据的类,定义特征路径、年份以及预报步数。get_features_paths()
方法用于获取每个初始化时间对应的特征数据路径。get_fts()
方法使用xarray
库读取特征数据(xarray
非常适合处理这种具有多维结构的数据),并选择指定的预报步数。初始化地面真实值部分数据类,定义地面真实值路径、年份以及预报步数。parser_gt_timestamps()
方法用于解析初始化时间和预报步数之间的关系。get_gts()
方法用于读取地面真实值数据,并选择对应的时间戳。
数据集构建
自定义了一个继承自torch.utils.data.Dataset的mydataset
类。初始化数据集类,调用特征类和地面真实值类。__getitem__()
方法用于获取每个初始化时间点的特征和地面真实值数据并将将特征数据和地面真实值数据转换为Numpy数组形式。__len__()
方法返回数据集中初始化时间点的数量。
模型训练
定义了一个 Model
类,该类初始化输入和输出通道数,以及一个简单的卷积层,用于天气预测任务。模型使用均方误差(MSE)作为损失函数,并采用 Adam 优化器进行参数更新。定义了训练循环,循环次数设为 200 次(初始迭代次数为 1,现调整为 200)。在训练过程中,每完成 10 步就打印一次损失信息。训练完成后,保存模型的权重。
推理与结果输出
模型训练完成后,加载模型权重并将模型设置为评估模式,然后对测试数据集中的每个样本进行推理。推理结果被保存为 .pth
文件,并最终打包压缩成 ZIP 格式。
三、我的打榜思路
最开始不是很理解这个baseline,第一次结果是根据夏令营提供的流程一路运行这个baseline,很顺利。后面慢慢探索这个baseline想到了几个可能可以提高分数的方法:
1、模型的迭代次数较少,通过增加迭代次数可以提高模型的性能。我将迭代次数从初始值增加至50次,分数有了明显的提升。随后,我进一步将迭代次数增加到200次,分数有了再一次的提升。(需要注意增加迭代次数可能会导致过拟合问题,尤其是在训练集数量有限的情况下。)
2、进行了网络结构调整。第四次尝试是在原有卷积层和200次迭代的基础上增加了新的卷积核、激活层,并引入了正则化系数。但好像导致了模型出现欠拟合现象,结果反而不如第三次的表现。
3、用完整的训练集数据训练。完整的训练集数据有点大,目前还没有想到一个好的方法弄到baseline里面去训练。(之后会尝试一下。)
4、更改神经网络模型,把CNN模型改为LSTM模型。(还未尝试。)