# M3：世界赛选手英雄偏好

**简体中文** · [English](README.en.md) · [中文交互结果](../../player_preferences.html) · [英文结果](../../player_preferences.en.html)

队伍总览 → 首发/已确认的替补 → 选手定妆照 → 分路英雄优先级与原始依据。对手禁用集中在队伍名单页，支持替补替换阵容。预测以该选手获得出场为条件，没有预测队伍晋级或替补出场局数。M1 的热度、版本响应与参数保持原样；这是供后续具体对阵 BP 使用的独立 M3 模块。

## 概率口径

- **Pick when available**：轮到该选手所在分路选择时，英雄尚未被前序选取、禁用或全局 BP 锁定，选择该英雄的条件概率。对近 90 天已完成的合法全局 BP 局面按时间衰减平均。不同英雄对应不同条件集合，因此这些概率不必相加为 100%。
- **对手禁用**：对阵该队时，对手禁用该英雄的概率，条件是英雄未因本系列前序对局选取而被锁定。结合队伍五名选手；不是能确认针对某个人的标签。替补预测替换该分路首发，不构成六人阵容。
- 两者不是整个 BO5 至少出现一次的概率，也不是第一局或具体对手的逐手 BP 模拟。M1 的综合 BP 是另一个口径：整个世界赛平均每局出现率。

## 模型

选取头包含版本路径和长期偏好路径：

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

`P_c = (1 - λ × S) × Q_meta,c + λ × T_c`，其中 `T` 为合法英雄上的已证实偏好质量，`S = sum(T)`，`λ ∈ [0,0.25]` 由 S15 学习。被 ban、前序选取或全局 BP 锁定的英雄，两个路径都置零；消失的偏好质量不会全部转给最后一个冷门英雄。

偏好路径需要同一实际分路累计至少 12 次生涯、近两全局 BP 赛季至少 3 次使用；有截止前公开绝活证据时要求至少 6/2 次。单场偶然选择不能构成绝活。质量根据生涯比例、同年代超额偏好和样本收缩构建，总质量不超过 1。旧赛制比例作为背景偏好先验，不作为与全局 BP 混合的直接概率标签。

已证实英雄的生涯/评价特征不再随弱版本完全衰减，同时拥有独立偏好路径。其他表现/近期因素继续使用 `sqrt(anchor/(anchor+.05))` 强度约束。`a ∈ [1,2]`；9 个个人因素系数在 `[0,2]`。M1 之外的分路必须有上述重复的本人实战证据；不会凭空生成沙皇打野等分路。不存在按英雄姓名手工设定的概率底线。

禁用头以 M1 投影到合法集合的双方总禁用率除以 2 为基准，使用带正则化的 Bernoulli 回归，输入队伍五个选手每项个人特征的最大值。这个最大值只编码队内存在相应英雄偏好；不能证明真实禁用意图。各英雄概率独立估计，尚未强制生成恰好五个 ban 的合法序列。

### 9 个因素

1. **生涯偏好**：选手英雄比例相对于相同年代、相同分路的总体热度，以避免把某年代普遍流行的选择当成绝活。旧赛制仅提供这个归一化背景，不混入全局 BP 的直接概率标签。
2. **近两赛季全局 BP 偏好**：2025 年起，选取次数相对该英雄在自己选择时仍可用的次数；小样本向整体分路基准收缩。
3. **近期衰减偏好**：上述选取、机会数按 `2^(-天数/半衰期)` 加权。S15 时间验证比较 14/45 天，选择最佳者。
4. **胜率差**：英雄胜率向该选手本分路总体胜率收缩，再取差值；不是把强队的高胜率无条件当作英雄加成。KDA 独立按下述方法校正后启用。
5. **MVP 比例差**：只在有逐局奖项记录的场次里计算并收缩。缺失是中性，不等于 0；系列赛 MVP 不被强行归给某一英雄。
6. **公开英雄关联评价**：带来源与发布日期的官方纪念关联、选手官方内容或采访。去重并限制在预测截止前；覆盖不完整且存在冠军选手偏差。系数由训练决定，可为零，不为 Faker 沙皇单独写加分。
7. **对位先出偏好**：使用历史已知 BP 顺序与最终实际分路，统计选手先于对位选出英雄的比例。未知顺序排除；这个历史行为指标不是对线优势的证明。
8. **历史对手禁用偏离**：对阵该选手所在队时，该英雄的对手禁用率相对于同期整体版本基准的超额部分。控制通用热度，仍保留 flex/队友混杂因素。

9. **KDA 差**：最近三个日历赛季，先计算 `log1p((击杀+助攻)/(死亡+1))`，避免零死亡导致无限值；在同年、联赛、版本、实际分路和英雄的背景下，排除该选手自身样本估计同类表现；再扣除该选手当年整体残差。365 天衰减、`n/(n+20)` 收缩。缺失中性；当前待预测比赛的赛后数据绝不参与特征。

