Private 2nd Public 1st rank Solution
Private 第2名 Public 第1名 解决方案
作者:ByungSunBae | 比赛排名:第2名
感谢 INGV 竞赛,我获得了一段非常好的体验。感谢主办这次活动的组织机构。
在本次比赛中制作解决方案(即模型)时,我经历了以下流程。
1. 数据预处理
- 缺失值 (NA) 处理:填充为 0。
- 按 segment_id 归一化数据:
- 对每一列进行归一化。具体执行方法如下:
- 减去平均值以求出偏差。
- 将偏差除以绝对偏差值的最大值。加上 0.00001 以防止分母为零。
- 特征提取:我使用 Python 的
librosa 模块从原始数据中提取特征。
- rms (均方根)
- spectral_centroid (频谱质心)
- spectral_bandwidth (频谱带宽)
- zero_crossing_rate (过零率)
- mel frequency cepstral coefficient (梅尔频率倒谱系数)
- poly_features (多阶特征)
- spectral_contrast (频谱对比度)
- 应用 stft 后的 chroma_stft (色度特征)(或未应用)
- 数据集划分:根据是否应用 chroma_stft,我的数据集划分如下:
- 第一组:未应用 chroma_stft,每个 segment_id 的数据形状:(Channel, Time) => (340, 118)
- 第二组:应用了 chroma_stft,每个 segment_id 的数据形状:(Channel, Time) => (460, 118)
- 保存数据:将每个 segment_id 的数据保存为 numpy 数组(例如 212423.csv -> 212423.npy)。
- 构建一组数据需要 3 小时(包含训练集和测试集共需 6 小时)。
- 事实上,我并没有真正理解波形(Waveform)数据集。如果我能更好地理解它,我就能构建出比现在性能更好的模型。
2. 模型训练
- 模型架构
- 激活函数:除 Bi-LSTM 和 FC 层外,均使用 Leaky ReLU。
- 参考来源:
- 交叉验证:基于训练目标
time-to-eruption 进行 K-Means 聚类,使用分层 5 折交叉验证。
- 在进行 K=5 的 K-Means 聚类后,使用 sklearn 的 StratifiedKFold 进行分层抽样。
- 我的思路是确保每个留出集中的目标值分布均匀。
- 损失函数:LogCoshLoss
- 优化器:
- AdamW,weight_decay 为 0.001。
- 学习率调度器:CosineAnnealingWarmRestarts(周期:10 个 epoch)。
- 模型变体:我制作了两个具有以下差异的模型: