返回列表

9th place solution

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

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

第 9 名解决方案 - Child Mind Institute 竞赛

作者: Fnoa (trasibulo) | 排名: 第 9 名 | 发布时间: 2025-09-03

感谢 Kaggle 和 Child Mind Institute 举办这场迷人的竞赛!这是一次令人难以置信的学习经历,让我们能够使用多模态传感器数据进行行为分析。

解决方案概述

三种模型类型 利用不同的传感器模态:

  • 仅 IMU:惯性测量数据(原始特征 + engineered 特征)
  • 热成像 (THM) + IMU:热成像(原始 + 聚合 + 计算)+ 惯性融合
  • 飞行时间 (TOF) + IMU:飞行时间(仅聚合 + 计算,无原始数据)+ 惯性融合
解决方案架构图

基础模型架构

混合 CNN-RNN 多模态神经网络:(类似于公开版本)

  • 特征提取:残差 CNN 块 + SE 注意力机制 → 空间特征学习
  • 时序建模:双向 GRU + 注意力机制 → 复杂时序依赖
  • 多传感器融合:并行处理 IMU + 热成像 + ToF 传感器数据 → 分类
class Net(nn.Module):
    def __init__(self, cfg):
        # IMU 深度分支
        self.imu_block1 = ResidualSECNNBlock(self.imu_dim, 64, 3)
        self.imu_block2 = ResidualSECNNBlock(64, self.sequence_length, 5)
        
        # 双向 GRU
        self.bigru = nn.GRU(self.sequence_length, self.sequence_length, 
                           bidirectional=True, batch_first=True)
        
        # 注意力机制
        self.attention = AttentionLayer(self.sequence_length * 2)

关键改进

1. 用手习惯标准化 (Handedness Normalization)

  • 问题:左撇子与右撇子受试者.create 不一致的模式
  • 修复:坐标系翻转(-acc_x, -rot_y, -rot_z

2. 标准化策略

  • 无预处理标准化 → 让模型学习最佳缩放
  • 批归一化 (Batch Normalization) 贯穿整个网络 → 稳定训练

3. 目标修改

  • 我使用了手势 + 方向目标(总共 51 个目标)

4. 特征工程策略

  • TOF 数据:仅 engineered 特征(非原始数据)
  • THM 数据:原始 + engineered 特征
  • IMU 数据:原始 + engineered 特征(与公开 notebook 相同)

5. 数据增强

  • 时序序列的 Mixup 增强
  • 与公开 notebook 相同的增强方法

6. 模型集成

  • EMA(指数移动平均)用于稳定预测(我使用了 ema 0.8, ema 0.9 和正常数据进行集成)
  • 每个模型使用总变量的子集进行训练,以获得鲁棒性和多样性

7. 逆向目标验证策略

这是一个关键的创新,显著提高了后处理的有效性:

  • 正常模型:51 个目标,其中 50 个为 0,1 个为 1(标准分类)
  • 逆向模型:51 个目标,其中 50 个为 1,1 个为 0(逆向分类)

对于每种模型类型(仅 IMU、THM+IMU、TOF+IMU),我都训练了正常版本和逆向版本。

为什么有效:(虽然我不完全确定)

  • 互补模式学习:捕捉正面和负面的行为指标
  • 增强的不确定性表示:当两个模型一致时 → 高置信度,当它们不一致时 → 需要特定主体上下文的不确定性
  • 隐式正则化:迫使模型在两个方向上学习一致的表示
  • 更好地利用多类互斥性:如果某物不是 A 类、B 类、C 类... 它提供了关于它可能是什么的信息

关键转折:后处理管道

发现:在竞赛结束前 13 天,我意识到同一受试者过去的预测可以显著改善当前预测。

处理流程

输入序列 → 传感器检测 → 模型选择 → 正常 + 逆向预测 → 主体历史 → 最终输出

逐步过程:

  1. 传感器可用性检查
    可用传感器 → 模型选择
    仅 IMU        → IMU 模型 (正常 + 逆向)
    IMU + 热成像   → 热成像+IMU 模型 (正常 + 逆向)
    IMU + ToF     → ToF+IMU 模型 (正常 + 逆向)
  2. 双模型预测
    • 使用正常和逆向模型生成预测
    • 应用逆向目标验证结合两个输出
    • 正常和逆向预测的结合创造了更鲁棒的不确定性估计
  3. 感知主体的后处理
    当前预测 (正常 + 逆向) + 历史序列 (同一主体) → 增强预测
    • 利用主体内的时序一致性
    • 使用过去的预测来 inform 当前预测
    • 逆向模型在这里特别有效,因为它有助于根据历史记录识别“这个特定主体不会做什么”

结果影响

指标 无后处理 有后处理 提升
IMU CV 0.81 0.84 +0.03
ALL CV 0.84 0.89 +0.05
公共 LB 0.850 0.882 +0.032
私有 LB 0.841 0.868 +0.027

CV 结果基于 5 折中的 1 折,以提高时间效率

模型训练细节

  • 序列长度:主要为 140,最终集成多样性使用 160
  • 损失函数:多标签分类使用 BCEWithLogitsLoss
  • 优化器:AdamW 配合线性学习率调度
  • 正则化:Dropout 层 + L2 权重衰减
  • 最终集成:多个模型在完整数据集上训练以获得最大性能(包括正常和逆向版本)
  • 预处理变体:测试了不同的预处理管道以增强鲁棒性(未观察到增益)

经验教训

  • 后期发现 可以 dramatically 改变竞赛结果
  • 逆向建模方法 可以提供标准方法 missed 的互补信息
  • 运气因素:我相信我在发现如此有效的后处理方法方面有一些运气,尽管我仍然不完全确定为什么逆向目标方法 works 如此有效

感谢所有参与者带来的精彩竞赛和分享的见解!

同比赛其他方案