近期职业排位练习、韩服分路与版本响应已通过冻结的 M1 进入版本锚点，没有重复加第二次练习修正。

## S15 训练、调参与比对

全局 BP 直接训练数据为 S15 赛前 69 个时间窗口；每个窗口的选手特征都截断在窗口开始前。生涯与评价也按同一截止过滤。

1. 4–5 月、6–7 月时间验证选半衰期和 L2 正则化，以选取 log loss 加 `0.5 × 禁用 log loss` 排序。
2. 8 月至世界赛前的终端留出评估；随后全部赛前训练，冻结特征模拟 S15 世界赛 84 局、840 个选手选取。
3. 世界赛赛前特征继续冻结；按完整系列赛划分早期校准和剩余瑞士轮验证，选择修正正则化。前 56 局后训练，最后 28 局淘汰赛作为新模块留出。
4. 最后重拟合全部 S15 世界赛，共享参数迁移到 S16；没有使用 S16 世界赛结果。

**注意：底层 M1 已经用 S15 世界赛进行过回顾性校准。这里的留出仅针对 M3；此前已看过同一留出，因此本次修改比较属于回顾性比较，不能视为新的独立验收。这里的训练留出仅针对 M3，不能称为完全未见数据的系统盲测。** 部分赛前训练窗口的 M1 锚点来自包含这些训练窗口的 M1 基础模型；时间验证的锚点则在相应验证期前拟合，不是完全交叉拟合的堆叠训练。

[全部误差](artifacts/training_results.json)包括 Top1/3/5、log loss、Brier、每名选手每个英雄选取次数的 RMSE/MAE 与禁用误差。[逐项实际次数比对](artifacts/s15_player_count_comparison.json)按实际出场局数和实际合法 BP 状态计算，不能当作对球队晋级轮次的预测。次数误差包含所有 173 英雄的零选取组合。概率指标改善不保证次数 RMSE 同时改善，页面明确列出混合结果与样本内拟合。

## 数据来源与核验

- Oracle's Elixir 2014–2020 官方公共归档新增下载，2021–2026 使用既有职业数据；稳定选手 ID、年份、side、实际分路参与去重。不同比赛 ID 通过既有审计映射或完整十人阵容/英雄/胜负一致的唯一连接合并。冲突隔离。
- 生涯是**可用的主要比赛数据**，不是宣称完整覆盖 2013 年及更早、所有青训和所有选手职业生涯。各选手单独显示起止与场次。
- KDA 原始数值做范围、身份与比赛连接检查；不是宣称每个数值已独立双源核验。当前可用范围见覆盖统计。
- MVP 公共赛事页的逐局奖项，与比赛、赢家、选手和英雄交叉核对。2026 部分没有组织者 ID 时要求赛事、双方队伍、局数和完整有序获奖赢家序列唯一匹配；歧义不采纳。仍是部分 LPL 覆盖，不是独立核验奖项评选结果。
- 首发沿用既有来源核验名单；替补来自公开世界赛阵容。ZUIAN 显示签证/出场状态。官方俱乐部/青训成员不会因有照片而被自动注册为世界赛替补。公开名单不是最终 Riot 注册名单的完整独立认证。
- 定妆照从官方 LoL Esports 下载、按选手姓名精确匹配并验证图片格式/hash。图片版权属于赛事方、Riot 和摄影师。

[覆盖统计](artifacts/data_coverage.json) · [身份审计](artifacts/identity_audit.json) · [MVP 核验](artifacts/mvp_validation.json) · [来源/hash](artifacts/sources.json) · [协议](artifacts/protocol.json)

## 复刻

先按 [冻结数据恢复说明](../../data/development/RESTORE.md)恢复数据库、现有 2021+ 选手数据与 M1 冻结依赖；按 M1 的依赖环境准备 Python（numpy/scipy/Pillow）。原始大文件和训练缓存不进 Git。M1 必须是已经合并绝活/队伍实验模块的当前版本。

```powershell
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
```

MVP/评价网页采集到的结构化观察保留在 `inputs/`；重跑训练无需再次访问页面。缓存带输入及代码 fingerprint，输入变更时会自动重建，避免重用旧缓存。`--resume-selection` 仅用于**输入与缓存完全不变**的失败恢复，不能用于数据更新。近期两局 BP 顺序缺失的德杯仍用于原始次数和 M1 热度，但可选时概率的分子和机会数一并排除这些未知顺序记录。

比赛或 M1 更新后可运行 `prepare → forecast → render → verify → package` 复用共享参数；更新训练数据或特征则重新 `train`。网站当前数据、图片更新可能变化；严格重放需保留来源 manifest 所列冻结文件。ZIP 用于查看结果，不是完整训练数据包。
