我在比赛结束前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玩得开心!