2.Datawhale AI夏令营 AI+气象 TASK2

1. 相关资料

1.1 书接上文

1.Datawhale AI夏令营 AI+气象 TASK1
https://blog.csdn.net/aiqq136/article/details/140756363
比赛名称:第二届世界科学智能大赛地球科学赛道:AI极端降水预报
官网连接:上海科学智能研究院
环境:https://www.modelscope.cn/my/mynotebook/preset

1.2 TASK2相关资料

【Task2链接】
https://linklearner.com/activity/12/5/12
【学习者手册】QA文档,优秀笔记等所有链接
https://datawhaler.feishu.cn/wiki/FK8cwI6TjiSZOIkzWcdcWIuEnhs

2.回顾baseline

2.1回顾baseline

我们可以大致将搭建模型并解决问题分为以下几个步骤:
1.定义数据集,建立起训练数据和标签之间的关系;定义数据加载器(DataLoader),方便取数据进行训练
2.定义模型,利用PyTorch搭建网络,根据输入输出数据维度实例化模型
3.定义损失函数,优化器,训练周期,训练模型并保存模型参数
4.模型加载及推理(模型预测),输入测试数据输出要提交的文件

2.2 feature数据,什么是gt数据,异同点

在机器学习和深度学习中,特别是在处理诸如图像、视频、时间序列或科学数据等复杂数据类型时,
“feature数据”(特征数据)和"gt数据"(地面真实数据,Ground Truth数据)是两个常见的术语:

Feature数据(Feature Data)

  • 定义:特征数据通常指输入到机器学习模型中的数据,这些数据已经被提取和处理,以突出对模型决策过程有用的信息。特征可以是原始数据的直接测量值,也可以是通过某些算法提取的派生属性。
  • 用途:特征数据用于训练模型,帮助模型学习数据中的模式和关系。
  • 示例:在图像识别中,特征可能包括像素值、纹理信息、形状描述符等;在时间序列预测中,特征可能是过去的观测值、趋势、季节性因素等。

GT数据(Ground Truth Data)

  • 定义:地面真实数据,通常缩写为GT数据,是指实际的、经过验证的数据,用作模型预测的基准。在训练和评估模型时,GT数据提供了正确答案或真实情况的参考。
  • 用途:GT数据主要用于评估模型的性能,通过比较模型的预测结果和GT数据来计算误差或性能指标。
  • 示例:在医学图像分析中,GT数据可能是由医生标记的病变区域;在天气预测中,GT数据可能是实际观测到的天气情况。

异同点

  • 相同点

    • 都是数据集的一部分,用于模型的训练和评估。
    • 都可以是多维的,包含时间、空间或其他类型的维度。
    • 在某些情况下,特征数据和GT数据可能来源于相同的原始数据集,但经过不同的处理和抽象。
  • 不同点

    • 目的:特征数据用于训练和指导模型学习,而GT数据用于评估模型学习的效果。
    • 处理方式:特征数据需要经过特征工程来提取有用信息,GT数据则通常是经过验证的、准确的数据,不需要进一步处理。
    • 使用时机:在模型训练过程中,特征数据用于前向传播;GT数据用于计算损失函数和反向传播。在模型评估阶段,GT数据用于计算性能指标。

在实际应用中,特征数据和GT数据的区分非常重要,因为它们在模型开发和评估过程中扮演着不同的角色。正确的特征工程和准确的GT数据是构建有效机器学习模型的关键。

2.3 提取数据函数

feature 类

