683. NFL Big Data Bowl 2026 - Prediction | nfl-big-data-bowl-2026-prediction
首先,感谢 NFL、Kaggle 和所有组织者提供的数据和计算资源——这是我们唯一可以在场上测试模型的地方。
感谢我的队友们日夜不停地打磨特征、调整超参数和修复 bug;第三名的奖杯属于我们要所有人。
下面,我将分以下几个部分介绍我们的解决方案:
x, y, s, a, dir, o, ball_land_x, ball_land_y, num_frames_output
velocity_x, velocity_y
angle_to_ball, dir_rad
player_side_bool, is_passer, is_receiver
distance_to_passer, distance_to_receiver, distance_to_ball_land, passer_to_ball_land, receiver_to_ball_land
distance_to_passing_line, projection_on_passing_line, triangle_area_ratio (球员 - 四分卫 - 接球手构成的三角形面积比)
time_elapsed
我们将每个 play 沿时间轴展开,并将 22 名球员布局为固定槽位(缺失的球员进行零填充)。槽位分配在每个 play 中仅执行一次:
a. 进攻方:按与传球手 (QB) 的欧几里得距离升序排列 11 名球员 → 槽位 0 … 10
b. 防守方:按相同的距离升序排列 11 名球员 → 槽位 11 … 21
a. 统计第一帧中的有效球员数;如果 ≤ 4 则跳过。
b. 随机选择 1–min(5, valid−4) 名球员,将其 36 帧张量归零 + 设置 mask = False。
c. 将剩余球员推到前 k 个槽位,其余用零填充。
所有增强在验证期间均被禁用;仅使用原始数据以保持指标可比性。
我们将官方允许的 2018 追踪数据集 (2018nfldata) 纳入了训练。
2018nfldata 包含一个 event 列。根据 NFL 规则,我们将以下三个事件视为与本竞赛关键时刻等效:
因此,我们只保留事件链为 ball_snap → pass_forward → pass_arrived 的 play。
team == 'football' 的行给出球的坐标。
我们取:
ball_land_x = x 在 event == 'pass_arrived' & team == 'football' 的行ball_land_y = y 在同一行position == 'QB' 的球员event == 'pass_arrived' 时距离 (ball_land_x, ball_land_y) 最近的进攻球员我们使用两阶段流程:
x, y, s, a, dir, o, ball_land_x, ball_land_y, distance_to_passer, num_frames_output, player_side_bool, velocity_x, velocity_y, time_elapsed(预训练模型的离线验证分数范围从 0.62 到 0.68)
TemporalHuberAdapted
输入序列内的自监督下一帧预测。
a. i = 0: 预测整个序列 → 全局运动趋势
b. i = T-1: 从最后一帧预测 → 瞬时变化
c. 中间帧:学习多尺度运动
迫使模型在每个时间步都“知道”最终目标。
| 方面 | 帧间 (Inter-frame) | 终点 (End-point) | 全时空 (Full spatio-temporal) |
|---|---|---|---|
| 目标 | 输入 → 后续输入 | 输入 → 最终目标 | 输入 → 任何输出 |
| 时间链接 | 因果链 | 单方向 (到终点) | 全连接 |
| 主要作用 | 运动建模 | 终点引导 | 时空一致性 |
| 计算成本 | 中等 | 低 | 高 |
| 提升 (LB) | 0.02 | 0.01 | 0.003 |
loss = 1 × primary + 1 × inter-frame + 0.1 × end-point + 0.1 × full-correspondence
在推理时,我们应用两种增强:
单模型预测是加权平均:
pred = 0.50 * pred_orig + 0.25 * pred_tta1 + 0.25 * pred_tta2
添加更多增强并没有带来提升。
我们使用 game_id 7 GroupKFold 离线训练了七个模型:(每个模型 50 个 epoch),cv 约为 0.469。我们获得了 LB 分数 0.458。
最后,通过集成四个 7 折交叉验证模型(不同种子),我们实现了轻微的提升。简单平均后的公共 LB 分数:0.456。