返回列表

33th solution : Crazy 10 days sprint with 2D pipeline

600. HMS - Harmful Brain Activity Classification | hms-harmful-brain-activity-classification

开始: 2024-01-09 结束: 2024-04-08 临床决策支持 数据算法赛
CPMP 的第33名解决方案:疯狂10天冲刺与2D流水线

CPMP 的第33名解决方案:疯狂10天冲刺与2D流水线

作者: CPMP (Grandmaster)

发布日期: 2024年4月9日

投票数: 62

竞赛排名: 第30名

我在比赛结束前10天才加入,对结果感觉不温不火。虽然不算完美,但足以让我对这次晚参赛没有遗憾。同时,我也不确定再多几天是否能带来显著提升——或许还需要整整一个月。

无论如何,我能最后时刻参赛完全得益于社区的高质量分享,尤其是 @cdeotte 的精华总结。@goldenlock 关于"10票以上数据才可靠"的提醒让我受益匪浅,@pcjimmmy 指出"10票以上的均值优于全体数据均值"也是关键洞见。还有更多无法一一列举的分享,但我衷心感谢。小数据集的快速迭代能力也是关键因素。

由于时间有限,我无法投入大量时间研究不能立即见效的技术。这也是我完全没有使用1D模型的原因——它们当时表现不够理想。

我的流水线类似于Chris的EfficientNet起步方案,主要区别如下:

  • 同时使用了梅尔频谱图和Q变换(QT)。我曾在3年前的g2net竞赛成功应用QT(参见 链接
  • 所有数据处理均在GPU上完成:使用torchaudio进行STFT和梅尔频谱图,修改nnAudio代码实现QT
  • 数据归一化至关重要,我调整对数变换参数使平均均值接近1,数值范围在-1到1之间
  • 直接使用16个导联差分信号,而非在4条线上平均频谱图
  • 每个导联生成32×250的小型频谱图或Q变换:频谱图使用32个梅尔频带和192的n_fft;Q变换使用5个八度音阶各32个频带
  • 将50秒频谱图堆叠为512×250图像,中间10秒同样处理,两者在频率维度拼接。同时加入Kaggle官方10分钟频谱图
  • fmax根据实验设为20Hz或25Hz,后者整体略优
  • 比赛全程使用tf-efficientnet-b0保证速度(单V100 GPU上每epoch不到1分钟),最后才尝试b1-b3等更大模型
  • 按eeg_id聚合目标值(同Chris的方案)
  • 训练时随机采样Kaggle 10分钟频谱图的偏移量,效果显著
  • 尝试过从EEG非中间段采样,但差异不大,最终保持简单方案
  • 采用伪标签(又称师生学习):先用10+票数据训练模型,预测低票数据作为额外训练集。虽然CV分数偏乐观,但LB持续改进
  • 我认为低票数据的问题主要在于投票分布而非票数本身。例如:癫痫发作在低票数据中占30%,而高票数据仅几个百分点。因此按目标值采样伪标签数据以保持分布一致

虽然有很多想法来不及尝试,但整体进展顺利——我的LB分数每次提交都有提升。公开榜、私有榜分数与10票CV之间的相关性很好,我无需选择提交版本:最佳公开榜即最佳私有榜和最佳CV。

现在我要休息一下,好好研究那些本该在一个月前提早使用的1D模型!祝各位Kaggler玩得开心!

同比赛其他方案