Downloads · 30 days
0
Anyuhhh/pandaskill-lol-gold
pandaskill-lol-gold is a machine learning model from Anyuhhh. Use it for the machine learning task on the model card, and read the license before you ship it in a product. The card lists the license as mit.
This repository contains role-specific XGBoost models, scalers, and baseline percentile curves for evaluating League of Legends player performance in Gold-tier ranked play. The work adapts the PandaSkill framework (De…
Downloads · 30 days
0
Access
Public
Updated Apr 13, 2026
Repo size
—
Likes
0
Public
Click a slice to open those files.
.json9.7 MB · 100%
From the Hugging Face model README
This repository contains role-specific XGBoost models, scalers, and baseline percentile curves for evaluating League of Legends player performance in Gold-tier ranked play. The work adapts the PandaSkill framework (De Bois et al., 2025) from professional esports data to amateur ranked gameplay, with an added real-time troll detection system.
The training dataset used to produce these models is available at Anyuhhh/pandaskill-lol-gold-data.
| Path | Description |
|---|---|
models_15_features/ | 5 role models + 5 scalers trained on full end-game 15-feature set (paper reproduction) |
gold_tier_models/ | 5 role models + 5 scalers trained on 9 timeline-available features (real-time compatible) |
gold_tier_models/training_summary.json | Training metrics and configuration summary |
Trained on end-game statistics using the full 15-feature set defined in the original PandaSkill paper (Section IV-A, V-B). Each role model is paired with a corresponding scaler for standardization (zero mean, unit variance) applied before inference.
Input features (15): Kill-life-assist ratio, Gold per minute, Experience per minute, Creep score per minute, Wards placed per minute, Damage dealt to champions (normalized), Damage dealt per gold, Damage taken (normalized), Damage taken per gold, Largest multi-kill, Largest killing spree (normalized), Worthless death ratio, Free kill ratio, Objective contest win rate, Objective contest loss rate.
Monotonicity constraints: All features constrained to increase win probability except Worthless death ratio and Objective contest loss rate (constrained to decrease).
Retrained using only the 9 features extractable from the Riot Timeline API during an active game. Damage-dealt statistics and kill-streak features are set to zero, as the Timeline API does not expose mid-game damage data. Feature importance analysis confirmed these features contribute near-zero predictive power, making the 9-feature model suitable for real-time scoring without significant accuracy loss.
Active features (9): Kill-life-assist ratio, Gold per minute, Experience per minute, Creep score per minute, Wards placed per minute, Damage taken (normalized), Worthless death ratio, Free kill ratio, Objective contest rates.
Training configuration:
Results (models_15_features):
| Metric | Value |
|---|---|
| Accuracy (5-fold avg) | 90.74% |
| Standard deviation | 0.60% |
| Expected Calibration Error (ECE) | 0.93% |
This matches the 90.74% accuracy reported in the original PandaSkill paper, confirming successful reproduction of the framework on Gold-tier data.
Performance scores are mapped to a 0-10 scale compatible with OP.GG's scoring convention:
score_10 = (relative + 1) / 2 * 10
relative = 2 * (percentile / 100) - 1
A score of 5.0 represents an average Gold-tier player. Scores below 3.0 indicate bottom-10th-percentile performance and are flagged for troll detection review.
The window-based detection algorithm compares recent performance slope against early-game baseline using a 3-checkpoint rolling window:
delta_recent = mean(score[t-2 : t+1])
delta_base = mean(score[0 : t-3])
rel_collapse = delta_recent - delta_base
Collapse flags are suppressed until sufficient game history exists (checkpoint >= 3). Vision-related flags apply only to Support and Jungle roles after minute 12.
import xgboost as xgb
import json
import numpy as np
# Load model and scaler for a given role
role = "mid"
model = xgb.XGBClassifier()
model.load_model(f"models_15_features/{role}_model.json")
with open(f"models_15_features/{role}_scaler.json") as f:
scaler_params = json.load(f)
# Standardize features (zero mean, unit variance)
features = np.array([[...]]) # shape (1, 15)
features_scaled = (features - scaler_params["mean"]) / scaler_params["std"]
# Predict win probability
win_prob = model.predict_proba(features_scaled)[0][1]
Intended uses:
Limitations:
@article{debois2025pandaskill,
title={PandaSkill - Player Performance and Skill Rating in Esports:
Application to League of Legends},
author={De Bois, Maxime and Parmentier, Flora and Puget, Raphael
and Tanti, Matthew and Peltier, Jordan},
journal={arXiv preprint arXiv:2501.10049},
year={2025}
}