MLP xG Prediction Model

This is a Multi-Layer Perceptron (MLP) model trained to predict Expected Goals (xG) in football/soccer.

Model Description

  • Architecture: Multi-Layer Perceptron with 3 hidden layers
  • Hidden Dimensions: 128 → 64 → 32
  • Input Features: 22 features
  • Output: Binary probability (goal vs no goal)
  • Framework: PyTorch
  • Dropout Rate: 0.3
  • Activation: ReLU (hidden layers), Sigmoid (output)
  • Normalization: Batch Normalization after each hidden layer

Performance Metrics

  • Accuracy: 0.8797
  • Precision: 0.6452
  • Recall: 0.1225
  • F1 Score: 0.2060
  • ROC AUC: 0.7866
  • Log Loss: 0.3169

Features

The model uses the following 22 features:

  • angle_to_gk
  • angle_to_goal
  • ball_closer_than_gk
  • body_part_name_Left Foot
  • body_part_name_Other
  • body_part_name_Right Foot
  • dist_to_gk
  • distance_to_goal
  • goal_dist_to_gk
  • minute
  • nearest_opponent_dist
  • nearest_teammate_dist
  • opponents_within_5m
  • play_pattern_name_From Counter
  • play_pattern_name_From Free Kick
  • play_pattern_name_From Goal Kick
  • play_pattern_name_From Keeper
  • play_pattern_name_From Kick Off
  • play_pattern_name_From Throw In
  • play_pattern_name_Other
  • play_pattern_name_Regular Play
  • teammates_within_5m

Usage

import torch
import joblib
from huggingface_hub import hf_hub_download

# Download files
model_path = hf_hub_download(repo_id="rokati/mlp_xg", filename="best_mlp_model.pth")
architecture_path = hf_hub_download(repo_id="rokati/mlp_xg", filename="model_architecture.py")
scaler_path = hf_hub_download(repo_id="rokati/mlp_xg", filename="scaler.pkl")
config_path = hf_hub_download(repo_id="rokati/mlp_xg", filename="config.json")

# Load architecture
import importlib.util
spec = importlib.util.spec_from_file_location("model_architecture", architecture_path)
model_module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(model_module)

# Load model
model = model_module.MLP(input_dim=22, hidden_dims=[128, 64, 32], dropout_rate=0.3)
model.load_state_dict(torch.load(model_path, map_location=torch.device('cpu')))
model.eval()

# Load scaler
scaler = joblib.load(scaler_path)

# Make prediction
# X_new should be a pandas DataFrame or numpy array with the correct features
X_scaled = scaler.transform(X_new)
X_tensor = torch.FloatTensor(X_scaled)
with torch.no_grad():
    xg_prediction = model(X_tensor).numpy()

Training

The model was trained on football shot event data with:

  • Binary Cross Entropy loss
  • Adam optimizer (lr=0.001, weight_decay=1e-5)
  • ReduceLROnPlateau scheduler
  • Batch size: 256
  • Epochs: 50

License

MIT

Downloads last month
66
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support