返回列表

5th place solution

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

开始: 2025-05-30 结束: 2025-09-02 健康管理与公共卫生 数据算法赛
第 5 名解决方案
标题:第 5 名解决方案
作者:Ethan (队友:Rib~)
发布时间:2025-09-03
竞赛排名:第 5 名

首先,恭喜所有获奖者,感谢组织者举办这场有趣的比赛,感谢社区——我们从你们的作品和分享中学到了很多。感谢我的队友 (Rib~) 出色的团队合作。

技巧

很明显,这场比赛涉及一些技巧,我们的解决方案主要集中在以下两点。

1. 找出如何利用同一主体 (subject) 的其他序列信息。 为了便于后续描述,我们将此模型称为基于主体 (subject-based) 的模型。我们将同一主体的数据分组到一个 batch 中,使用 CNN、RNN 或 Transformer 提取序列信息,然后沿主体维度添加一个 Transformer 层以捕获序列间关系。在离线验证和在线推理期间,你需要在预测当前序列之前积累每个主体的历史序列信息。

模型架构图

由于评估 API 以单序列 batch 的形式提供数据,而不是同一主体的所有序列,并且此外每次提交都会打乱序列的顺序,这种方法导致了一些不稳定性。我们通过以下方式解决此问题:

  • 在训练过程中,同一主体的序列以不同的比例 (0.5~0.8) 进行采样,并且此过程重复多次。
  • 我们观察到,当历史数据不足时,此解决方案的有效性有限。因此,我们仍然需要基于序列的模型来在历史数据不足的情况下修正预测,这是我们技巧的第二部分。

2. 我们准备了 4 种类型的模型:

模型 训练方法
imu-only_subject 仅使用 IMU 特征,基于主体训练
imu-only_sequence 仅使用 IMU 特征,基于序列训练
all_subject 使用所有特征,基于主体训练
all_sequence 使用所有特征,基于序列训练

我们采用以下策略进行模型选择和集成:

  • 当缺失值比例超过 50% 时,选择 imu-only 模型。否则,选择 all 模型。
  • imu-only 模型可以进一步增强 all 模型的性能。因此,我们对两者应用加权融合。
  • 当历史数据不足时,使用基于序列的模型进行集成,其权重根据积累记录的数量进行调整。
df_test = df_hist[subject]
n_hist = len(df_hist[subject])
w_imu_tf = min(n_hist,15)/15
w_all_tf = min(n_hist,30)/30
n_samples = sequence.shape[0]
if sequence['thm_1'].null_count()/n_samples>=0.5:
     subject_predictions = inference(imu-only_subject_model) 
     sequence_predictions = inference(imu-only_sequence_model)
     predictions = w_imu_tf*subject_predictions + (1-w_imu_tf)*sequence_predictions 
else:
     imu_predictions = inference(imu-only_subject_model)
     all_subject_predictions = inference(all_subject_model)
     all_sequence_predictions = inference(all_sequence_model)
     predictions = w_all_tf*all_subject_predictions + (1-w_all_tf)*all_sequence_predictions
     predictions = predictions*0.8+imu_predictions*0.2

其他

  1. 特征与数据增强: 我们主要使用公开代码中的特征和增强方法,再次感谢那些贡献者。
  2. 验证: 与公开方案略有不同,我们仅按主体分割。5 折交叉验证 (5folds cv):imu-only: 0.855, all: 0.898。
  3. 与基于序列的模型相比,基于主体的模型性能提高了约 0.02,而我们两个独立解决方案的集成(平均)进一步将性能提高了约 0.01。
  4. 与顶级团队相比,我们的基于序列的模型可能相对较弱,这可能是性能差距的原因之一。
  5. 由于我之前提到的特殊 API 机制,我们的方法结果每次提交都会有波动。因此,我们在三天前 finalized 了我们的解决方案,并利用最后 15 次提交机会反复评估并选择了其中的 2 个。
同比赛其他方案