返回列表

29th Place Solution Handedness Augmentation Trick and Missing Values Insights

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

开始: 2025-05-30 结束: 2025-09-02 健康管理与公共卫生 数据算法赛
第 29 名解决方案:惯用手增强技巧与缺失值洞察

第 29 名解决方案:惯用手增强技巧与缺失值洞察

作者: Mohamed Eltayeb (mohammad2012191)

团队成员: @tahaalshatiri, @i2nfinit3y, @chronoscop

竞赛排名: 第 29 名

发布时间: 2025-09-04

感谢 Kaggle 和主办方举办这场有趣的竞赛。特别感谢我的队友 @tahaalshatiri@i2nfinit3y@chronoscop。没有他们,这是不可能完成的。

总结:

我们的解决方案是几个 1D-CNN 变体的加权集成,这些变体使用不同的设置(损失函数、数据增强等)进行训练。我们分别对仅 IMU、IMU+TOF+THM 以及带有缺失旋转数据的 IMU+TOF+THM 进行了建模。使用了标准和更高级的数据增强来提升性能。

@i2nfinit3y 的贡献:

基于公开 Notebook 开始:https://www.kaggle.com/code/myso1987/cmi3-pyroch-baseline-model-add-aug-folds
使用的特征:acc (x/y/z)、rot (x/y/z)、linear_acc (x/y/z)、angular_vel (x/y/z)、angular_distance、acc_mag、rot_mag、acc_jerk、rot_jerk、acc_pow、rot_pow、linear_acc_mag、linear_acc_mag_jeark、angular_vel_mag、angular_vel_mag_jerk、rot_angle、rot_angle_vel

  • 对于全特征模型,使用了 3 个卷积分支:acc、rot、thm+tof,然后将输入嵌入到 1D-CNN 骨干网络中。
  • 对于仅 IMU 模型,添加了一个 GRU 模块来预测漂移特征,然后将输出与其他嵌入连接并输入到 1D-CNN 骨干网络中。
  • 为 tof 分支添加了一个门控层,然后计算二元交叉熵损失(0 或 1)。
  • 使用了以下数据增强:
    Mixup & Cutmix (0.5 概率)
    抖动与缩放 (Jitter & Scale)
    THM+TOF 特征 Dropout
    在特征中添加漂移
    来自 Notebook 的时间拉伸和时间移位 (TimeStretch and TimeShift) --> 影响巨大 (链接)
  • 使用了交叉熵损失 + 三元组损失 (TripletLoss)(使用分类头之前的嵌入来挖掘困难样本)
  • EMA, SILU, 预热 (warmup)
    最佳单模型 (仅 IMU): 交叉验证 0.854, 排行榜 0.835
    最佳单模型 (全特征): 交叉验证 0.880, 排行榜 0.861

@chronoscop 的部分:

移除的受试者:'SUBJ_045235', 'SUBJ_019262'

  • IMU 特征:acc (x/y/z)、rot (x/y/z)、linear_acc (x/y/z)、angular_vel (x/y/z) 'linear_acc_x', 'linear_acc_y', 'linear_acc_z','angular_vel_x', 'angular_vel_y', 'angular_vel_z','angular_distance','acc_global_x','acc_global_y','acc_global_z','angvel_mag'
  • THM/TOF 部分:使用统计方法计算每个 TOF 传感器信号在一定时间段内的时域特征,包括均值、标准差、极值和分布形状(偏度、峰度)。
  • 对于全模型,我使用单独的卷积分支从 IMU (acc, rot) 和 TOF 提取特征,然后将它们融合到 1D-CNN 骨干网络中。CNN 输出被送入双向 LSTM 以建模时间动态,并应用注意力池化以获得用于分类 18 种手势的最终表示。
  • 使用 SGKF 10 折,AdamW,mixup 和随机掩码进行数据增强。使用预热 - 余弦学习率调度,EMA(从第 10 个 epoch 开始)和早停(patience=30),数据增强与 @i2nfinit3y 相同。
  • 主要任务分类损失使用带有标签平滑的交叉熵(通过软标签实现),辅以门控分支的二元交叉熵损失,权重为 0.2。
  • Augment_left_handed_sequence(如下所述)
    折外交叉验证 (OOF cv)            公共排行榜    私有排行榜
    0.8844 ± 0.002      0.853            0.848
    参考公开 Notebook
    https://www.kaggle.com/code/myso1987/cmi3-pyroch-baseline-model-add-aug-folds
    https://www.kaggle.com/code/hideyukizushi/cmi25-imu-thm-tof-tf-bilstm-gru-attention-lb-75

