返回列表

2nd Place Solution

665. CMI - Detect Behavior with Sensor Data | cmi-detect-behavior-with-sensor-data

开始: 2025-05-30 结束: 2025-09-02 健康管理与公共卫生 数据算法赛
第二名解决方案
作者: daiwakun (Grandmaster)
竞赛排名: 第 2 名
发布时间: 2025-09-03

第二名解决方案

首先,感谢组织者和主持人举办了一场有趣的比赛,也感谢社区提供的 insightful 讨论和 Notebook。

概述

  • 如果你关注了榜单 (Leaderboard),你可能注意到了最后的分数跃升:我在截止日期前四天发现了一个数据集技巧,并通过后处理大幅提高了分数。
  • 没有后处理的情况下,我的模型得分为:公共榜 0.865 / 私有榜 0.858
  • 下面我将首先描述模型(数据处理、特征、架构、训练),然后介绍带来巨大差异的后处理步骤。

模型

缺失值处理

  • 当某些传感器缺失时,训练独立的模型能获得更好的准确率。
  • 根据 IMU 旋转数据是否缺失以及 THM/TOF 是否缺失,我训练了四种变体(旋转 存在/缺失 × THM 和 TOF 存在/缺失)。

特征工程

  • IMU
    • 加速度 acc(x/y/z)
    • 四元数 6D 表示(以避免不连续性)
    • 角速度 angular velocity(x/y/z)
    • 线性加速度 linear acceleration(x/y/z)
  • THM/TOF
    • 将 NaN 和 -1 填充为零。
    • 我没有使用 THM 数据。
  • 左撇子受试者
    • 乘以 −1:acc_x, linear_acc_x, 角速度 y 和 z,以及四元数 6D 表示的第 0 和第 4 分量。
    • 交换 tof_3 和 tof_5,并水平翻转 2D TOF 网格的左右方向。
  • 受试者特定校正
    • 在训练数据中,来自 SUBJ_019262 和 SUBJ_045235 的数据围绕 z 轴旋转了 180°。
    • 我将所有通道乘以 −1,除了 acc_z 和 linear_acc_z。
    • 我找不到可靠的 TOF 校正方法,因此将这些受试者的 TOF 设置为 NaN。

模型架构

  • 基于公开 Notebook:残差 SE-CNN 块 + 注意力机制模型 (Residual SE-CNN Block + Attention)。
  • 模态特定主干 (Modality-specific stems):
    • 为以下各项使用独立的 1D CNN 分支:acc, 四元数 6D, 角速度,linear_acc,以及每个 tof1~5;然后拼接。
  • TOF 处理:
    • 在 1D CNN 分支之前,我对每帧的 TOF 网格使用 2D CNN,随后进行均值池化以获得每步特征。
  • 阶段感知注意力 (Phase-aware Attention)
    • 普通的时间注意力可能会过度关注长阶段(例如通往目标的长过渡期)。
    • 我在每个时间步添加了一个辅助的 3 类阶段预测器:
    1. (放松并)移动手到目标位置
    2. 手在目标位置
    3. 执行手势
    • 我构建了三个注意力机制,每个阶段一个,并用相应的阶段概率加权每个注意力分数。这样可以提取特定于每个阶段的特征,而不是让长阶段占据主导地位。

预测目标

  • 我预测一个复合标签:(初始行为 ∈ {放松&移动 / 移动}, 方向,手势)。
  • 这个选择对于后处理步骤很重要。

Mixup 数据增强

  • 简单的线性 mixup,但与阶段对齐以避免混合行为:
    • 将每个序列分为上述三个阶段,仅在同一阶段内混合。
    • 特别是对于“移动到目标”,我对齐阶段的结束点,以便在混合前同步到达目标的动作。

训练细节

  • 优化器:Adam (lr=1e-3, wd=1e-4)
  • 调度器:余弦退火 (Cosine Annealing)
  • Batch size: 32
  • Epochs: 50
  • 折数 (Folds): 10
  • 最终模型:3 个变体的集成(1D CNN 的不同深度/层数)

在线伪标签 (Online Pseudo-Labeling)

  • 大约有 8k 训练序列和 3.5k 测试序列,伪标签有所帮助。
  • 提交 API 一次预测一个序列,所以我执行了测试时更新:每当积累一批大小的测试序列时,我就使用伪标签以小学习率 (5e-5) 微调一步。

后处理

来自 train.csv 的关键观察:

  • 有 4 个方向 × 18 个手势 = 72 个可能的 (方向,手势) 对,但实际上只出现了 51 个。
  • 对于每个受试者,数据集恰好包含这 51 对,每对记录有两种可能的初始行为(放松&移动 / 移动),总计每个受试者 51 × 2 = 102 个序列。
  • 基于此,我训练模型预测 102 个类别(上述描述的复合标签)。

最大化条件联合概率(带有不重复约束)

  • 对于每个受试者,我保留其所有序列的预测类别概率。
  • 当预测该受试者的第 N 个序列时,我不是独立地取第 N 项的 argmax,而是选择长度为 N 的类别序列,以最大化联合概率(对数概率之和),前提是“没有标签被使用两次”。
  • 因为标签是在每个受试者下联合分配的,且有不重复约束,早期的高置信度选择会锁定其标签;当后来的样本对某个已被占用的标签只有中等置信度时,会选择替代方案以产生更高的联合对数似然。
  • 在计算上,这是一个分配问题,可以使用负对数概率作为成本,通过高效算法(例如匈牙利算法)解决。

得分

方法 公共榜 私有榜
无伪标签 / 无后处理 0.862 0.854
有伪标签 / 无后处理 0.865 0.858
无伪标签 / 有后处理 0.891 0.875
有伪标签 / 有后处理 0.900 0.878
同比赛其他方案