Every number on 91* traces to source data. This page documents every statistical model we use — training data, feature engineering, calibration results, and design choices. No black boxes.
Ball-by-ball win probability computed via logistic regression with isotonic calibration. Separate models for first and second innings — the chase model uses 11 features including a DLS-style resource percentage and quadratic interaction terms. Trained on every legal delivery across 1,146 IPL matches from Cricsheet.
Gradient descent with L2 regularization (λ=0.001). First innings trained at lr=0.5 for 3,000 epochs; second innings at lr=0.3 for 5,000 epochs. The isotonic calibration step applies the Pool Adjacent Violators algorithm to correct any systematic over/under-confidence.
| Feature | Description | Weight |
|---|---|---|
| balls_frac | Balls bowled / 120 | +0.648 |
| run_rate_norm | Current run rate / 12 | +0.206 |
| wickets_norm | Wickets lost / 10 | -1.227 |
| wickets_sq | (wickets/10)^2 — accelerating penalty | -0.454 |
| balls_x_wickets | Interaction: timing of wickets matters | +0.173 |
| runs_above_par_norm | Runs above/below historical par / 50 | +1.524 |
| bias | Intercept term | -0.314 |
| Feature | Weight |
|---|---|
| balls_rem_frac | -0.530 |
| runs_needed_norm | -2.299 |
| wickets_norm | -1.301 |
| wickets_sq | -0.686 |
| rrr_norm | -2.577 |
| resource_pct | +1.054 |
| rrr_x_wickets | -1.021 |
| rrr_sq | -2.367 |
| resource_x_runs_needed | +0.676 |
| balls_x_wickets | -1.584 |
| runs_needed_sq | -1.527 |
| bias | 4.928 |
After training, we bin predictions into 20 quantile buckets and compare predicted vs actual win rates. The isotonic calibration step corrects any monotonic drift, achieving a maximum gap of just 0.8%.
Why logistic regression over neural networks? Interpretability. Each weight directly tells you how a feature influences win probability. The quadratic terms (wickets_sq, rrr_sq) capture the non-linear effects that would normally require a more complex model, while keeping the evaluation fast enough for real-time ball-by-ball updates in the browser.
Why separate models per innings? The first innings is fundamentally different from the chase. In the first innings, there is no target — so features like “runs above par” replace “required run rate”. The second innings model needs 11 features because the chase dynamics are more complex: RRR, resources remaining, and target pressure all interact.
Every number on 91* traces to source data. This page documents every statistical model we use — training data, feature engineering, calibration results, and design choices. No black boxes.
Ball-by-ball win probability computed via logistic regression with isotonic calibration. Separate models for first and second innings — the chase model uses 11 features including a DLS-style resource percentage and quadratic interaction terms. Trained on every legal delivery across 1,146 IPL matches from Cricsheet.
Gradient descent with L2 regularization (λ=0.001). First innings trained at lr=0.5 for 3,000 epochs; second innings at lr=0.3 for 5,000 epochs. The isotonic calibration step applies the Pool Adjacent Violators algorithm to correct any systematic over/under-confidence.
| Feature | Description | Weight |
|---|---|---|
| balls_frac | Balls bowled / 120 | +0.648 |
| run_rate_norm | Current run rate / 12 | +0.206 |
| wickets_norm | Wickets lost / 10 | -1.227 |
| wickets_sq | (wickets/10)^2 — accelerating penalty | -0.454 |
| balls_x_wickets | Interaction: timing of wickets matters | +0.173 |
| runs_above_par_norm | Runs above/below historical par / 50 | +1.524 |
| bias | Intercept term | -0.314 |
| Feature | Weight |
|---|---|
| balls_rem_frac | -0.530 |
| runs_needed_norm | -2.299 |
| wickets_norm | -1.301 |
| wickets_sq | -0.686 |
| rrr_norm | -2.577 |
| resource_pct | +1.054 |
| rrr_x_wickets | -1.021 |
| rrr_sq | -2.367 |
| resource_x_runs_needed | +0.676 |
| balls_x_wickets | -1.584 |
| runs_needed_sq | -1.527 |
| bias | 4.928 |
After training, we bin predictions into 20 quantile buckets and compare predicted vs actual win rates. The isotonic calibration step corrects any monotonic drift, achieving a maximum gap of just 0.8%.
Why logistic regression over neural networks? Interpretability. Each weight directly tells you how a feature influences win probability. The quadratic terms (wickets_sq, rrr_sq) capture the non-linear effects that would normally require a more complex model, while keeping the evaluation fast enough for real-time ball-by-ball updates in the browser.
Why separate models per innings? The first innings is fundamentally different from the chase. In the first innings, there is no target — so features like “runs above par” replace “required run rate”. The second innings model needs 11 features because the chase dynamics are more complex: RRR, resources remaining, and target pressure all interact.