586. Child Mind Institute - Detect Sleep States | child-mind-institute-detect-sleep-states
非常感谢竞赛主办方和Kaggle举办这场有趣的竞赛!
我将数据按天分割,每天前后各填充60分钟。天数按500分钟为间隔偏移(使每天从15:40开始和结束)。这样做是为了避免在一天的开始或结束附近出现入睡/觉醒事件,我假设这对模型有益(因为双向填充有限)。我舍弃了8个主要由NaN值填充的序列ID,并手动选择了一些序列的前n天作为截断点(当序列末尾没有事件但仍有规律活动时移除末尾部分)。由于事件只发生在整分钟时刻,我为每一分钟的数据构建了特征,生成大小为(1440, n_feats)的数组。特征主要包括:anglez、enmo、anglez*enmo、hdcza,并选择性地与min、max、mean、std聚合方式配对生成10个特征,其中hdcza灵感来自这个讨论帖:https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/453267
由于@ymatioun的重要发现:事件在15分钟周期的不同步骤中具有不同频率,因此增加了额外特征:(step // 12) % 15。
由于数据中存在大量重复片段,我使用了基于哈希和哈希映射的算法来识别这类模式:
该特征极其有效,因为数据中存在大量非显性的重复模式。以下是enmo(蓝色)、清醒状态(红色)以及这个新特征(黑色,表示数据是否在序列其他位置出现)的示意图:
如图所示,数据中许多部分都是从其他位置复制粘贴而来。虽然某些模型可能从信号中明显的截断处学习到这一点,但这种显式特征效果更好。该特征的关键意义在于:当特征值为1时,患者几乎总是处于睡眠状态(>99%)。虽然我没有深入测试对分数的影响,但本地CV表明它提升了约0.015分。由于重复数据本身可能无效,我将这些位置的所有anglez和enmo值置空以防止过拟合。
我使用了4种模型架构,它们都非常相似,主要基于双向LSTM层,并采用6折交叉验证。
主模型采用UNet LSTM/Transformer架构,全连接层维度为1200,LSTM/Transformer维度为300。与典型UNet实现不同,我在跳连接中直接相加层而非拼接。
这是最佳单模型使用的管道,其他3种架构非常相似(仅层数和维度不同),其中1种架构不使用UNet。
模型流程:1天数据(1分钟间隔,双向60分钟填充)形状:(batch_size, 1440 + 60*2, n_feats) → 全连接层 → BiLSTM → 最大池化(池大小15)→ 2层LSTM → 最大池化(池大小2)→ Transformer块 → 上采样(因子2)→ 跳连接 → 2层LSTM → 上采样(因子15)→ 跳连接 → LSTM层 → 全连接层 → 输出层
跳连接表示将下采样阶段同级的输出加到上采样阶段的当前序列上。
minute-mod-15特征用于计算嵌入,在UNet前后都添加到序列中。大部分时间使用mish激活函数。
其他变体包括:省略UNet、改变维度、增加层数。某些变体包含子LSTM层,在一天的180分钟区间上应用LSTM(区间重叠120分钟)。
模型预测当前步骤0、1、3、5、7分钟内是否发生入睡或觉醒事件。使用加权BCE损失,不同分钟阈值的权重为1/(threshold+1)。最终预测是各阈值概率的总和,因此模型对入睡和觉醒各有10个输出(共10个输出/步)。
模型输出维度为(minutes_in_series, 10),以下是提取预测的步骤:
感谢@maruichi01指出这点!相关讨论:https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/446919#2487136
使用AdamW优化器,权重衰减1e-7,学习率1e-3指数衰减。为提升训练稳定性,梯度裁剪至1e-2。使用常规dropout和随机屏蔽15分钟片段的dropout(概率15-25%)。在4个种子上训练,每折选择每种架构的最佳种子。最后用全部数据重训练最佳2种架构。
正如Chris在文章中提到的,发现每个事件可生成大量预测也非常重要。我最初使用解码器模型,用前序预测通过概率分布生成后续事件。这仅在最大预测被计入时有效,但在发现每个事件可生成大量预测而惩罚很小后,我放弃了这个想法。本地CV分数约0.833。
如前所述,我最初尝试用解码器模型预测下一个变化事件,但由于多预测策略更有效而效果不佳。还尝试用LGBM堆叠模型,但提升很小,为减少复杂性而放弃。因预测排序重要,尝试过皮尔逊相关损失等,但效果不佳。
希望我涵盖了主要内容。很高兴能第二次获得个人金牌,成为Kaggle Master 😃
编辑:
Git仓库链接:https://gitlab.com/fritz_cremer/cmidss_final