数据增强:

这部分主要由 @tahaalshatiri 贡献。

  • 注意到 acc_x 在左手上具有负号,这不应该发生,因为加速度是相对于设备方向定义的。
  • 发现这是由于传感器在右手上靠近小指放置,而在左手上靠近拇指放置,使得设置不对称。
  • acc_x 被翻转,并调整旋转特征,使双手具有相同的方向。
  • 校正后的旋转使用以下可视化 Notebook 进行了验证:
    https://www.kaggle.com/competitions/cmi-detect-behavior-with-sensor-data/discussion/583413
  • 额外的传感器也被翻转,以便两个读数大约指向脸上的相同位置。
  • 这种增强使得可以将所有左手数据改为右手,反之亦然。将其添加到队友的 Notebook 中为排行榜分数提供了约 0.004 的提升。
  • 我们还尝试将所有左手转换为右手并训练一个模型,然后将所有右手转换为左手并训练一个模型,然后创建测试数据集的左手和右手版本,然后相应地使用每个模型。这将单模型提升了约 0.004,但在集成中效果不佳。
  • 还观察到训练集中约 50 个序列和测试集中超过 30 个序列缺失旋转特征。
  • 虽然缺失值最初看起来微不足道,但针对这约 30 个序列训练一个没有任何旋转特征或衍生特征的模型带来了约 0.004 的性能提升。
  • 还发现有两个受试者将传感器上下颠倒佩戴。
  • 这些受试者从训练集中被移除,这也带来了可衡量的改进。
  • 一个被探索但未完全实现的想法(由于时间限制)是显式处理不同的传感器方向。
  • 数据集包含50 个手势 - 方向对,每个约有 160 个序列,表明分割是由组织者分层的,并且可能在测试集中镜像。
    手势方向对截图
  • 这些方向对显示出相同手势的分数差异很大。然而,这些信息在当前解决方案中未能充分利用。
  • 另一个我们想到但未尝试的想法是在这里的 3D 动画上训练视频分类模型:链接
  • 尝试了频谱图但没有效果。

@mohammad2012191 的贡献:

  • 统一了团队的交叉验证结果,准备了集成模型并修复了许多 bug。
  • 有一些数据增强想法,例如:在 seq 和 seq[::-1] 上训练,使用 2 个不同的分支和损失然后平均结果。这出乎意料地稳定并平滑了训练,尽管没有获得真正的收益。
  • 尝试了一些特殊的目标特征(我称之为最近邻目标),即挑选最相似样本的目标并将其用作当前样本的特征。还尝试了平均最近的 k 个目标。在这里没有效果。
  • 尝试使用方向头作为辅助目标,它提升了交叉验证分数但没有提升排行榜分数。
  • 在训练数据中添加随机缺失值的数据增强,以模拟测试中的缺失。
  • 将波的真实长度(填充/截断之前)作为特征添加到模型中(没有提升分数)。
  • 尝试了一些想法来分离阶段是过渡还是手势,并仅使用手势进行模型训练。结果发现这并不重要,有无性能相当。
  • 想过使用叠加绘制的原始波来建模问题。我认为这可能为集成提供一些真正的多样性 + 无需处理缺失值。找不到足够的时间来实现。
  • 尝试基于序列中的缺失百分比而不是全局权重,在仅 IMU 和 IMU+TOF+THM 之间使用集成权重。效果不好。

我们的最终解决方案是一个 3 分支解决方案:

  • 仅 IMU
  • IMU+TOF+THM
  • IMU+TOF+THM 且缺失旋转数据
    我们将所有样本转换为右手惯用手,并使用基于交叉验证的加权集成。我们的最终集成交叉验证为 0.895,排行榜为 0.879,私有排行榜为 0.849(这是我们第 3 高的私有分数。最高的私有分数是 0.851,那是相同的模型但使用了平均左右手检查点。结果证明它对未见数据泛化良好)。

现在,我们已在项目链接中包含了 @chronoscop@i2nfinit3y 的开源训练脚本。

同比赛其他方案