香菜的博客
全部项目

PROJECT · 2026

CS2 职业比赛胜率预测:从 Elo 到一个可复现的校准系统

用 68,523 场职业比赛做 CS2 胜率预测,log loss 从 0.6290 降到 0.6204,并诚实报告了两个失败的改进假设。

已交付 CS2Elo预测模型可复现研究论文

这是什么

给定任意两支 CS2 战队、赛制和比赛时间,输出:

  • 校准过的胜率与 95% 区间
  • 理论价格与参考价
  • 按双方图池强弱自动 ban/pick 的地图推演,以及每张图的胜率
  • 可选的资金配置建议(凯利公式 + 蒙特卡洛回撤/破产概率)

整套东西是可复现的:数据快照有 SHA-256,随机种子固定,一条命令重训,另一条重跑所有图表。

数据

项数值
比赛68,523 场(去重后,原始 69,509)
时间跨度2015-11 – 2026-10
战队4,564 支
地图56,730 张(2023 年后 14,449 张)
新闻 / 抽取事件1,097 篇 / 273 条

三个来源合并(hojlund、HLTV 抓取、Kaggle),难点不在抓取而在对齐:队名有 95 组大小写/后缀变体,还有数据源把单图比分写进系列赛比分的 bug,导致 BO1 被误标成 BO5——修正后 BO5 从 11,175 场降到 684 场。

模型

四层:

  1. 队伍 Elo:净胜图数作为修正因子,长期不参赛向 1500 衰减(半衰期 180 天)。
  2. 地图 Elo:每队每图独立评分,样本不足 5 场时向队伍评分收缩。
  3. veto 模拟:按「相对强度」ban 弱图、pick 强图,再用 DP 把逐图胜率合成系列赛概率。
  4. 逻辑回归:带时间权重(半衰期 1500 天)和 Platt 校准。

外加新闻事件抽取——只用大模型做结构化事件(转会、伤病、教练变动),概率完全由统计模型给,这条边界是刻意守住的。

结果

模型特征数2025-082026-09平均
Elo 基线10.629990.627970.6290
逻辑回归200.622350.621630.6220
+ 地图特征270.621550.620570.6211
推荐特征集250.620760.620110.6204

准确率 65.1% / 65.4%,期望校准误差 0.85% / 1.89%。梯度提升树(0.6278)反而更差——说明现有特征基本是线性可加的。

两个阴性结果(更有意思的部分)

1. 赛制/年份特征是负资产。

留一法实验显示,把 is_bo1、is_bo5、tier_major、lan、year 这组去掉后,两个切分的 log loss 分别下降 0.00055 和 0.00024。原因是年份和赛事层级在跨期评估里编码了时代漂移——模型学到的是「某年某级别比赛更容易爆冷」,不可迁移。

据此砍到 25 维,三个切分全部改善,平均 0.0014。

2. 两个业务假设都不成立。

  • 按 1/3/5 张地图分别建模:一升一降,净收益约等于零。三种赛制的概率来自同一批队伍、同一批地图评分,相关性太高,加进去是冗余维度。
  • 分析师/复仇效应(近期输给同一对手后再次相遇会更强):32,456 场再相遇,上次赢家重复获胜 58.23%,Elo 期望 58.42%,差 −0.002,置信区间跨零。看起来最像复仇的「热门重复获胜低于期望 3.7%」,在全样本同样存在(弱队超期望 6.4 个点)——那是 Elo 过度自信,校准后就吸收了。

把这两个假设证伪写进论文,比硬凑一个涨点的特征诚实得多。

系统

  • 命令行:python -m csgopred predict -a Vitality -b Spirit --format bo3
  • HTTP API:四个只读接口,返回 JSON
  • 界面:中文 /、英文 /en,同一套 API;首页有地图推演和驱动因素
  • 每日更新:抓赛果 → 判断增量 → 需要时重训 → 写当日报告

复现与投稿

python repro/make_snapshot.py   # 校验数据/模型哈希
python repro/train.py           # 重训并输出 repro/results.json
python experiments/decompose.py # 重跑归因实验

论文投 Journal of Statistics and Data Science in Sports(JSDSS,钻石开放获取,不收版面费),因为它的三条创刊原则——开放获取、可复现、把体育当实验室——和这个项目对得上。

仓库

代码:<https://github.com/Aokua/csgopred>

里面包含完整代码(注释已英文化)、6 个实验脚本、数据快照(Git LFS,198 MB)、中英文论文、Quarto 复现稿,以及 MIT + CC BY 4.0 双许可。

数据只用于研究,不构成任何投注建议。