返回列表

1st Place Solution

683. NFL Big Data Bowl 2026 - Prediction | nfl-big-data-bowl-2026-prediction

开始: 2025-09-25 结束: 2025-12-03 运动员表现 数据算法赛
1st Place Solution - NFL Big Data Bowl 2026
作者: ohkawa3 (Grandmaster)
发布日期: 2025-12-04
竞赛: NFL Big Data Bowl 2026 – Prediction

第一名解决方案

首先,我要感谢组织者举办了如此激动人心的比赛。
现在,我只能希望我的提交能通过最终的测试。

正如我在另一个讨论帖中提到的,我的模型仅使用"NFL Big Data Bowl 2026 – Prediction"竞赛中提供的数据进行训练。
要在如此有限的数据集上实现强大的性能,需要强大的数据增强、精心设计的损失函数以及有效的模型架构。


解决方案概述

1. 特征工程 (Feature Engineering)

1.1 动态特征 (Dynamic Features)

  • 使用传球前紧挨着的 20 帧 数据。
  • 为每一帧提取以下 10 维 特征:
    • x, y (坐标)
    • sin(o), cos(o) (朝向)
    • sin(dir) * s, cos(dir) * s (速度向量)
    • x - ball_land_x, y - ball_land_y (与球落点的相对位置)
    • x - receiver_x, y - receiver_y (与接球手的相对位置)

1.2 静态特征 (Static Features)

  • 总共 12 维
    • player_role 的 One-hot 编码 (4 维)
    • 预测帧数 (1 维)
    • 用作输入的传球前帧数 (1 维)
    • 传球手最后一帧的坐标 (2 维)
    • 球落点坐标 (2 维)
    • 球员最后一帧的坐标 (2 维)

1.3 目标变量 (Target)

  • 预测从最后一个输入帧开始的 位移 (Δx, Δy)
  • 最终的轨迹是通过将预测的位移加到最后的输入坐标上获得的。

2. 模型架构 (Model Architecture)

2.1 整体结构

  • 一个处理最多 22 名球员的 比赛级模型 (play-level model)
  • 球员维度经常被重塑/转置到批处理轴 (batch axis) 中。
Model Architecture Diagram

2.2 动态特征编码器 (Dynamic Feature Encoder)

  • 输入: (10, player, 20 frames)
  • 输出: (640, player, 1 frame)
  • Depthwise Conv1d (核大小 = 3) × 7 层
    • 每个特征 → 64 维 → 连接成 640 维
  • 无填充 (为了强调最后一帧)
  • 20 帧 → 5 帧 → 仅使用 最后一帧

2.3 静态特征编码器 (Static Feature Encoder)

  • 输入: (10, player)
  • 输出: (64, player)
  • Conv1d(kernel=1) → BatchNorm → SiLU

2.4 合并层 (Merge Layer)

  • 连接动态特征 (640) + 静态特征 (64)
  • 投影到 256 维 球员特征

2.5 球员间交互层 (Inter-player Interaction Layer)

  • 输入: (256, player)
  • 输出: (256, player)
  • Transformer Encoder × 3 层
  • 针对可变球员数量的球员掩码 (Player masks)
  • FFN 使用 SwiGLU

2.6 解码器 (Decoder)

  • 输入: (256, player)
  • 输出: (2, player, 48 frames) + 4 个辅助输出
  • 256 → 1536 → 重塑 → (32, 48 frames)
  • 应用多个 Conv1d (核大小 = 3)
  • 最终投影:32 → 2 (xy) + 4 (辅助项)

3. 训练设置 (Training Setup)

3.1 交叉验证 (Cross Validation)

  • 使用 game_id 进行 5 折 CV 分组
  • 使用不同的分割方式执行 三次 5 折 CV

3.2 优化 (Optimization)

  • RAdam 优化器
  • EMA (指数移动平均),衰减率 = 0.9995
  • 210 个 epoch,每 6 个 epoch 评估一次

4. 损失函数 (Loss Functions)

4.1 主要损失:GaussianNLLLoss

  • 同时预测均值和方差
  • 自动降低大方差样本的权重 → 鲁棒学习
  • 表现优于 SmoothL1
  • 逐帧加权未提供有意义的改进
  • 方差使用以下公式约束为正值:
    softplus(var) + 1e-3

4.2 辅助损失 (Auxiliary Loss)

  • 从预测的 xy 计算得出:
    • 速度 (一阶差分)
    • 加速度 (二阶差分)
  • 同样使用 GaussianNLLLoss
  • 有助于稳定和加速学习

5. 数据增强 (Data Augmentation)

5.1 旋转增强 (Rotation Augmentation)

  • 50% 的概率围绕平均球员位置随机旋转整个比赛画面
  • 旋转角度从 0–360° 均匀采样
  • 最初使用高斯分布 (σ = 5°),但增加方差提高了性能 → 改为均匀分布
  • 可能有益,因为目标取决于 旋转不变的相对位置

5.2 从更早的帧开始预测 (Predicting From Earlier Frames)

  • 对长传预测很重要
  • 不是在传球尝试帧开始预测,而是使用提前最多 20 帧 的数据
  • 因此模型预测:
    • (更早的帧) + (原始预测帧)
  • 显著改善了长轨迹的预测
  • 添加一个静态特征指示“提前了多少帧”
    • (测试时始终为 0)

上图显示了一个示例,其中数据由 30 个输入帧和 9 个输出帧组成。
蓝色表示输入到模型的部分,红色表示模型被要求预测的数据,灰色表示未使用的数据。

当我们希望模型从传球前 5 帧开始预测时,配置如下图所示。
通过此调整,输出变为 14 帧预测。
此过程使用同一组参数应用于比赛中的所有球员。

Frame Augmentation Diagram

5.3 垂直翻转 (Vertical Flip)

  • 沿 X 轴翻转比赛画面

6. 数据处理 (Data Processing)

6.1 异常值移除 (Outlier Removal)

移除长度异常或丢失传球手的比赛:

too_long_ids  = ["2023091100_3167", "2023122100_1450"]
no_passer_ids = ["2023091001_3216", "2023112606_4180", "2023121009_3594"]

6.2 其他处理

  • 如果 play_direction == left,将比赛画面旋转 180 度

7. 集成 (Ensemble)

  • 使用 100+ 个模型 的集成
  • 所有模型共享相同的架构
  • 多样性来源于:
    • 不同的特征配置
    • 不同的 CV 分割
  • 集成方法:简单平均

8. 消融实验 (Ablation Study)

5 个折中每个折的分数随 epoch 的变化。

并排查看结果很有趣,可以看到旋转增强和早期帧预测有助于减少过拟合,辅助损失稳定了训练,而 GaussianNLLLoss 有助于提高准确性。

Ablation Study Results
同比赛其他方案