返回列表

10th Place Solution

586. Child Mind Institute - Detect Sleep States | child-mind-institute-detect-sleep-states

开始: 2023-09-05 结束: 2023-12-05 健康管理与公共卫生 数据算法赛

第10名解决方案

作者:ohkawa3(Kaggle Grandmaster)

发布日期:2023年12月7日

排名:第10名

首先,我要向所有参与者和组织者表示感谢。这是一场非常艰苦的比赛,因为我在公开排行榜上的得分并不高,但我对最终的结果感到满意。

特征工程

  • enmo
    • 直接使用原始数据
  • anglez
    • 使用 anglez.diff().abs()
  • 时间编码
    • 将小时归一化到 t=[0,1) 范围内,并使用 sin(2πt)cos(2πt) 作为特征
    • 尝试了更细粒度的周期性编码(如 sin(4πt)sin(8πt)cos(4πt)cos(8πt)),但效果变差
    • 考虑过周和月等特征,但因性能下降而放弃
  • 重复数据
    • 识别同一序列中相同时间戳的重复传感器数据
    • 有重复的时间点标记为1,否则为0
  • 步数标记
    • 设置从测量开始1小时内和8小时内的标记
    • 因为数据中包含入睡发生在1小时内或醒来发生在8小时内的情况(这些情况实际不存在)

模型

采用如图所示的1D-UNet GRU模型。除enmo和anglez外的特征在GRU层之前加入。使用二元交叉熵损失进行训练。

模型结构图

目标设计

使用基于高斯分布的热图。为了训练稳定性和在较大容差下提升AP(平均精度),采用大sigma的高斯分布是有利的。相反,小sigma的高斯分布会导致训练不稳定,但在小容差下能提升AP。作为折中方案,使用了大sigma和小sigma高斯分布的加权和。

目标热图示意图
gauss_small_sigma_minute = 2.5
gauss_large_sigma_size = 10
gauss_mix_ratio = 8
gauss_small_sigma_size = minute2step(gauss_small_sigma_minute)
gauss_large_sigma_size = minute2step(gauss_large_sigma_minute)

gauss_large = np.exp(-((x - gauss_center)**2) / (2 * (gauss_large_sigma_size)**2))
gauss_small = np.exp(-((x - gauss_center)**2) / (2 * (gauss_small_sigma_size)**2))

gauss = (gauss_large + gauss_mix_ratio * gauss_small)
gauss /= gauss.max()

训练

  • 随机采样12小时数据
  • 150个训练周期,使用AdamW优化器
  • 在第50个周期后应用SWA(随机权重平均)

推理

  • 与训练不同,推理时一次性处理整个序列

集成

整个测试数据集的处理时间(包括数据加载、预处理和后处理)约为18分钟,其中模型推理耗时45秒。

由于公开排行榜分数基于25%的测试数据计算,存在一定波动性,因此决定使用大量模型进行集成学习。最终集成包含120个模型,总处理时间在120分钟内完成。

后处理

在一晚睡眠中检测多个候选点至关重要:

  • 使用宽度为11的窗口平滑输出值
  • 检测所有大于0.01阈值的局部极大值点作为候选点
  • 对剩余时间戳按输出值降序处理:
    • 如果该时间戳与已检测到的任意时间戳相差超过21分钟,则将0.1与输出值的乘积作为候选点
同比赛其他方案