1.初始化__init__:输入路径path 、使用到的年份years 、预测的时间点fcst_steps、还有获取到具体某个feature数据的路径features_paths_dict
2.获取到具体某个feature数据的路径get_features_paths:
其功能是获取特定路径下每个年份文件夹中文件的路径,并以时间戳的形式存储这些路径

  1. def get_features_paths(self):

    • 定义了一个名为 get_features_paths 的方法,这个方法是实例方法,因为它的第一个参数是 selfself 通常用于访问类的属性和方法。
  2. init_time_path_dict = {}

    • 初始化一个空字典 init_time_path_dict,用于存储时间戳和对应的文件路径。
  3. for year in self.years:

    • 遍历 self.years,这里假设 self.years 是一个包含年份的列表。每个年份对应一个文件夹。
  4. init_time_dir_year = os.listdir(os.path.join(self.path, year))

    • 使用 os.listdir 获取 self.path 路径下,对应年份文件夹中的所有文件和子文件夹的名称。
    • os.path.join(self.path, year) 用于将 self.pathyear 连接成一个完整的路径。
  5. for init_time in sorted(init_time_dir_year):

    • 对获取到的文件和子文件夹名称进行排序,然后遍历这些排序后的名称。
  6. init_time_path_dict[pd.to_datetime(init_time)] = os.path.join(self.path, year, init_time)

    • 将每个文件或子文件夹的名称转换为时间戳,并作为字典的键。
    • pd.to_datetime(init_time) 使用 pandas 库将字符串转换为 datetime 对象。
    • self.pathyearinit_time 连接成一个完整的文件路径,并作为字典的值。
  7. return init_time_path_dict

    • 返回填充好的字典 init_time_path_dict,其中包含时间戳和对应的文件路径。

