Aditya ML & cloud
All projects

PMGC Winner Prediction

Held-out knockout stages 78%

Share of knockout rounds where the model's top-ranked team finished first.

Self-reported · method below

The 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.

Open the tournament dashboard All projects