680. MABe Challenge - Social Action Recognition in Mice | MABe-mouse-behavior-detection
非常感谢组织者举办这场有趣且富有洞察力的比赛 —— 我非常享受这个过程!
很高兴看到使用适度的计算资源也能取得好的结果。
通过 GBDT 模型 (XGBoost / LightGBM / CatBoost) 和 TCN 模型的加权集成进行逐帧分类。两者均基于窗口化时间特征进行训练。
丰富的特征工程 + 数据增强 (仅 TCN) + 贪心爬山法集成。
源代码:https://github.com/PavelSavchenkov/kaggle-gold-9th-place-mabe
最初的计划是按以下顺序实施:
我的假设是,给定足够质量的数据,每个后续模型都会比前一个更好。在实践中,仅 GBDT 和仅 TCN 的管道表现相似,最大的增益来自集成。
我没有设法用 Transformer 击败我的 TCN 基线(最终也没有集成 Transformer 模型 —— 现在我认为这可能会有帮助)。
我将任务建模为使用目标帧中心固定窗口的特征进行逐帧分类。
对于每种方法,训练循环大致如下:
这有点棘手,因为:
我为每个视频分配了折数,优化了每个 (动作,实验室) Across folds 的 正样本片段时长 均匀分布。
第一个目标是构建一个超越公共 Notebook 分数的 XGBoost 基线。
特征工程的一个中心思想是 将坐标归一化到 Agent 的身体帧:
特征族 (查看此处所有 GBDT 配置文件):
开始时我重复了几次:训练几个模型,检查特征重要性,调整特征集,回去训练。
每个动作有一个单独的模型。数据被下采样到每次训练运行约 100 万帧。还调整了特定实验室的权重 (一次最多一个) 和所有正样本的权重。
第一个非零 XGBoost 提交:公开榜 0.474 (当时第 10 名,哇!)。
然后我以类似的方式训练了 LightGBM 和 CatBoost 模型。最佳“全局最佳每 (动作,实验室)"GBDT:公开榜 0.507。集成所有 GBDT 仅带来了 modest 的提升:升至 公开榜 0.511。
出乎意料的是,水平翻转没有帮助。此时,距离比赛结束只剩几周,所以我转向了 TCN。
在我的解决方案中,它是几个堆叠的 1D Conv 块,具有增加的膨胀率 (例如 4 个时间块,膨胀率 [1, 2, 4, 8])。一个样本是一个 [T, F] 张量,其中 T 是来自固定窗口的时间步长,F 是特征数量。一个模型预测所有动作和所有实验室的概率分布。实现。
特征集与 GBDT 性质相似,但考虑到现在我们明确拥有目标帧周围每个 T 时间步的地标。我使用了 2s-4s 长度的窗口,T 约为 30-45。每个可访问的分类信息都被映射到可学习嵌入中。
与 GBDT 相比,管理特征处理更方便 —— 可以完全在 GPU 上完成,因此数据加载器基本上只需为每个样本提供几个整数 (视频 id, agent, 目标,帧)。实现。
我训练了数十个模型在一个折上最大化总 F1,然后为每个动作选择最佳模型,在 5 个折上训练它们。
数据增强非常重要。大多数灵感来自 ASL Fingerspelling 第 1 名解决方案 [1]
影响最大的是 (实现):
没有帮助的:
最佳仅 TCN (无集成):公开榜 0.509。集成改进了仅 TCN 公开榜至 0.521。
我使用了贪心爬山法 (灵感来自 Chris Deotte 的 这篇 writeup [3])。其他功能包括:不同的目标 (F1, 嵌套 F1, log-loss 等), 束搜索 (beam search), logit 与概率空间。实现
最好的方法结果是仅仅最大化嵌套 F1 并允许尽可能多的模型。在最佳解决方案中,每个 (动作,实验室) 最多使用了 12 个模型。
结合 GBDT 和 TCN 模型是解决方案的关键部分,将 公开榜提升至 0.540。
使用小的时间核平滑预测将分数提高了约 0.001–0.003。
我将平滑实现为“步长推理”(最佳:stride = 7),这也显著加快了推理速度:
base from {0, 1, ..., stride-1}。base, base + stride, base + 2·stride, ...base = (base + 1) % stride。另一件将分数提高约 0.002–0.004 的事情是配对动作阈值,旨在当 >1 个动作大于其阈值时改进动作选择:
没有帮助的:
| 方案 (Pipeline) | CV | 公开榜 | 私有榜 |
|---|---|---|---|
| xgboost, 每动作 | - | 0.474 | 0.458 |
| xgboost, 每动作,每实验室 | 0.497 | 0.501 | 0.482 |
| xgboost, lgbm, catboost, 每动作,每实验室 | 0.506 | 0.507 | 0.486 |
| 集成 (xgboost, lgbm, catboost, 最多 3 个模型) | 0.524* | 0.511 | 0.492 |
| TCN, 每动作,每实验室 | 0.518 | 0.509 | 0.478 |
| 集成 (TCN, 最多 6 个模型) | 0.540* | 0.515 | 0.489 |
| 同上,但替换为 100% 数据上的模型 | - | 0.521 | 0.490 |
| 集成 (GBDT, TCN, 最多 6 个模型) | 0.556* | 0.540 | 0.514 |
| 集成 (GBDT, TCN, 最多 12 个模型) | 0.558* | 0.539 | 0.515 |
| 同上 + 配对阈值锦标赛 | 0.560* | 0.538 | 0.516 |
* 集成 CV 分数被严重高估,因为它是巨大集成空间的直接优化目标
我以 OOF 方式检查了集成参数:
这是一个更诚实的评估。特别是,6 模型集成在公开榜上最佳,但交叉验证显示模型越多 = 分数越高,这在私有榜上被证实是正确的。

我没有使用任何无标签数据,并且直到最后几天才注意到 25 fps Adaptable Snail 数据的问题,所以无法有意义地 Incorporate 这个知识 :(