返回列表

9th Place Gold (TCN+GBDT Ensemble)

680. MABe Challenge - Social Action Recognition in Mice | MABe-mouse-behavior-detection

开始: 2025-09-18 结束: 2025-12-15 智慧养殖 数据算法赛
第九名金牌方案 (TCN+GBDT 集成)

第九名金牌方案 (TCN+GBDT 集成)

作者: Pavel (EXPERT)
发布日期: 2025-12-16
竞赛排名: 第 9 名

非常感谢组织者举办这场有趣且富有洞察力的比赛 —— 我非常享受这个过程!

很高兴看到使用适度的计算资源也能取得好的结果。

太长不看版 (TL;DR)

通过 GBDT 模型 (XGBoost / LightGBM / CatBoost) 和 TCN 模型的加权集成进行逐帧分类。两者均基于窗口化时间特征进行训练。

丰富的特征工程 + 数据增强 (仅 TCN) + 贪心爬山法集成。

源代码:https://github.com/PavelSavchenkov/kaggle-gold-9th-place-mabe

高层概述

最初的计划是按以下顺序实施:

  1. GBDT 基线
  2. TCN
  3. Conv + Transformer

我的假设是,给定足够质量的数据,每个后续模型都会比前一个更好。在实践中,仅 GBDT 和仅 TCN 的管道表现相似,最大的增益来自集成。

我没有设法用 Transformer 击败我的 TCN 基线(最终也没有集成 Transformer 模型 —— 现在我认为这可能会有帮助)。

训练机制

我将任务建模为使用目标帧中心固定窗口的特征进行逐帧分类。

对于每种方法,训练循环大致如下:

  1. 在一个折 (fold) 上进行粗略的超参数 + 特征迭代
  2. 通过 PR-AUC (即 mAP) 选择最佳检查点
  3. 在 5 个折上训练有希望的配置
  4. 使用 嵌套 F1 选择模型:
    • 对于每个折:选择一个在其他折上最大化 F1 的阈值
    • 在保留折上评估 F1
    • 跨折平均

折数划分 (Fold Split)

这有点棘手,因为:

  • 视频中的所有帧应保持在同一个折中
  • 每个视频可能包含多个动作的多个正/负样本片段

我为每个视频分配了折数,优化了每个 (动作,实验室) Across folds 的 正样本片段时长 均匀分布。

GBDT

第一个目标是构建一个超越公共 Notebook 分数的 XGBoost 基线。

特征工程的一个中心思想是 将坐标归一化到 Agent 的身体帧

  • 缩放使得 Agent 身体具有固定长度
  • 将 Agent 身体垂直对齐
  • 将此变换应用于给定窗口中的所有内容

特征族 (查看此处所有 GBDT 配置文件):

  • 归一化关键点 (Agent + 目标)
  • 速度 (多个过去和未来的时间滞后)
  • 加速度
  • 曲率
  • 成对距离
  • 地标间速度的点积/叉积
  • segment 之间的角度
  • 等等

开始时我重复了几次:训练几个模型,检查特征重要性,调整特征集,回去训练。

每个动作有一个单独的模型。数据被下采样到每次训练运行约 100 万帧。还调整了特定实验室的权重 (一次最多一个) 和所有正样本的权重。

第一个非零 XGBoost 提交:公开榜 0.474 (当时第 10 名,哇!)。

然后我以类似的方式训练了 LightGBM 和 CatBoost 模型。最佳“全局最佳每 (动作,实验室)"GBDT:公开榜 0.507。集成所有 GBDT 仅带来了 modest 的提升:升至 公开榜 0.511

出乎意料的是,水平翻转没有帮助。此时,距离比赛结束只剩几周,所以我转向了 TCN。

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]

影响最大的是 (实现):

  • 水平翻转。最大且最简单的提升:PR-AUC 约 0.02
  • 丢弃整个地标组
  • 加宽/变窄 mice 身体宽度
  • 空间裁剪 (Spatial cutout)

没有帮助的:

  • 时间拉伸增强
  • AWP
  • Focal loss, 排名损失
  • 真实标签片段的小随机偏移
  • 坐标抖动
  • conv+transformer (灵感来自 第 1 名 Isolated Sign Language [2]

最佳仅 TCN (无集成):公开榜 0.509。集成改进了仅 TCN 公开榜至 0.521

集成学习 (Ensembling)

我使用了贪心爬山法 (灵感来自 Chris Deotte 的 这篇 writeup [3])。其他功能包括:不同的目标 (F1, 嵌套 F1, log-loss 等), 束搜索 (beam search), logit 与概率空间。实现

最好的方法结果是仅仅最大化嵌套 F1 并允许尽可能多的模型。在最佳解决方案中,每个 (动作,实验室) 最多使用了 12 个模型。

结合 GBDT 和 TCN 模型是解决方案的关键部分,将 公开榜提升至 0.540

后处理与推理

使用小的时间核平滑预测将分数提高了约 0.001–0.003。

我将平滑实现为“步长推理”(最佳:stride = 7),这也显著加快了推理速度:

  1. 选择一个检查点 (每个 (动作,实验室) 最多 12 个)。
  2. 选择一个 base from {0, 1, ..., stride-1}
  3. 在帧上运行推理:base, base + stride, base + 2·stride, ...
  4. 通过 线性插值 填充缺失帧的概率
  5. 对于下一个检查点,旋转偏移量:base = (base + 1) % stride

另一件将分数提高约 0.002–0.004 的事情是配对动作阈值,旨在当 >1 个动作大于其阈值时改进动作选择:

  1. 对于帧上每对动作,当它们都大于阈值时,收集所有 (p1, p2) + 哪个动作实际上是正确的
  2. 移除出现次数
  3. 在 p1-p2 上拟合阈值,最大化这些动作的平均 F1
  4. 在推理时,对于 >1 个动作被实现的情况,通过锦标赛选择最佳 (即赢得最多配对的那个)

没有帮助的:

  • 概率校准
  • TTA (水平翻转)

结果

方案 (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 方式检查了集成参数:

  1. 遍历验证折 (0..4)
  2. 在剩余 (=训练) 折上拟合集成,在那里最大化嵌套 F1
  3. 在训练折上拟合最佳 F1 阈值
  4. 将集成和阈值应用于验证折
  5. 平均验证折上的 F1 分数

这是一个更诚实的评估。特别是,6 模型集成在公开榜上最佳,但交叉验证显示模型越多 = 分数越高,这在私有榜上被证实是正确的。

集成交叉验证

备注

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

同比赛其他方案