总结:这个方法的目的是遍历指定路径下每个年份的文件夹,获取其中的文件或子文件夹名称,将这些名称转换为时间戳,并存储在字典中返回。这种方法通常用于处理按时间组织的数据集。

  1. 最后的get_fts函数, 通过使用xarray库中加载cdf数据,其中sel()中要增加对应的预测预测间隔, isel()中time要设置为0, 表示从头开始组成数据. 这听起来可能有些绕, 我们可以看到在.sel()后, 数据的维度是(1, 6, 24, 57, 81), 其中的6是因为我们看到的feature中的.nc数据, 是每隔6小时一取的;再经过.isel()方法后, 数据维度就变成了(6, 24, 57, 81), 即通过取time=0处索引的数据, 去除了作为数据输入时, 用不到的时间戳,这样实现了数据集的结构化处理。

    return xr.open_mfdataset(self.features_paths_dict.get(init_time) + ‘/*’).sel(lead_time=self.fcst_steps).isel(time=0)
    这是方法的主体,它执行以下操作并返回结果:

    a. self.features_paths_dict.get(init_time)
    从 self.features_paths_dict 字典中获取以 init_time 作为键的值。这个字典包含了时间戳与文件路径的映射。

    b. + ‘/
    将 '/
    ’ 附加到从字典中获取的路径上,这样 open_mfdataset 可以搜索该路径下的所有文件。

    c. xr.open_mfdataset(…)
    使用 xarray 库的 open_mfdataset 函数打开一个多文件数据集。xarray 是一个用于处理多维数组的库,常用于地球科学数据。

    d. .sel(lead_time=self.fcst_steps)
    使用 sel 方法选择数据集中的特定 lead_time。self.fcst_steps 可能是一个属性,表示预测的时间步长。

    e. .isel(time=0)
    使用 isel 方法选择时间维度上的第一个元素,即 time=0。这通常表示初始时间点的数据。

总结:get_fts 方法通过 init_time 从字典中找到对应的文件路径,然后使用 xarray 打开这个路径下的所有数据文件,选择特定预测时间步长的数据,并从时间维度上选择初始时间点的数据。这通常用于气象或气候模型中,获取特定初始时间的预测数据。

GT类

gts即添加了年份中所有的gt数据

parser_gt_timestamps:基于 init_time 和预测步长 self.fcst_steps 计算出的时间戳
return [init_time + pd.Timedelta(f'{fcst_step}h') for fcst_step in self.fcst_steps]

a. [...] 表示这是一个列表推导式,用于生成一个列表。

b. for fcst_step in self.fcst_steps
- 遍历 self.fcst_steps,这里 self.fcst_steps 是一个包含预测步长的列表或迭代器。

c. pd.Timedelta(f'{fcst_step}h')
- 使用 pandas 库的 Timedelta 函数创建一个时间增量。f'{fcst_step}h' 是一个格式化字符串,其中 fcst_step 是从 self.fcst_steps 中取出的步长值,后面加上 'h' 表示小时。

d. init_time + pd.Timedelta(...)
- 将 init_time 与上面创建的时间增量相加,得到一个新的时间戳。

e. return [...]
- 返回生成的列表,其中包含了从 init_time 开始,按照 self.fcst_steps 中的步长递增的所有时间戳。

总结:parser_gt_timestamps 方法通过接收一个初始时间 init_time 和一个预测步长列表 self.fcst_steps,使用列表推导式生成一个新的时间戳列表,每个时间戳都是从初始时间开始,按照预测步长递增得到的。这通常用于生成一系列预测时间点,例如在气象进行时间序列预测时。

2.4 数据集

数据集是继承torch.utils.data中的Dataset类
__get_item__方法是我们进行取数据的操作, 通过传入的index, 可以获取到对应的时间戳, 然后通过此时间戳, 可以从feature和gt中获取到对应的数据.

2.5 模型的构建

模型类, 继承于nn.Module类的

super(Model, self).init()就是用来使用父类nn.Module中的初始化方式
baseline只简单的定义了一层卷积
num_in_ch和num_out_ch分别指输入的通道数和输出的通道数(特征数)
卷积核大小为3x3,步长为1,填充为1

forward()函数是我们在使用网络时做前向传播的函数
前向传播: 根据输入数据生成输出
x是输入张量,其形状被分解为批次大小B,序列长度S,通道数C,宽度W和高度H

X:输入张量:维度(Dimensions)
B:批次大小(batch size),表示一次处理的样本数量。
S:序列长度(sequence length),在某些任务中可能代表时间步长或其他序列特征。
C:通道数(number of channels),在图像数据中通常代表颜色通道。
W 和 H:宽度和高度,表示张量在二维空间上的尺寸。

reshape 方法重新组织 x 的形状。
保证跟赛题中要求的输出维度一致
-1 表示自动计算该维度的大小,以保持张量的元素总数不变。
这里将 S * C 合并为一个新的维度,这通常是为了将序列长度和通道数合并,以便进行卷积操作。

# 模型构建部分
import torch.nn as nn

class Model(nn.Module):
    def __init__(self, num_in_ch, num_out_ch):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(num_in_ch, num_out_ch, 3, 1, 1)

    def forward(self, x):
        B, S, C, W, H = tuple(x.shape)
        x = x.reshape(B, -1, W, H)
        out = self.conv1(x)
        out = out.reshape(B, S, W, H)
        return out

# define model
in_varibales = 24
in_times = len(fcst_steps)
out_varibales = 1
out_times = len(fcst_steps)
input_size = in_times * in_varibales
output_size = out_times * out_varibales
model = Model(input_size, output_size).cuda()

2.6定义模型的损失函数

一般对于回归任务而言, MSELoss是最常用的

2.7模型训练

Adam优化器, 设置的学习率为0.001

2.8 模型推理

加载模型权重
测试输入数据的路径进行指定
循环来遍历测试数据路径下所有的数据
调用模型, 输入测试数据, 得出输出数据
输出的数据进行保存

3.伏羲大模型初探

复旦大学主力研发,并得到Shanghai AI Lab(上海人工智能实验室)创新孵化研究院的助力推出
长达15天的全球预报,拥有6小时的时间分辨率和0.25°的空间分辨率
论文原文:https://arxiv.org/pdf/2306.12873
Github:https://github.com/tpys/FuXi
模型、数据获取渠道(百度网盘):https://pan.baidu.com/share/init?surl=PDeb-nwUprYtu9AKGnWnNw&pwd=fuxi#list/path=/
模型、数据获取渠道(Zenodo):https://zenodo.org/records/10401602

自回归模型(Autoregressive Model,简称 AR 模型)是一种统计模型,主要用于时间序列数据的预测
它基于这样一个假设:一个时间序列的未来值可以由其过去值的线性组合来预测
它采用前两个时间步的天气参数(𝑋𝑡−1,𝑋𝑡)作为输入,进而预测下一个时间步(𝑋𝑡+1)的天气参数。

自回归多步损失函数,可以有效减少长期预报过程中的累积误差
在时间序列预测中,自回归多步损失函数是一种衡量预测误差的方法,它特别适用于多步预测任务。在多步预测中,模型不仅要预测下一个时间点的值,还要预测未来多个时间点的值。多步损失函数可以帮助我们评估模型在整个预测序列上的整体性能。
基本概念

多步预测任务中,损失函数通常考虑以下几个方面:

预测精度:预测值与实际值之间的差异。
时间序列的依赖性:预测值的序列应保持时间序列的特性,如趋势、季节性等。

常见的多步损失函数

均方误差(MSE):
MSE=1N∑t=1N(yt−y^t)2MSE=N1​∑t=1N​(yt​−y^​t​)2
其中,ytyt​ 是实际值,y^ty^​t​ 是预测值,NN 是预测步数。

平均绝对误差(MAE):
MAE=1N∑t=1N∣yt−y^t∣MAE=N1​∑t=1N​∣yt​−y^​t​∣

均方根误差(RMSE):
RMSE=1N∑t=1N(yt−y^t)2RMSE=N1​∑t=1N​(yt​−y^​t​)2

​

对数均方误差(Log-MSE):
Log-MSE=1N∑t=1N(log⁡(1+yt)−log⁡(1+y^t))2Log-MSE=N1​∑t=1N​(log(1+yt​)−log(1+y^​t​))2
这种损失函数特别适用于预测正数序列,如股票价格。

负对数似然损失(NLL):
NLL=−1N∑t=1Nlog⁡(p(yt∣y^t))NLL=−N1​∑t=1N​log(p(yt​∣y^​t​))
其中,p(yt∣y^t)p(yt​∣y^​t​) 是预测值的似然概率。

加权损失函数:
在某些情况下,可能需要对不同时间点的预测误差赋予不同的权重,例如,更关注近期的预测精度。可以通过引入权重 wtwt​ 来定义加权损失函数:
W-MSE=1N∑t=1Nwt(yt−y^t)2W-MSE=N1​∑t=1N​wt​(yt​−y^​t​)2

多步预测的特殊考虑

在多步预测中,损失函数的选择和设计需要考虑以下因素:

预测步长:预测的时间跨度越大,预测的不确定性通常越高。
时间序列特性:时间序列可能具有趋势、季节性等特性,这些特性需要在损失函数中得到考虑。
模型的稳定性:多步预测模型需要在预测过程中保持稳定,避免预测值出现剧烈波动。
计算复杂性:损失函数的计算复杂性可能会影响模型训练的效率。

应用示例

在实际应用中,选择和设计多步损失函数需要根据具体的预测任务和数据特性进行。例如,在金融市场预测中,可能更关注短期预测的精度,而在气象预测中,可能更关注长期预测的稳定性。

通过合理选择和设计多步损失函数,可以有效地指导模型训练,提高预测的准确性和可靠性。

时间窗口被划分为FuXi-Short(0-5天)、FuXi-Medium(5-10天)和FuXi-Long(10-15天)。
FuXi-Short和FuXi-Medium的输出在第20步和第40步时,分别被用作FuXi-Medium和FuXi-Long的输入

4. 时间序列分析入门

时间序列分析问题, 一般数据序列中前后有顺序上或周期上的关联。

统计方法中, 常用自回归(AR)模型、移动平均(MA)模型, 或者自回归滑动平均模型(ARMA)模型

自回归(AR)、移动平均(MA)和自回归滑动平均(ARMA)模型是时间序列分析中的三种基本模型,它们用于预测和分析时间序列数据。下面是对这三种模型的简要介绍:
在这里插入图片描述

模型的参数估计和诊断

  • 参数估计:通常使用最小二乘法(OLS)来估计AR和ARMA模型的参数。对于MA模型,参数估计可能更复杂,需要使用如极大似然估计或贝叶斯方法。
  • 模型诊断:使用残差分析(如Durbin-Watson统计量)来检查误差项的自相关性。残差应该是白噪声,即没有自相关性。

模型的应用

  • 经济预测:用于预测经济指标,如GDP、失业率等。
  • 金融市场分析:用于预测股票价格、利率等。
  • 气象预测:用于预测天气模式、温度变化等。

模型的局限性

  • 线性假设:这些模型都基于线性假设,可能无法捕捉到非线性关系。
  • 数据平稳性:模型通常要求时间序列是平稳的,非平稳序列可能需要先进行差分或其他转换。
  • 模型选择:选择合适的模型阶数(( p ) 和 ( q ))可能具有挑战性,需要依赖于模型选择准则(如AIC、BIC)。

扩展模型

  • 季节性自回归滑动平均(SARIMA):考虑时间序列的季节性模式。
  • 分数阶自回归滑动平均(ARFIMA):使用分数阶差分来处理长记忆时间序列。

这些模型是时间序列分析的基础,通过合理选择和应用,可以有效地对时间序列数据进行预测和分析。

自回归积分滑动平均(ARIMA)

自回归积分滑动平均(ARIMA)模型是一种广泛应用于时间序列分析的统计模型,它结合了自回归(AR)、差分(I)和移动平均(MA)三个组件,特别适用于分析和预测具有趋势和季节性的非平稳时间序列数据。

ARIMA模型的组成部分:

  1. 自回归(AR)部分:模型当前值与之前值的线性组合,捕捉时间序列的依赖性。

  2. 差分(I)部分:对原始时间序列进行差分,以使序列变得平稳。差分次数 ( d ) 取决于时间序列的非平稳程度。

  3. 移动平均(MA)部分:当前值与先前误差项的线性组合,捕捉时间序列的短期波动。

ARIMA模型的一般形式:

在这里插入图片描述

ARIMA模型的参数估计:

  • 模型识别:首先确定 ( p, d, q ) 的值,这通常基于时间序列的自相关函数(ACF)和偏自相关函数(PACF)图。
  • 参数估计:使用最大似然估计或最小二乘法来估计模型参数。
  • 模型诊断:通过残差分析来检查模型的拟合优度和误差项的自相关性。

ARIMA模型的应用:

  • 经济数据分析:用于预测经济指标,如GDP、通货膨胀率等。
  • 金融市场分析:用于预测股票价格、汇率等。
  • 气象数据分析:用于预测温度、降水量等。

ARIMA模型的局限性:

  • 模型选择:确定合适的 ( p, d, q ) 值可能具有挑战性,需要依赖于模型选择准则(如AIC、BIC)。
  • 线性假设:ARIMA模型基于线性关系,可能无法捕捉到复杂的非线性模式。
  • 数据平稳性:模型要求时间序列在差分后是平稳的。

扩展模型:

  • 季节性ARIMA(SARIMA):在ARIMA模型的基础上增加了季节性差分和季节性自回归及移动平均项,用于分析具有明显季节性特征的时间序列。
  • 季节性ARIMA的扩展(SARIMAX):在SARIMA的基础上增加了外生变量,用于考虑外部因素的影响。

ARIMA模型是时间序列分析中的重要工具,通过合理地选择和应用,可以有效地对时间序列数据进行建模和预测。

循环神经网络(RNN)

循环神经网络(Recurrent Neural Network,简称RNN)是一种适合于序列数据的深度学习模型。
与前馈神经网络(如多层感知机)不同,RNN能够处理序列中的动态特征,即能够捕捉时间序列中的前后依赖关系。
RNN广泛应用于自然语言处理(NLP)、语音识别、时间序列预测等领域。

RNN的关键特点:

  1. 循环连接:RNN的每个神经元不仅接收来自前一层的输入,还会接收来自同一层上一个时间步的输出作为输入。

  2. 时间步:RNN在序列的每个时间步上进行计算,每个时间步的输出不仅影响当前步,还会影响下一个时间步。

  3. 隐藏状态:RNN通过隐藏状态(hidden state)传递之前时间步的信息。隐藏状态可以看作是网络对序列到目前为止的“记忆”。

  4. 权重共享:在RNN中,无论时间步如何,所有时间步的权重都是相同的,即权重在时间上共享。

RNN的数学表达:

在这里插入图片描述

RNN的变体:

  1. 长短期记忆网络(LSTM):为了解决RNN训练中的梯度消失或梯度爆炸问题,LSTM引入了门控机制来控制信息的流动。

  2. 门控循环单元(GRU):GRU是LSTM的变体,它将LSTM中的遗忘门和输入门合并为一个更新门,并且更新门同时负责重置和更新隐藏状态。

  3. 双向RNN(Bi-RNN):Bi-RNN在每个时间步同时处理过去和未来的信息,它由两个RNN组成,分别处理正向和反向的序列数据。

  4. 深度RNN:在深度RNN中,网络不仅在时间上展开,还在深度上堆叠多个RNN层。

RNN的训练:

RNN的训练通常使用反向传播通过时间(Backpropagation Through
Time,BPTT)算法。BPTT通过展开RNN的循环结构,计算损失函数关于网络参数的梯度。

RNN的应用:

  1. 自然语言处理:如语言模型、机器翻译、文本分类等。
  2. 语音识别:将音频信号转换为文本。
  3. 时间序列预测:如股票价格预测、气象预测等。
  4. 音乐生成:根据音乐序列生成新的音乐片段。

尽管RNN在理论上能够捕捉长距离依赖关系,但在实践中,由于梯度消失或爆炸问题,它们通常难以训练,并且难以学习长期依赖。LSTM和GRU等变体通过引入门控机制来解决这些问题,使得RNN能够更有效地处理长序列数据。

长短记忆网络(LSTM)

长短记忆网络(Long Short-Term Memory,简称LSTM)是一种特殊类型的循环神经网络(RNN),
由Hochreiter和Schmidhuber在1997年提出。
LSTM设计用来解决传统RNN在处理长序列数据时遇到的梯度消失或梯度爆炸问题。
LSTM通过引入三个门控机制(输入门、遗忘门、输出门)来控制信息的流动,从而能够学习到长期依赖关系。

LSTM的关键特点:

在这里插入图片描述

LSTM的数学表达:

LSTM的计算可以概括为以下步骤:
在这里插入图片描述

LSTM的应用:

  1. 自然语言处理:LSTM在文本分类、情感分析、机器翻译等领域表现出色。
  2. 语音识别:LSTM能够处理音频信号中的长距离依赖关系。
  3. 时间序列预测:LSTM能够捕捉时间序列数据中的长期趋势和周期性。
  4. 音乐生成:LSTM可以根据音乐序列生成新的音乐作品。

LSTM的优势:

  • 避免梯度消失:由于门控机制,LSTM能够学习到长期依赖关系,避免传统RNN中的梯度消失问题。
  • 灵活性:LSTM可以处理任意长度的序列,不受序列长度的限制。
  • 泛化能力:LSTM能够捕捉复杂的模式和长期依赖关系,具有很好的泛化能力。

尽管LSTM在处理长序列数据方面具有优势,但在某些情况下,它仍然可能面临梯度消失的问题,特别是当序列非常长时。此外,LSTM的计算复杂度相对较高,需要更多的参数和计算资源。尽管如此,LSTM仍然是当前最流行的RNN变体之一,被广泛应用于各种序列建模任务。

5.脑洞大开

  1. 还记得上节task中给大家布置了一些思考题,经过本次的学习,相信你一定可以发现之前的baseline中是存在一些问题的, 请指出,并给出你的修改意见
  2. 观察数据的组成结合时间序列分析, 你认为本次赛题数据中有哪些值得改进的地方, 或者如果赛题方将每个时间节点的数据作为赛题数据, 你会如何制作数据集?
  3. 本次赛题你认为是否是时间序列预测问题, 并给出相应的理由

6.上分指引

  1. 尝试使用更多的数据,但是也要注意数据内的噪声也对分数有着负影响
  2. 使用更深的网络,或其他更适合解决此类问题的网络
  3. 模型训练要保证模型训练到收敛, loss逐渐稳定时, 同时也要注意在训练数据上过拟合会对预测数据有负影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值