第 7 名解决方案
第 7 名解决方案
首先,我要感谢组织者举办了如此有趣的竞赛。有许多不同的建模选项可供探索,我通过反复试验学到了很多。
我的方法使用了 2D CNN,灵感来源于我之前参加过的 HMS 竞赛中的一个顶级解决方案。
概述
- 2D CNN 方法:我将时间序列数据转换为图像,并使用 EfficientNet 或 ConvNeXt 进行处理。
- 分层多任务学习:模型有一个主要的 9 类分类任务和三个辅助任务(详细的 18 类分类、方向和行为)。
behavior(行为)是从骨干网络的中间特征图中作为时间序列预测出来的。该预测随后被用作主要任务和其他辅助分类任务的附加特征。
- 指数移动平均 (EMA):用于更稳定的训练。
- 数据增强:我使用了各种增强方法,包括特定于时间序列的增强(如时间扭曲 Time Warping)以及仅在同一方向样本之间应用的 Mixup。
- 后处理:应用了最后一步,以确保测试集中的每个受试者被分配了相等数量的类别。
预处理
IMU 数据 (12 维 → 41 维)
- 基础特征:acc (3), rot (4), thm (5)。
- 工程特征:
- 去除重力后的线性加速度(使用四元数计算)。
- 角速度和角距离。
- 加加速度(加速度的导数)及其 magnitude。
- 频域特征(0-1Hz, 1-5Hz, 和 5-10Hz 频段的功率)。
- 方向变化检测(使用连续帧之间的余弦相似度)。
- 通过反转特定轴针对惯用手进行了校正。
- 使用
StandardScaler 对所有特征进行了归一化。
TOF 数据 (320 维)
- 数据结构为
(seq_len, 5*64=320)。
- 针对传感器旋转和左右差异进行了校正。
- 我发现排列 TOF 传感器数据以匹配其物理邻近性可以提高准确率。最佳顺序为:
- TOF2 → TOF1 → TOF3 → TOF5 → TOF4
数据转换
- 裁剪 (Crop):取每个序列的最后 140 步。
- 重采样 (Resample):将 140 步重采样为 512 步。
- 调整大小 (Resize):将 resulting
(512 步,361 通道) 数据视为图像,并使用 cv2.resize 调整大小为 (512, 1024)。
模型
架构
- 仅 IMU:ConvNeXt-base(在 ImageNet 上预训练)。
- IMU+THM+TOF:EfficientNet-B5(在 ImageNet 上预训练)。
- 使用骨干网络阶段 -1, -2, 和 -3 的多尺度特征提取。
- 模型具有多头输出:
- 主分类头 (Main Cls Head) (9 类)
- 辅助分类头 (Auxiliary Cls Head) (18 类)
- 方向头 (Orientation Head) (4 类)
- 行为头 (Behavior Head) (4 类 x 64 步,时间序列)
- 行为预测是从中间特征图生成的 64 步时间序列。每一步的 4 类概率值被添加为特征,用于主要任务和其他辅助任务。
其他
数据增强
- 时间序列增强:时间扭曲 (Time Warping), 幅度扭曲 (Magnitude Warping), 抖动 (Jittering), 缩放 (Scaling), 和 窗口切片 (Window Slicing)。
- Mixup:仅应用于共享相同方向的样本之间。
- 旋转数据 Dropout:以 20% 的概率随机将四元数特征设置为零。
- 训练期间的可变长度裁剪:使用较短序列(70-200 步)和较长序列(120-700 步)来处理可变性。
训练配置
- 优化器:AdamW (
lr=1e-3, weight_decay=1e-4)
- 批次大小:32
- 调度器:余弦退火 (Cosine Annealing),带有 150 步预热。
- EMA:decay=0.99。
后处理
- 我应用了一个后处理步骤,以均衡测试集中每个受试者的预测类别数量。
- 我没有时间实现一个更复杂的版本,该版本还会考虑
(subject, orientation)。
- 此后处理带来的分数提升为 +0.004 CV, +0.01 公共榜, 和 +0.005 私有榜。
|
CV |
公共榜 |
私有榜 |
| 无后处理 (集成) |
0.884 |
0.872 |
0.864 |
| 有后处理 (集成) |
0.888 |
0.882 |
0.869 |
- CV 分数计算排除了
SUBJ_045235 和 SUBJ_019262。