PMGC Winner Prediction
Share of knockout rounds where the model's top-ranked team finished first.
Self-reported · method belowThe problem
Sixteen teams drop into a PUBG Mobile Global Championship match. One wins the round. Unlike a two-sided fixture, this is not a coin flip you can model with a single probability — it is a ranking problem over a field, and the raw signal is thin. Placement is noisy, lobbies are chaotic, and a team can play a near-perfect round and still lose to a bad circle.
What the raw data does not tell you
Average placement is the obvious feature and it is close to useless on its own. A team that finishes 4th every single round and a team that alternates between 1st and 15th have the same mean and completely different prospects in a knockout format. Two engineered features did most of the work:
- Consistency index — the inverse spread of a team's placements over a rolling window. It separates teams that are reliably near the front from teams whose average is propped up by one lucky round.
- Clutch factor — how a team performs once the lobby is down to the final few squads, relative to how they perform in the early game. Some rosters farm early kills and fold late; others do the opposite, and the late-game behaviour is what decides rounds.
Model selection
Three candidates, evaluated on tournament rounds the model had never seen, with the split made by time rather than at random — shuffling rows here would leak future form into the training set and quietly inflate every number.
- Logistic regression — the baseline. Fast, interpretable, and unable to express the interaction between consistency and late-game behaviour.
- Random forest — captured the interactions, but bled accuracy on the small number of rounds available per tournament.
- XGBoost — best of the three, and it stayed best after tuning. Gradient boosting handles the small-and-tabular regime that this data lives in.
from xgboost import XGBClassifier
model = XGBClassifier(
n_estimators=400,
max_depth=4, # shallow: the dataset is small and eager to overfit
learning_rate=0.05,
subsample=0.8,
eval_metric="logloss",
)
model.fit(X_train, y_train)
What 78% actually means
It is the share of held-out knockout rounds where the top-ranked team went on to win. That is a useful headline and a slightly flattering one, because it says nothing about how the model ranked the other fifteen teams, and nothing about whether its stated confidence was calibrated. A model that says "80% sure" ought to be right about eight times in ten; that is a different measurement, and it is the one I would run first if I picked this up again.
What I would change
- Score it as a ranking task — NDCG over the full field rather than top-1 accuracy.
- Add a reliability curve, so the probabilities can be trusted as probabilities.
- Model roster changes explicitly. Right now a team that swapped two players carries its old form forward as if nothing happened.