Methodology

How the models work, what they were trained on, and how accurate they actually are.

No black boxes. No "trust us". Real numbers from the most recent production evaluation.

TL;DR

  • Standard model54.93% accuracy on 758,807 held-out ranked matches. Calibration is excellent (ECE = 0.0086).
  • Plus model (role-aware, knows position 1-5) — 55.28% accuracy.
  • Pro model (player-aware) — 54.52% accuracy on professional matches.
  • The model takes only draft info: 10 hero IDs (+ roles or player IDs for the advanced models). It knows nothing about in-game gold, levels, or items.
  • ~5 percentage points above 50/50 may sound small, but Dota outcomes are dominated by post-draft variance: individual mechanics, lane execution, fights, macro decisions. The draft typically accounts for ~7-12 pp of expected win rate.
  • Don't take our word for it: we score the production model against naive winrate averaging and a 50-50 baseline on the same holdout, and publish the receipts — see the benchmark →

Training data

Public ranked matches
~19M
Steam Web API + OpenDota /publicMatches (rank-filtered). Used to train the Standard and Plus models.
Held-out test set
758,807
Most-recent matches held back from training, used to compute the headline accuracy / BCE / calibration numbers below.
Pro matches
~18,400
OpenDota proMatches + Stratz, used to train the Pro model with player identity awareness.

Data refreshes daily from Steam Web API, OpenDota, and Stratz. Each new model checkpoint is evaluated against the held-out set and only promoted to production if it beats the current champion on BCE without regressing on accuracy. The promotion log is public via our internal eval history.

Model architecture

A small Transformer encoder over the 10 hero slots. Each slot is an embedding of (hero_id + team_side); the encoder produces a CLS token that goes through an MLP into a single sigmoid for Radiant win probability.

Standard
Hero + team embedding only. Trained on ranked. Best general-purpose model.
Plus (role-aware)
Adds position 1-5 to each slot as a residual feature. Transfer-init from Standard; learns the role delta on top.
Pro (player-aware)
Adds player ID per slot. Pre-trained on public ranked, fine-tuned on pro matches with player identity.

All three models are exported to ONNX and run on CPU. Inference for a full BP lookahead tree (~100 candidate evaluations) takes under 200 ms.

Latest production metrics

ModelAccuracyBCE (lower = better)BrierECE (calibration)Holdout size
Standard54.93%0.6850.2460.0086758,807
Plus55.28%0.6850.2460.01343,345 pro
Pro54.52%0.6850.2460.02551,825 pro

How to read these: A binary classifier that always predicts 50/50 gets 50.00% accuracy and BCE 0.693. Our models sit ~5 pp above chance and below the naive BCE -- modest but meaningful. The standout number is ECE 0.0086 on the Standard model: when we say 60%, the actual outcome is 60% (averaged over many such predictions). That's the property serious users care about.

The production model serving these numbers was promoted Jun 22, 2026. This date only moves when a new checkpoint actually beats the champion — never on a routine re-evaluation.

Live accuracy proof

Want to see the model called against actual matches you can verify? The /live page always shows the model's predictions for the most recent finished pro matches with the actual result alongside. Predictions are computed pre-game from the draft only -- the model has not seen the result.

No cherry-picking. The list is the raw OpenDota proMatches feed in reverse-chronological order. If we're wrong, you'll see it.

Known limitations

  • Draft-only signal. The model doesn't know anything that happens after the draft -- gold leads, lane outcomes, fight execution, item choice, individual mechanics. A "55% favored" team can absolutely lose if they get outplayed in lane or throw a fight.
  • New heroes have less signal. Heroes added in the current patch have fewer matches in training; their predictions tend toward 50% until enough data accumulates.
  • Meta shifts hurt calibration. A patch that flips an S-tier hero to F-tier can degrade accuracy for a few weeks until retraining catches up. We retrain on each major patch.
  • Pro player IDs are sparse. The Pro model needs games-with-this-player data to give a meaningful prediction; brand-new pros or stand-ins fall back to "Unknown" embeddings.
  • Not financial advice. This is an analytical / educational tool. Win rates published here are not recommendations to bet, and we do not endorse or facilitate sports betting.

