一、精读赛题
部分解读
- 数据类型为浮点型, 且是
float16
类型 - gt数据, 我们可以发现数据最小值在 -0.3 左右, 而最大值会有10~50甚至更大的值,且大部分的点都是很小的值(1以内, 甚至达到1e-4)
- 关于某些init_time在gt数据中找不到的异常,或者不能说是异常,在2021年的数据集中本就不会存在,在task2中有分析。可以去除这部分数据
重要-评价指标
基于ERA5格点降水值选取极端降水案例
评测指标:临界成功指数(CSI)
CSI = hits/(hits + false alarms + misses)
以24小时累积降水量50毫米为阀值,y_pre_1为预测的极端降水格点(24小时累积降水 >= 50 mm),y_obs_1为观测的极端降水格点,hits为预测与观测的重叠格点,其中false alarms = y_pre_1 - hits, misses = y_obs_1 - hits。
注意:其中24小时累积降水量计算方式为:1-24,25-48,49-72。
分析
- ERA5的实际的物理意义,最后的输出不应该小于0。
- 输出的大部分0值数据(0附近值), 这部分值相对于对于计算24小时累积降水量50毫米的阀值,产生的影响不大。可能存在负影响。避免其负影响
- 输出的少部分大值数据,达到10左右甚至50,对CSI指标有贡献大 ,让这部分值的预测更准。
数据为原始数据的标准分数Zscore,Zscore = (x - μ)/ σ 。ERA5降水, μ: 0.19359495,σ:0.6458292; FuXi降水, μ: 0.13014507,σ: 0.4056911。
二、速通新baseline
与原始baseline对比
- 新增验证集,查看模型在验证集的表现
- 增加了模型xvaier初始化,如果模型的初始化合适的话, 模型会很快收敛, 变成拟合程度好的新模型。
- 模型多层卷积神经网络+激活函数,网络结构更加复杂
- loss计算,每轮平均loss
三、发散思路+上分技巧
- 要想办法提高高值数据对模型的贡献, 降低0值数据(接近于0)对模型的影响
- 尝试考虑时间序列中的特征,可以尝试使用LSTM等对时间序列特征有良好提取能力的模型
- 损失函数, 数据问题, 需要对高值敏感, 加更大的惩罚项, 对低值不敏感, 及输出的低值对模型的贡献应相对来说小,即高值loss计算的权重调大,0值数据权重调小。 设置不同权重的
nn.MSELoss
损失函数。 - 划分验证集,调整超参数(学习率、优化器、scheduler、epoch等)
四、思考
长尾数据
在机器学习中,长尾数据分析涉及处理那些频率分布中存在大量低频项的数据。这种情况在许多实际应用中都很常见,比如自然语言处理、推荐系统和计算机视觉。长尾数据分析的挑战主要包括:
- 数据不平衡:
- 长尾数据通常意味着少数类别或特征占据了大部分数据,而多数类别或特征只有很少的数据样本。这会导致训练模型时对少数类别的过拟合,而对长尾类别的欠拟合。
- 模型性能:
- 传统机器学习模型通常在处理头部数据(高频数据)时表现良好,但在处理长尾数据(低频数据)时性能会大幅下降。这是因为模型在训练过程中更关注头部数据,而忽略了长尾数据。
长尾数据分析方法
- 重采样(Resampling):
- 过采样(Oversampling):增加长尾类别的数据样本数量,使其在训练集中占有较大比例。常见的方法有SMOTE(Synthetic Minority Over-sampling Technique)。
- 欠采样(Undersampling):减少头部类别的数据样本数量,使其与长尾类别的数据量更均衡。
- 数据增强(Data Augmentation):
- 对长尾类别的数据进行数据增强,比如图像的旋转、翻转、裁剪等,以增加其数据量和多样性。
- 迁移学习(Transfer Learning):
- 利用在大规模数据集上预训练好的模型,将其迁移到长尾数据集中进行微调。预训练模型可以捕捉到大量的通用特征,从而提升在长尾数据上的表现。
- 集成学习(Ensemble Learning):
- 通过训练多个不同的模型,并将它们的预测结果进行集成,可以提高模型在长尾数据上的泛化能力。常见的方法有Bagging、Boosting等。
- 损失函数调整:
- 对损失函数进行调整,使得模型在训练时对长尾类别的错误预测给予更大的惩罚。比如加权交叉熵(Weighted Cross-Entropy)、焦点损失(Focal Loss)等。
- 自监督学习(Self-Supervised Learning):
- 在无标签数据上进行预训练,通过设计特定的任务让模型学习数据的内在结构,然后在有标签的长尾数据上进行微调。
实际应用
- 自然语言处理(NLP):
- 处理长尾词汇,如稀有的单词、短语或实体。使用上下文信息、词嵌入(word embeddings)等方法来增强长尾词汇的表示能力。
- 推荐系统:
- 提供个性化推荐,满足用户的长尾兴趣。使用协同过滤、基于内容的推荐以及混合推荐算法来提升长尾物品的推荐效果。
- 计算机视觉:
- 处理长尾类别的图像分类、物体检测等任务。利用数据增强、迁移学习等技术来提升长尾类别的识别准确性。
激活函数
在选择激活函数时,需要考虑各种因素,包括模型的特定需求、数据的特性以及训练的稳定性。以下是ReLU、sigmoid、tanh和Leaky ReLU激活函数的选取依据:
1. ReLU(Rectified Linear Unit)
定义: ( f ( x ) = max ( 0 , x ) ) ( f(x) = \max(0, x) ) (f(x)=max(0,x))
优点:
- 计算效率高:ReLU的计算非常简单,只有一个条件判断。
- 收敛速度快:与sigmoid和tanh相比,ReLU通常能加速神经网络的训练过程。
- 减轻梯度消失问题:ReLU在正区间内的梯度为1,可以减轻深层网络中的梯度消失问题。
缺点:
- Dying ReLU问题:如果输入值经常为负,某些神经元可能永远不会被激活(输出恒为0),导致这些神经元对模型失去作用。
- 不适合处理负值:ReLU直接将负值置为0,可能导致信息丢失。
适用场景:
- 深层网络(如卷积神经网络中的中间层)。
- 需要加快训练速度并希望减轻梯度消失问题的场景。
2. Sigmoid
定义: ( f ( x ) = 1 1 + e − x ) ( f(x) = \frac{1}{1 + e^{-x}} ) (f(x)=1+e−x1)
优点:
- 输出范围在0到1之间:适用于需要概率输出的场景,如二分类问题。
- 平滑输出:可以产生平滑的概率预测值。
缺点:
- 梯度消失问题:在输入值较大或较小时,梯度会变得非常小,导致训练过程变慢。
- 计算复杂度较高:相比ReLU,sigmoid的计算复杂度更高。
适用场景:
- 输出层为二分类问题时使用。
- 不适合深层网络中的中间层,因为梯度消失问题会显著影响训练。
3. Tanh(双曲正切)
定义: ( f ( x ) = tanh ( x ) = e x − e − x e x + e − x ) ( f(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} ) (f(x)=tanh(x)=ex+e−xex−e−x)
优点:
- 输出范围在-1到1之间:中心对称,有助于减轻偏移量(bias)的影响。
- 比sigmoid更强的非线性表达能力:可以表示更复杂的模式。
缺点:
- 梯度消失问题:虽然比sigmoid好一些,但仍然存在梯度消失问题。
- 计算复杂度较高:和sigmoid类似,计算复杂度较高。
适用场景:
- 在需要输出范围为-1到1的情况下使用。
- 比较浅层的网络中使用,因为深层网络中梯度消失问题会影响训练。
4、Leaky ReLU
Leaky ReLU(Leakly Rectified Linear Unit)是对标准ReLU的一种改进,旨在解决ReLU的“Dying ReLU”问题,即某些神经元在训练过程中会完全失去激活功能。Leaky ReLU通过允许小的负梯度从负值流过,来保持所有神经元的激活。
定义:
f ( x ) = { x , if x > 0 α x , if x ≤ 0 f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x, & \text{if } x \leq 0 \end{cases} f(x)={x,αx,if x>0if x≤0
其中, α \alpha α是一个很小的常数,通常设为0.01。
优点:
- 避免Dying ReLU问题:即使输入值为负,Leaky ReLU也允许小的梯度通过,从而确保所有神经元在训练中都有激活的可能。
- 计算效率高:与标准ReLU类似,计算非常简单,仅多了一个线性计算。
- 训练速度快:Leaky ReLU保持了ReLU在正区间的优点,可以加速训练过程。
缺点:
- 参数调整:需要选择一个适当的 α \alpha α值,不同的任务可能需要不同的 α \alpha α 值。
- 仍然可能有梯度爆炸:虽然Leaky ReLU可以减轻梯度消失问题,但在某些情况下仍可能会有梯度爆炸的风险。
适用场景:
- 深层神经网络:尤其是当标准ReLU遇到Dying ReLU问题时,Leaky ReLU是一个很好的替代方案。
- 任何需要快速训练且希望减轻梯度消失问题的场景。
- 需要更稳定的梯度流动:尤其是当输入数据中有大量负值时,Leaky ReLU可以帮助保持梯度的稳定。
示例代码:
import torch
import torch.nn as nn
# Leaky ReLU with a negative slope of 0.01
leaky_relu = nn.LeakyReLU(0.01)
# Example usage in a neural network layer
layer = nn.Linear(10, 5)
output = leaky_relu(layer(input_data))
总结
- ReLU:适用于大多数深层网络,尤其是中间层,因为它可以加速训练并减轻梯度消失问题。
- Sigmoid:适用于输出层需要概率输出的二分类问题,不适合深层网络的中间层。
- Tanh:适用于输出范围需要在-1到1之间的情况,适合浅层网络的中间层。
- Leaky ReLU是标准ReLU的一个简单但有效的改进,能够在保持计算效率和加速训练的同时,减轻Dying ReLU问题。它适用于深层网络,尤其是在遇到标准ReLU问题时。