665. CMI - Detect Behavior with Sensor Data | cmi-detect-behavior-with-sensor-data
首先,恭喜所有获奖者,感谢组织者举办这场有趣的比赛,感谢社区——我们从你们的作品和分享中学到了很多。感谢我的队友 (Rib~) 出色的团队合作。
很明显,这场比赛涉及一些技巧,我们的解决方案主要集中在以下两点。
1. 找出如何利用同一主体 (subject) 的其他序列信息。 为了便于后续描述,我们将此模型称为基于主体 (subject-based) 的模型。我们将同一主体的数据分组到一个 batch 中,使用 CNN、RNN 或 Transformer 提取序列信息,然后沿主体维度添加一个 Transformer 层以捕获序列间关系。在离线验证和在线推理期间,你需要在预测当前序列之前积累每个主体的历史序列信息。
由于评估 API 以单序列 batch 的形式提供数据,而不是同一主体的所有序列,并且此外每次提交都会打乱序列的顺序,这种方法导致了一些不稳定性。我们通过以下方式解决此问题:
2. 我们准备了 4 种类型的模型:
| 模型 | 训练方法 |
|---|---|
| imu-only_subject | 仅使用 IMU 特征,基于主体训练 |
| imu-only_sequence | 仅使用 IMU 特征,基于序列训练 |
| all_subject | 使用所有特征,基于主体训练 |
| all_sequence | 使用所有特征,基于序列训练 |
我们采用以下策略进行模型选择和集成:
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