Lab notes — negative results we publish anyway

Stats sites don't run experiments, so they never have null results to report. We do, and we think publishing what didn't work is part of being a model you can trust.

We trained a rank-conditioned model. It didn't help.

A frequent request: "predictions for my bracket." So we ran the controlled experiment (July 2026, GPU A/B): same 9.66M-match dataset, same architecture, same epochs, same 570K-match holdout -- the only variable was giving the model each match's rank bracket.

ModelBCEAccuracyECE
Baseline (rank-blind)0.67860.56910.0106
Rank-conditioned0.67800.56970.0095
Same model, rank withheld0.67810.56960.0095

Accuracy moved +0.0006 -- noise. The ECE gain looks real until you see the giveaway: the conditioned model scores identically with rank withheld, so the improvement can't be coming from rank information. Root cause: matchmaking balances both teams within every bracket, so every bracket sits near the same base rate and the draft signal dominates.

Nuance worth spelling out: hero win rates genuinely differ by bracket -- that's why our bracket tier lists exist. What doesn't change is the draft-level prediction once the ten heroes are known. That's also why there is no rank selector on the predictor: shipping a control that barely moves the number would be over-promising.

Our baseline is a steelman, on purpose.

The benchmark doesn't compare us against a strawman. The "aggregate" method is the strongest honest version of what winrate-table sites imply: per-hero win rates from the training split, combined and then calibrated by a logistic regression fitted on training data -- every generosity we could give it. It still comes out at ECE 0.0414 vs our 0.0086 on the same 758,807-match holdout, and it loses to a literal coin flip on calibration. Being generous to the baseline is what makes the comparison credible.

Why we lead with calibration, not accuracy.

Pre-game accuracy in Dota is capped by design: the better the matchmaker, the closer every game is to 50/50 before it starts. Chasing headline accuracy on that track tells you nothing about whether a probability is honest. Our favorite cautionary tale from the community: a model that beat Valve's own predictor on accuracy, AUC and Brier -- and still lost on calibration (ECE 0.014 vs 0.003). A probability you can act on is one where "60%" empirically means 60%. That's the number we optimize, audit on every promotion, and publish.

How is this different from Dotabuff / Stratz / D2PT?

  • Dotabuff / Stratz / D2PT are excellent stats sites: they show you what happened. Their hero/winrate tables are historical aggregates.
  • This site is a model: it predicts the outcome of a draft you give it, with calibrated probabilities and a Lookahead Decision Tree on the BP simulator that no other public Dota tool offers.
  • Three trained-from-scratch models (Standard / Plus / Pro), each retrained per patch, with the eval history and methodology fully public.

Frequently asked questions

How accurate is the Dota 2 draft win predictor?
The Standard model scores 54.93% accuracy on 758,807 held-out ranked matches — near the ceiling a balanced game allows, since the draft itself only shifts ~7–12 percentage points of win expectancy. The more meaningful property is calibration: ECE 0.0086, so a predicted 60% actually wins about 60% of the time.
What does "calibrated" mean for a win predictor?
Calibration means the stated probability matches reality: across many drafts where the model says 60%, about 60% are actually won. Batru's Standard model measures ECE 0.0086 on 758,807 held-out matches — the receipts are published on the benchmark page.
How often is the model updated?
It is retrained each patch and challenged weekly: a new checkpoint only replaces production when it beats the current champion on the same held-out set. Every evaluation — promotions and rejected checkpoints alike — is published in the model history ledger on the benchmark page.
Is the draft predictor free to use?
Yes. The draft assistant, tier lists, counters and synergy data are open to everyone — no account needed for the core tools. It is a draft-analysis tool, not betting advice.