Downloads · 30 days
0
silly-kicks/ghost-outfield-v1
ghost-outfield-v1 is a tabular regression model from silly-kicks. Use it for the tabular regression task on the model card, and read the license before you ship it in a product. It is set up for silly-kicks. The card lists the license as mit.
Predicts where a league-average outfield rearguard defender would position themselves, per tracking frame, team, and lateral slot. The outfield sibling of Ghost-GK v1: a point estimate (ghostgrx/y, goal-relative) serv…
Downloads · 30 days
0
Access
Public
Updated Oct 13, 2026
Repo size
7.1 MB
Likes
0
Public
Click a slice to open those files.
.npz2.4 MB · 100%
From the Hugging Face model README
Predicts where a league-average outfield rearguard defender would position themselves, per
tracking frame, team, and lateral slot. The outfield sibling of
Ghost-GK v1: a point estimate (ghost_gr_x/y,
goal-relative) served as the exact pickle-free boosted HistGradientBoostingRegressor mean.
Part of the silly-kicks soccer analytics library (TF-60 rest-defense; ADR-087). It is the league-average baseline the rest-defense outfield counterfactual arm differences against ("how far does the actual rest-defense shape sit from average?").
For an in-possession team's rest defense (the rearguard it keeps while attacking, to blunt the
counter after a loss), the model predicts the league-average position of each of the deepest-n
rearguard defenders, ranked left-to-right by a lateral slot_index. It is possession-conditioned:
one model serves both regimes via a live team_in_possession feature — the ball-carrier's
rest-defense rearguard and the defending line facing an attack.
The feature vector is leakage-safe by construction: no input encodes the modeled team's own rearguard coordinates (the prediction target). It is ball state + opponent counter-threat geometry + game context + the lateral slot rank.
| Variant | Repo | Features | Use |
|---|---|---|---|
default (this repo) | silly-kicks/ghost-outfield-v1 | 20 (velocity-bearing) | Continuous tracking (Sportec, SkillCorner, Gradient Sports) |
position_only | silly-kicks/ghost-outfield-position-only-v1 | 16 (4 velocity features dropped) | Velocity-less StatsBomb-360 freeze-frames |
The serve seam auto-selects the variant from the frames' declared velocity availability; a
velocity-less freeze-frame with no bundled position_only yields honest-NaN, never the (invalid)
velocity model.
ghost_gr_x/y serve the exact boosted HGBR mean, reconstructed
pickle-free (baseline + Σ_trees leaf_value; no sklearn at inference). There is no KDE /
density read-out (a point estimate is what the counterfactual arm differences).ghost_outfield_source="fov_cropped"), never a fabricated ghost from the
deepest-n visible players.HistGradientBoostingRegressor, 500 trees, max depth 8, 5-fold CV; trained at
1 frame/second (25 fps tracking is highly autocorrelated — 1 fps is ~25× fewer,
near-duplicate rows with no meaningful signal loss for a mean-positioning model).| Metric | Value |
|---|---|
| Held-out CV euclidean MAE | 6.00 m (per-provider: Gradient Sports 6.14 / SkillCorner 5.91 / Sportec 6.33) |
| Per-possession CV MAE | in-possession 6.97 m / out-of-possession 5.03 m |
| Per-slot CV MAE (slots 1–4) | 5.96 / 6.05 / 6.02 / 5.97 m |
| Training corpus | 179 games / 4170920 rows |
| Rearguard coherence (slot ordering) | ordering_fraction = 1.0 (the independently-predicted slots order as a line) |
| Boosted-reconstruction parity vs sklearn | exact (round-trip verified — safe to publish) |
179 matches / ~4.17M per-(frame, team, slot) rows (at 1 fps) of licensed professional tracking (Sportec/DFL Bundesliga, SkillCorner, Gradient Sports FIFA World Cup 2022). Only the learned parameters are published; no raw provider tracking data is redistributed (parameters-only artifact). Trained from a clean, CI-green commit.
import silly_kicks.tracking as tracking
model = tracking.GhostOutfieldModel.from_variant("default")
# One row per (frame, team, slot) with goal-relative ghost_gr_x / ghost_gr_y + a provenance token.
served = tracking.serve_ghost_outfield_positions(frames, model=model, home_team_id=1)
Input frames must be LTR-normalized (home attacks right). All coordinates are goal-relative to the modeled team's defended goal.
Le et al. 2017 (Data-Driven Ghosting, MIT Sloan). This model is the boosted-mean point-estimate
variant of the ghosting concept (no density estimation). See the silly-kicks NOTICE for the full
citation.
TF-65 velocity-gap re-fit (silly-kicks 4.134.0 / ADR-120; training_commit=a34e992). Re-fit on the dense-grid-corrected floor velocities (TF-65 removed fabricated through-gap velocity on broadcast providers — the prior F1b float32 re-fit at 4.128.0 / ADR-106 is superseded); the metrics table above reflects this re-fit, and the mirror is republished to match the wheel.