|
|
--- |
|
|
language: en |
|
|
license: mit |
|
|
tags: |
|
|
- sports |
|
|
- football |
|
|
- soccer |
|
|
- premier-league |
|
|
- tabular |
|
|
- poisson |
|
|
- expected-goals |
|
|
- statsmodels |
|
|
library_name: statsmodels |
|
|
pipeline_tag: summarization |
|
|
--- |
|
|
|
|
|
# ⚽ EPL-Pulse_v1 |
|
|
**English Premier League Match Outcome & Goals Predictor** |
|
|
|
|
|
`EPL-Pulse_v1` is a **leakage-safe football match prediction model** trained on historical English Premier League data (1993/94 → 2024/25 mid-season). |
|
|
|
|
|
The model estimates: |
|
|
- **Expected goals (xG)** for home and away teams |
|
|
- **Outcome probabilities**: |
|
|
- Home Win |
|
|
- Draw |
|
|
- Away Win |
|
|
- **Scoreline probability distribution** (e.g., 1–0, 2–1, 0–0) |
|
|
|
|
|
This repository contains the **production-ready model artifacts** used by the public Hugging Face Space. |
|
|
|
|
|
--- |
|
|
|
|
|
## What’s inside this repository |
|
|
|
|
|
### Model artifacts |
|
|
- `home_goals_model.pkl` |
|
|
Poisson regression model for **home team goals** |
|
|
- `away_goals_model.pkl` |
|
|
Poisson regression model for **away team goals** |
|
|
- `feature_list.pkl` |
|
|
Ordered list of features used during training |
|
|
- `team_state.pkl` |
|
|
Latest per-team snapshot used for inference: |
|
|
- Elo rating |
|
|
- Rolling goals-for / goals-against |
|
|
- Timestamp of last update |
|
|
|
|
|
> `team_state.pkl` enables **fast production inference** without recomputing rolling features at request time. |
|
|
|
|
|
--- |
|
|
|
|
|
## Modeling approach |
|
|
|
|
|
### Model type |
|
|
- **Poisson Generalized Linear Models (GLM)** |
|
|
(one model for home goals, one for away goals) |
|
|
|
|
|
### Why Poisson? |
|
|
- Goals are discrete counts |
|
|
- Well-established baseline in football analytics |
|
|
- Interpretable and deployable |
|
|
- Produces full scoreline probability distributions |
|
|
|
|
|
### Outcome probabilities |
|
|
Win / Draw / Loss probabilities are derived from the joint scoreline distribution: |
|
|
|
|
|
```bash |
|
|
P(H=i, A=j) = \text{Poisson}(i|\lambda_H) \times \text{Poisson}(j|\lambda_A) |
|
|
|
|
|
``` |
|
|
|
|
|
--- |
|
|
|
|
|
## Features used (leakage-safe) |
|
|
|
|
|
All features are **computed strictly from matches played before kickoff**. |
|
|
|
|
|
|
|
|
|
|
|
This design prevents **data leakage** and supports reliable backtesting. |
|
|
|
|
|
--- |
|
|
|
|
|
## Quickstart (Python) |
|
|
|
|
|
### Install dependencies |
|
|
|
|
|
```bash |
|
|
from huggingface_hub import hf_hub_download |
|
|
import joblib |
|
|
|
|
|
REPO_ID = "YOUR_USERNAME/EPL-Pulse_v1" |
|
|
|
|
|
home_path = hf_hub_download(REPO_ID, "home_goals_model.pkl") |
|
|
away_path = hf_hub_download(REPO_ID, "away_goals_model.pkl") |
|
|
feat_path = hf_hub_download(REPO_ID, "feature_list.pkl") |
|
|
state_path = hf_hub_download(REPO_ID, "team_state.pkl") |
|
|
|
|
|
home_model = joblib.load(home_path) |
|
|
away_model = joblib.load(away_path) |
|
|
feature_list = joblib.load(feat_path) |
|
|
team_state = joblib.load(state_path) |
|
|
|