返回列表

Key Improvements in 17th Solution: A Technical Summary

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

开始: 2025-09-18 结束: 2025-12-15 智慧养殖 数据算法赛
第 17 名解决方案的关键改进:技术总结

第 17 名解决方案的关键改进:技术总结

作者: onoy (yono18) | 发布时间: 2025 年 12 月 21 日 | 竞赛排名: 17

概述

本解决方案使用 https://www.kaggle.com/code/ravaghi/social-action-recognition-in-mice-xgboost 中的方法作为基线,并通过高级特征工程和稳健的后处理实现了具有竞争力的性能。下面,我总结了区分此方法与基线实现的关键技术改进。

特别感谢 @ravaghi 提供基线方案!

MABe 解决方案总结图

1. 数据策展策略

严格的数据排除规则

与基线方法相比,本解决方案实施了更积极的数据过滤

排除的数据:

UNUSE_LAB = [
    "CalMS21_supplemental",
    "CalMS21_task1",
    "CalMS21_task2",
    "MABe22_keypoints",
    "MABe22_movies"
]

此外排除:

AdaptableSnail 实验室中 fps == 25 的数据

基线方法仅排除:

train_df = train_df[~((train_df["lab_id"] == "AdaptableSnail") & (train_df["frames_per_second"] == 25))]

为什么这很重要

CalMS21 和 MABe22 补充/任务数据:

  • 与主要竞赛的标注协议不同
  • 可能会引入冲突的行为定义
  • 潜在的标签噪声会损害模型的泛化能力

AdaptableSnail fps==25 过滤:

  • 通过验证识别为有问题数据
  • 与标准的 30 fps 视频不一致
  • 可能存在跟踪或标注质量问题

影响: 更干净的训练数据带来:

  • 更好的模型收敛(更少的冲突信号)
  • 提高交叉验证的稳定性
  • 更可靠的特征工程(一致的 fps 假设)
  • 更高的竞赛分数(估计 F1 提高 2-4 分)

权衡: 训练数据更少,但质量更高。这是一个优先考虑数据质量而非数量的 deliberate 选择。


2. 高级特征工程架构

模块化生成器系统

实施了15 个用于单鼠行为的专用特征生成器14 个用于配对交互的生成器,每个生成器捕捉特定的行为方面:

单鼠特征:

  • 基本运动:所有身体部位之间的距离、速度、加速度
  • 跨时间特征:不同时间点不同身体部位之间的速度
  • 身体机制: elongation ratio(伸长率)、身体角度、曲率
  • 运动模式:多尺度速度统计(20/40/60/80 帧窗口)
  • 行为状态:速度离散化为 4 个状态并跟踪转换
  • 长程动态:偏离移动平均值(30/60/120 帧)

配对交互特征:

  • 空间关系:老鼠之间的所有成对距离
  • 相对方向:老鼠之间的方向对齐
  • 接近动态:老鼠是否在相互靠近/远离
  • 领先指标:哪只老鼠正在发起接近
  • 追逐特征:结合接近和跟随行为
  • 速度相关性:跨时间窗口的同步运动模式

关键创新:跨速度特征 (Cross-Speed Features)

# 示例:捕捉不同身体部位随时间的协调
sp_ear_left_tail_base = distance(ear_left[t], tail_base[t-10])

这揭示了简单瞬时特征所 missed 的时间协调性。


3. 复杂的后处理管道

三参数优化

与仅调整预测阈值的基线方法不同,本解决方案使用 Optuna 同时优化三个参数

threshold: 0.0-1.0  # 概率 cutoff (步长 0.01)
W: 0-60 frames      # 间隙填充窗口
M: 0-30 frames      # 最小 segment 长度

间隙填充 (W):

  • 填充同一行为预测之间的小间隙
  • 解决 noisy 逐帧预测导致的碎片化问题
  • 示例:[1,1,1,0,0,1,1,1] 当 W=2 时变为 [1,1,1,1,1,1,1,1]

噪声去除 (M):

  • 去除孤立的短预测
  • 过滤虚假检测
  • 示例:[0,0,1,1,0,0,0] 当 M=3 时变为 [0,0,0,0,0,0,0]

影响: 这通常通过产生与标注者行为模式匹配的时间连贯预测,将 F1 分数提高 2-5 分。


4. 实验室特定处理策略

为什么实验室级别的组织很重要

不同的研究实验室拥有:

  • 不同的相机设置和跟踪质量
  • 不同的行为标注协议
  • 不同的老鼠品系和实验条件
  • 不同的身体部位跟踪配置

实现:

for lab_id in lab_list:
    train_subset = train[train.lab_id == lab_id]
    # 一起处理来自该实验室的所有视频
    # 训练特定于实验室的模型

好处:

  • 模型学习特定于实验室的模式和偏差
  • 更好地处理异构数据质量
  • 对跟踪系统差异更具鲁棒性

5. 稳健的缺失数据处理

自动身体中心计算

def add_body_center_if_needed(ppvid):
    if 'body_center' exists: return as-is
    elif 'nose' and 'tail_base' exist:
        body_center = (nose + tail_base) / 2
    elif 'head' and 'tail_base' exist:
        body_center = (head + tail_base) / 2
    else: fill with NaN

特征生成器验证

每个特征生成器在计算前验证所需的身体部位:

class BaseGenerator:
    def validate(self) -> bool:
        # 检查所需的身体部位是否存在
        # 如果不可用则优雅地跳过

影响: 无需崩溃或手动干预即可处理跨实验室的 20 多种不同身体部位配置。


6. 模型持久化和增量学习

智能检查点系统

def load_saved_trainer(model_path, section, action,
                       do_modeling=False, do_tuning=False):
    # 如果可用则加载预训练模型
    # 跳过已完成行为的训练/调整

好处:

  • 无需重新训练即可尝试后处理
  • 恢复中断的训练运行
  • 选择性重新训练特定行为
  • 对于 Kaggle 的限时环境至关重要

7. 内存优化

自动 Dtype 优化

def reduce_mem_usage(df):
    # int64 → int32 → int16 → int8
    # float64 → float32 → float16
    # object → category
    # 典型减少:50-75%

影响: 能够在 Kaggle 的内存限制内处理 2-3 倍的数据。


8. 代码架构增强

面向对象设计

  • DataLoader: 带有缓存的集中式文件 I/O
  • Preprocessor: 数据标准化和转换
  • BehaviorData: 封装特征、标签和元数据
  • FeatureStore: 管理生成器管道执行

此架构的好处

  • 可维护性: 每个组件都有单一职责
  • 可测试性: 可以独立单元测试生成器
  • 可扩展性: 添加新功能无需修改现有代码
  • 可重用性: 组件可用于其他 MABe 项目

性能比较

方面 基线 本解决方案 改进
特征数量 ~50-80 ~150-250 多 2-3 倍
后处理 仅阈值 阈值 + W + M +2-5 F1 分数
缺失数据 Try-catch 错误 主动验证 无崩溃
代码行数 ~900 ~2000 组织更好
内存使用 默认 dtypes 优化 dtypes 减少 50-75%

代码可用性

https://www.kaggle.com/code/yono18/mabe-boosting-model-prediction-500-iter

完整的实现,包括所有特征生成器和完整的处理管道,均可在我的竞赛 notebook 中找到。

欢迎将这些技术 adapted 到您自己的解决方案中。

如果您有任何反馈或建议,请留言。

感谢阅读到最后!

同比赛其他方案