# M3: Worlds player champion preferences

[简体中文](README.md) · **English** · [English viewer](../../player_preferences.en.html)

The interface navigates teams → starters/confirmed substitutes → player portraits → role-specific champion priorities, and evidence. Opposing bans live on the team roster screen, with substitute-lineup selection. Predictions assume the player appears; no advancement or substitute playing-time model is used. Existing M1 probabilities and coefficients remain unchanged.

## Definitions and model

**Pick when available** means selection at this player's role turn, conditional on the champion still being legal after previous picks/bans and Full Fearless exclusions. Forecasts average time-weighted legal draft contexts from the prior 90 days. Different champions have different conditioning sets; their conditional probabilities need not sum to 100%.

**Opponent ban** is champion-level probability when the opposing team faces this lineup, conditional on not being excluded by earlier series picks. Five players contribute; the labels do not establish individual targeting intent. Substitute forecasts replace the starter at that role.

These are not BO5 at-least-once probabilities, game-one drafts, or specific-opponent sequential predictions. M1's whole-tournament per-game BP presence is a separate quantity.

The pick head combines a meta path and an evidence-based persistent-comfort path:

`Q_meta = softmax(a*log(M1_anchor) + clip(sum(w_k*gate_k*x_k), -3,3))`

`P_c = (1-lambda*S)*Q_meta,c + lambda*T_c`, where T is legal comfort mass, S is its sum, and lambda is learned on S15 in [0,.25]. Locks and bans remove comfort mass rather than reallocating all of it to the last remaining niche champion.

Comfort requires at least 12 career and 3 two-season Fearless picks in the exact played role, or a dated signature association plus at least 6/2 picks. A single experiment does not qualify. Career share, era-normalized excess preference and sample shrinkage determine mass; total mass is at most one. Classic history is a contextual taste prior, not a pooled Fearless probability label.

Qualified career/reputation evidence no longer disappears behind a weak-meta gate. Other factors retain sqrt(anchor/(anchor+.05)) attenuation. Anchor exponent stays in [1,2]; nine personal coefficients stay in [0,2]. Extra M1-unsupported roles require repeated player-specific role evidence. No name-specific probability floor is used.

The ban head is regularized Bernoulli regression anchored to M1's legal-set total ban projection divided by two. It uses feature-wise maxima across the active lineup's five players. This encodes available team comfort, not identified targeting intent. Independent marginal estimates do not enforce exactly five bans in a legal sequential draft.

Nine shared factors:

1. Career preference relative to same-year, same-role popularity, avoiding era/release-age bias. Classic history is contextual, never directly pooled with Fearless probability labels.
2. Two-season Fearless preference from 2025 onward, based on selections and actual available-turn opportunities, with shrinkage.
3. Recent preference weighted by `2^(-age/half_life)`; chronological S15 validation compares 14/45 days.
4. Champion win rate shrunk toward the player's role-wide win rate, using the residual rather than unqualified strong-team wins. KDA is independently corrected and enabled below.
5. Shrunk MVP residual among games with known game-level awards. Missing is neutral; series MVPs are not assigned to one champion.
6. Dated sourced player–champion associations, deduplicated and cutoff-bounded. Coverage is incomplete and winner-biased. The learned coefficient can be zero; Faker/Azir receives no manual override.
7. Picking before the opposing role, measured only from known historical BP order and actual historical roles. Not proof of lane advantage.
8. Historical opposing bans above the contemporaneous meta baseline, with flex and teammate confounding explicitly retained.

9. KDA residual over the last three calendar seasons: log1p((K+A)/(D+1)), excluding the player's own observations from role/league/patch/champion peer baselines, then player-year centering, 365-day decay and n/(n+20) shrinkage. Missing is neutral; target-game postmatch statistics are never inputs.

Recent professional solo practice and KR ranked patch shifts already enter through frozen M1; there is no duplicated personal practice correction.

## Training and evaluation

Direct choice/ban training uses S15 pre-event Full Fearless windows. Each window's career, reputation and player history is frozen before its cutoff. April–May and June–July time validation selects decay and regularization by pick log loss plus 0.5 ban log loss. August–pre-Worlds is a terminal evaluation period. All pre-event data is then fitted for the frozen 84-game Worlds simulation.

Worlds refinement preserves complete series: early games calibrate, remaining pre-knockout games select regularization, and the final 28 knockout games hold out the new module. The final transfer model fits all S15 Worlds afterward; no S16 Worlds outcomes are used.

**Underlying M1 was already retrospectively calibrated on S15 Worlds. These held-out outcomes were already inspected in the earlier module. This update is a retrospective change comparison, not a new independent acceptance test.** Some in-sample pre-event M1 training anchors include their own training windows; validation-period anchors are fitted before validation. This is not fully cross-fitted stacking.

[Evaluation](artifacts/training_results.json) contains Top1/3/5, log loss, Brier, player×champion count RMSE/MAE and opposing-ban errors. [Count comparisons](artifacts/s15_player_count_comparison.json) condition on actual appearances and legal BP states, not forecast team advancement. All 173 champions including zeros enter count errors. Probability improvement need not improve count RMSE; mixed results and in-sample fits are labeled.

## Coverage and reproducibility

New Oracle's Elixir official archives cover available 2014–2020 major competition records; existing 2021–2026 data supplies current history. Identity uses stable IDs, year, side and played role. Audited source mappings or unique exact ten-player lineups/champions/results join differing game IDs; conflicts are quarantined. Pre-2014 coverage and some career records are incomplete, and individual bounds are displayed.

Combat stats receive finite-range, identity and game-join checks; not every numeric field has independent dual-source verification. MVP coverage is partial LPL game-level awards, cross-checked against winners and identity. Where organizer IDs are absent, joining requires a unique event/team/game-count/complete ordered award-winner sequence. Ambiguity is excluded; this is not independent adjudication of the award. Public substitute lists are not complete independent certification of Riot's final registered roster. Club/academy photos alone do not register a Worlds substitute. Official LoL Esports portraits are matched by player name, validated and hashed; copyright remains with Riot, organizers and photographers.

Restore [frozen project data](../../data/development/RESTORE.md), existing player history and merged M1 dependencies first. Use the project's Python environment with numpy/scipy/Pillow. Run:

```text
python models/player_preferences/collect.py
python models/player_preferences/collect_portraits.py
python models/player_preferences/prepare.py
python models/player_preferences/train.py
python models/player_preferences/forecast.py
python models/player_preferences/render.py
python models/player_preferences/verify.py
python models/player_preferences/package.py
```

Structured MVP/reputation observations are committed under `inputs/`; no webpage access is needed to retrain. Input/code fingerprints automatically rebuild stale training caches; resume-selection is only for unchanged inputs. Two recent cup games with unknown BP order remain in raw counts and M1 heat, but both their numerators and opportunity denominators are excluded from available-turn rates. For match/M1 refreshes, prepare→forecast→render→verify→package reuses shared parameters; feature/training-data updates require retraining. Exact reproduction requires source manifests and frozen files because live public archives/photos change. The ZIP is an offline viewer, not a training dataset.

[Coverage](artifacts/data_coverage.json) · [Identity audit](artifacts/identity_audit.json) · [MVP checks](artifacts/mvp_validation.json) · [Sources](artifacts/sources.json) · [Protocol](artifacts/protocol.json)
