返回列表

13th Place Solution

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

开始: 2025-05-30 结束: 2025-09-02 健康管理与公共卫生 数据算法赛
第 13 名解决方案

第 13 名解决方案

作者: Muku (ryosukesaito)
排名: 第 13 名
发布日期: 2025-09-06

首先,我要向组织团队和工作人员致以诚挚的感谢,感谢你们策划了如此精彩的比赛。
我也要感谢所有分享了众多深刻见解的参赛者。


概述

由于评估指标不稳定且存在排行榜震荡的风险,而且单模型推理相当轻量,我的主要策略是开发多种模型,并通过爬山算法(Hill Climbing)将它们组合成一个 robust 的集成模型。

模型

  • 三分支模型 (IMU + ToF + THM)
    • 使用基于 Mamba 的架构学习每个传感器模态的长期时间依赖关系
    • 使用Transformer 编码器捕捉每个时间步的传感器交互
  • 单分支模型 (仅 IMU)
    • 基于SE-Transformer 架构,该架构在仅 IMU 序列上产生了更好的 accuracy。

特征工程与数据处理

  • 惯用手校正:翻转左撇子受试者的数据轴以标准化数据集。
  • 设备方向校正:校正了倒戴设备的受试者数据。
  • 处理缺失数据:为缺少旋转 (rot) 数据的序列生成了多种基于加速度的特征。

最终得分

  • CV (交叉验证): 0.9027 (完整模型) / 0.8537 (仅 IMU 模型)
  • LB (公共榜): 0.873
  • PB (私人榜): 0.861

1. 模型

从一开始,考虑到指标不稳定和单模型推理时间短,我就专注于创建多样化的模型集用于集成。当有 ToF/热成像数据可用时,我使用三分支模型;对于仅 IMU 的情况,则使用单分支模型。

1.1. 三分支模型 (Mamba + Transformer)

我开发这个模型的灵感来自最近的研究,这些研究展示了基于 Mamba 的架构在人类活动识别中的有效性。

双向 Mamba 块 (Bidirectional Mamba Block):

为了捕捉每个传感器 (IMU, ToF, 热成像) 的时间序列特征,我设计了三个独立的编码器分支。每个编码器由双向 Mamba 块组成。虽然许多论文只使状态空间模型 (SSM) 部分双向化,但我的实验表明,使整个 Mamba 块双向化能带来更好的性能。关于此 Mamba 块的消融实验显示 CV 得分提高了 +0.005。

用于传感器融合的 Transformer 编码器:

在每个分支中使用 Mamba 捕捉长期依赖关系后,Transformer 编码器对它们进行聚合。这关注的不是时间依赖关系,而是捕捉每个时间步的传感器间交互。
可以将其想象为来自 IMU、ToF 和热成像领域的专家讨论他们的初步发现以达成共识。关于此 Transformer 编码器的消融实验也显示 CV 得分提高了 +0.005。

BiMamba 架构图

1.2. 单分支模型 (SE-Transformer)

对于仅 IMU 数据,基于 SE-Transformer 块的模型优于基于 Mamba 的模型。该架构在 Transformer 编码器后应用 squeeze-and-excitation (SE) 块来学习通道间交互。消融实验表明 Transformer 编码器带来了 +0.01 的提升,SE 块带来了 +0.005 的提升。

SE-Transformer 架构图


2. 特征工程 / 数据处理

2.1. 特征工程

基本上,我使用了以下特征:

  • imu_cols: acc_x/y/z, linear_acc_x/y/z, angular_vel_x/y/z, angular_distance
  • tof_cols: 每个 ToF 传感器 (1-5) 的 mean, std, max, min, mean_delta, centroid_x/y
  • thm_cols: 每个热成像传感器 (1-5) 的原始值和 delta

然而,对于缺少 rot 数据的序列,使用 rot 相关特征(如 linear_acc, angular_vel)的结果会变差。
对于这些情况,我切换到了仅 acc 特征集。该集合包括加速度的 1 阶和 2 阶导数,以及模仿加速度向量叉积的旋转代理特征。
这些额外特征显著提高了缺少 rot 值序列的 accuracy。

  • d_acc_x/y/z (Jerk/加加速度)
  • d2_acc_x/y/z
  • rot_proxy_xy/yz/zx (例如 rot_proxy_xy -> acc_x * d_acc_y - acc_y * d_acc_x)

2.2. 数据处理

左撇子数据转换:

为了解决左撇子受试者数据稀缺的问题,我翻转了相关轴,将其视为右撇子数据。
这使得模型能够专注于手势本身,而不受惯用手的影响。

  • IMU: 翻转了 acc_x 相关特征和 angular_vel_y/z 的符号。
  • ToF/THM: 交换了传感器 3 和 5。
  • 此过程也应用于推理阶段。

倒置数据校正:

正如讨论中指出的,两名受试者 (SUBJ_019262, SUBJ_045235) 可能倒戴了设备。
我在训练中校正了他们的数据。

  • IMU: 翻转了与 x 和 y 轴相关的特征符号。
  • ToF/THM: 分别交换了传感器 2 和 4,以及传感器 3 和 5。

3. 训练

  • 折数 (Fold): StratifiedGroupKFold (n_splits=5)
  • 损失函数:Soft Macro F1 Loss + Hard Margin Loss
    • 引入 Hard Margin Loss 是为了推动难以区分样本(例如 "Eyelash" vs. "Eyebrow")的决策边界,这是混淆矩阵中的一个显著问题。
      混淆矩阵
  • 学习率:7.5e-4
  • Batch size: 64
  • 优化器:AdamW
  • 调度器:CosineAnnealingWarmRestarts
  • EMA (指数移动平均):
    • 通过使用 EMA(ModelEmaV3),训练更稳定且泛化能力更好。
    • decay: 0.9993
  • 困难样本挖掘 (Hard Mining):
    • 在训练的第 2 阶段,我增加了第 1 阶段模型识别出的难以分类样本的采样率。这带来了性能上的轻微提升。

4. 集成

我训练了大量多样的模型(使用不同的特征集、架构和随机种子)。
然后我使用爬山算法 (Hill Climbing) 找到最大化 CV 得分的模型组合及其权重。最终提交的是大约 20 个模型的集成。

  • 我认为爬山得分有过拟合的风险,所以不仅仅依赖 CV 得分,
    我还考虑了模型的多样性、权重的平衡以及 LB 得分。
    结果,这种平衡的选择成为了我最好的私人提交。

5. 后处理

在比赛的最后一天,我意识到顶尖竞争对手可能正在使用基于以下约束的技巧:每个手势在受试者的会话中出现的次数恰好有限……
由于时间有限无法进行彻底验证,我选择了一种更安全的方法:对于每个受试者,如果某个手势的预测计数超过 8 次,我将 logit 值最低的预测更改为 logit 值第二高的类别。
仅这个简单的后处理步骤就将我的 LB 得分提高了 +0.003。


6. 其他想法(未生效)

模态幻觉 (Modality Hallucination)

受几项研究的启发(例如 INERTIAL HALLUCINATIONS),我探索了一种仅使用 IMU 数据模仿 ToF/热成像数据中间表示的技术。
这带来了轻微的 CV 提升,但并不显著。

频谱图特征 (Spectrogram Features)

这种方法在 HMS 比赛的 EEG 数据中效果很好,但在这次比赛中表现不佳。
这可能是因为个体之间的运动节奏差异很大,或者因为原始波形值发挥了更重要的作用。

针对困难类别的 2 阶段模型

我尝试在第二阶段使用专用模型来分类易混淆的手势,但这种方法没有成功。

同比赛其他方案