NBA 时刻卡模拟器评分模型说明
这个模型不是用真实历史球队样本训练出来的机器学习模型,而是一个基于篮球知识构造的 可解释评分系统。它的目标不是精确预测真实 NBA 胜场,而是把五张球员卡转化为一组阵容层 特征,再根据时代环境、伤病、磨合和随机赛季波动,估计这套首发五人在 82 场常规赛里的强度。
一、模型类型
当前模型可以视为一个 hand-crafted scoring model:先做特征工程,再用线性组合和规则项形成球队净强度。 它接近统计建模里的专家先验模型,而不是从数据中估计参数的监督学习模型。
这里的系数不是回归训练出来的,而是人工指定的权重。优点是解释性强、调参快、符合直觉; 缺点是没有经过真实样本校准,容易在边界阵容上出现偏差。
二、输入变量
每张卡先被表示为一组球员层变量,这些变量混合了真实赛季数据、人工能力评分和打法标签。
这些变量不是直接相加,而是先被组合成更接近篮球机制的中间变量。比如 shoot 和 space 不完全相同:shoot 偏个人投射能力,space 偏阵容拉开空间的价值。
二点五、底层字段到底从哪里来
当前卡库每一行的字段顺序是固定的。以代码结构看,一张卡大致长这样:
| 字段 | 来源/性质 | 现在怎么理解 |
|---|---|---|
| name / version / team / pos | 人工录入,参考该球员代表赛季和球队版本 | 决定球员身份、年代、球队、基础位置。 |
| archetype | 人工分类 | 例如 heliocentric、shotCreator、connector、defAnchor、pointCenter,用来影响球权负载、位置摇摆和阵容兼容。 |
| OVR | 人工历史版本总评 | 不是 2KDB/MyTeam OVR。它是根据该版本真实表现、历史地位、峰值强度和阵容模拟需要定的内部总评。 |
| off / def / pass / shoot / finish / reb / space / usage / impact | 模型内部评分字段 | 这几个是 0-100 左右的人工刻度。它们吸收真实数据、高阶数据、荣誉和打法判断,但不是单一真实统计量,也不是 MyTeam 属性。 |
| ppg / ts / per / ws48 / bpm / vorp | 真实赛季统计或近似真实赛季统计 | 更接近 Basketball-Reference 一类历史数据口径,用于给个人产量、高阶影响和效率提供锚点。 |
| tags | 人工标签 | 比如 MVP、DPOY、篮板王、护框、冠军核心,用于补充纯数值看不出的角色信息。 |
所以当前模型不是“真实数据自动建模”,而是“真实数据 + 人工评分卡 + 规则模型”。 如果要变得更严谨,下一步应该把这些人工字段拆成可复现的生成规则,例如用真实数据 percentile、 奖项 dummy、位置 dummy、角色标签和人工校准层来生成 off/def/pass 等标准分。 2KDB/MyTeam 的属性不适合作为真实能力输入,因为它服务的是卡牌游戏平衡,不是历史真实能力估计。
三、阵容层特征工程
五个人放在一起之后,模型会先计算一批 team-level derived features。统计上看,这一步相当于把 individual-level covariates 聚合成 lineup-level covariates。
四、进攻与防守子模型
模型不是只有一个总分,而是先分别构造现代进攻、肉搏进攻、现代防守、肉搏防守。当前版本仍是规则模型,还没有用历史球队样本做回归或回测校准。
这样做的直觉是:现代环境更放大空间和组织,肉搏环境更放大禁区压力、对抗终结和半场硬解。
防守子模型
防守端也分环境。现代防守更重视换防,肉搏防守更重视护框和篮板。
五、兼容度与球权风险
阵容兼容度 fit 是模型里很关键的一层,因为篮球不是五个高分球员的线性叠加。模型会奖励空间点、 连接器、二次创造点、基本位置结构和护框资源,同时惩罚过多高使用率核心。
从统计视角看,这里是在显式加入 interaction terms 和 congestion penalties。比如两个大核单独看都很好, 但同时上场时 usage 的边际收益下降,并且失误、停球和无球适配问题会上升。
| 变量 | 含义 | 模型作用 |
|---|---|---|
| creators | usage >= 88 的高球权创造者数量 | 超过 2 个开始扣分,避免五个大核堆一起无脑变强。 |
| engines | heliocentric 持球大核数量 | 多个体系核心共存会被额外惩罚。 |
| connectors | 无球、连接、防守、空间型角色 | 提升阵容流动性和防守稳定性。 |
| turnoverRisk | 球权负载超标后的风险 proxy | 进入最终净强度时会被扣分。 |
| engineFriendlyRoles | 能为任意主控核心提供空间、防守或终结的角色数量 | 不再检查球员姓名;勒布朗、东契奇、哈登等使用同一条结构规则。 |
五点五、页面里的几个函数/变量怎么定义
之前那张黑底公式图里用了 shooting_points、connectors、secondary_creators 这类简写, 但没有把定义展开,这是不够透明的。当前代码里的定义如下:
| 变量/函数 | 精确定义 | 解释 |
|---|---|---|
| avg(list, key) | 五张卡某个字段的平均值 | 例如 avg(list, "pass") 就是五个人 pass 的均值。 |
| roleCount(list, predicate) | 统计五张卡里满足某个条件的人数 | 比如 roleCount(list, c => c.space >= 86) 就是空间点数量。 |
| shooting | roleCount(list, c => c.space >= 86) | 页面里写的 shooting_points,其实就是 space 大于等于 86 的球员个数。 |
| creators | roleCount(list, c => c.usage >= 88) | 高使用率主攻手数量。超过 2 个会产生球权拥挤惩罚。 |
| engines | roleCount(list, c => c.archetype === "heliocentric") | 持球大核数量,比如詹姆斯、东契奇、哈登这类体系核心。 |
| connectors | archetype 属于 connector、pointStopper、movementShooter、stretchBig、defAnchor 的人数 | 代表不用大量持球也能提供价值的拼图型资源。 |
| secondaryCreators | pass >= 84 且 usage >= 74 且 usage < 90 的人数 | 二次处理点,不是绝对大核,但能接球后继续处理。 |
| guards | 基础位置包含 PG 的人数 | 至少一个控卫会加分;没有控卫会扣分。 |
| wings | 基础位置包含 SG 或 SF 的人数 | 两个以上侧翼会加分,因为现代/跨时代阵容都需要侧翼资源。 |
| bigs | 基础位置包含 PF 或 C 的人数 | 至少一个前场/内线会加分;完全没有会扣分。 |
| rim | 中锋,且 def >= 84 或 reb >= 94 或标签含护框/盖帽/篮板王/禁区统治/DPOY | 判断是否有可靠护框支点。 |
| traditionalRim | 中锋,且 finish >= 88 且 reb >= 90 | 判断是否有传统内线篮板和禁区终结支点。 |
| eliteInteriorGravity | 实际站中锋位,finish >= 95,usage >= 88,reb >= 90,且 impact/荣誉达到历史级 | 识别奥尼尔、贾巴尔这类低位异常值;他们低空间,但能通过收缩防守制造外线机会。 |
| usageLoad | 把每个 archetype 映射成球权占用权重后求和 | heliocentric=1.18,shotCreator=1.02,connector=0.62,defAnchor=0.58 等。 |
| turnoverRisk | 球权超载项 + 纯持球重叠项 - hierarchyRelief | 组织点、连接器、受尊重空间点和历史级低位重力会缓解风险;多个纯单打核才会重扣。 |
六、时代交互项
模型当前有三种环境:现代空间、90s/00s 肉搏、中性跨时代。不同环境不是简单加减一个固定分, 而是切换不同的进攻/防守子模型,并额外加入 eraBonus 和 eraPenalty。胜场最终以中性强度为主体,时代适配只作为有上限的 styleAdjustment。
这里的关键不是“现代球员一律扣分”,而是判断现代打法迁移到肉搏环境时的脆弱点: 小后卫、低对抗、防守篮板弱、过度依赖空间、手检环境下的持球消耗等。
七、最终胜场映射
最终模型构造一个 net strength proxy,然后以 41 胜作为联盟平均基准,把强度差映射到胜场。
其中 41 胜是中性球队基准,offense、defense、fit、advImpact 是主要解释变量。 tanh 是饱和映射:中段强度提升会明显增加胜场,但越接近历史极值,新增强度对应的胜场越少,避免大量阵容直接撞到 78 胜。 randomSwing 不是完全随机,它由五张卡 ID、伤病值、磨合值生成 deterministic noise: 同一套阵容和同一组设置会得到同一个波动项。
肉搏环境里如果 eraPenalty 很高,还会设置上限:penalty 超过 12 时最多 66 胜, 超过 18 时最多 60 胜。这是为了避免一套结构明显不适配的阵容仅靠天赋冲到历史级胜场。
八、季后赛模型
季后赛不是简单沿用常规赛胜场,而是重新构造 playoff power。
每一轮先把球队 power 与该轮对手强度转换成独立晋级概率:
页面展示的是一次固定抽样路径,但“夺冠概率”是四轮概率的乘积。即使历史级阵容也可能爆冷出局, 防守强但进攻不足的球队也不会再因为高阶影响力重复计权而轻易横扫夺冠。
九、球员赛季数据
模拟后的个人数据也是派生模型,不是逐场 box score 累加。
这一步的目标是让每个球员在新阵容里的角色发生变化:高 usage 球员不一定完全复制原赛季产量, 空间和团队强度也会影响效率。
十、统计意义上的局限性
| 问题 | 当前处理 | 更严谨的升级方向 |
|---|---|---|
| 参数未训练 | 权重来自篮球直觉和人工调参。 | 构造历史球队样本,用 SRS、Net Rating 或胜场作为 label 做回归校准。 |
| 样本迁移 | 用 eraBonus、eraPenalty 和保护规则处理跨时代。 | 建立分时代模型,或加入 era-by-feature interaction terms 进行估计。 |
| 非线性关系 | 用阈值、clip、count bonus 和 penalty 做近似。 | 可以用 GAM、ridge with splines、XGBoost 或 Bayesian hierarchical model。 |
| 不确定性表达 | 只有 deterministic season noise。 | 输出胜场分布、置信区间、季后赛路径概率,而不是单点估计。 |
| 逐场机制缺失 | 现在是一次性估算 82 场强度。 | 加入 schedule、opponent strength、home/away、rest、injury process,做 Monte Carlo season simulation。 |
十一、球员评分层:derived-v1-calibrated
现在模拟器已经不再直接使用原来的人工字段作为主评分。原来的 ovr/off/def/pass/shoot/finish/reb/space/usage/impact 已经保存在 card.manual 里作为备份;页面展示与阵容模型输入使用 derived-v1-calibrated 生成分。 derived-v1 的输入是现有卡库已经有的真实赛季锚点:PPG、TS%、PER、WS/48、BPM、VORP, 再叠加位置、archetype、荣誉标签和角色标签校准。
| 目标字段 | 建议真实数据组件 | 公式思路 | 现在缺什么 |
|---|---|---|---|
| shoot | 3P%、3PA、3PAr、FT%、TS%、中距离效率 | 投射不是只看命中率,要同时看产量、难度和罚球手感。三分产量高且效率高的球员应高分。 | derived-v1 暂用 TS%、PPG、BPM、archetype 和射手标签 proxy;仍缺 3P%、3PA、3PAr、FT% 和中距离。 |
| space | 3PAr、三分产量、无球三分标签、位置 | space 衡量阵容拉开价值。高产三分、Logo 威胁、无球跑动会提高空间分。 | derived-v1 暂用 shoot、射手标签、位置和 archetype proxy;仍缺真实三分出手结构和无球/持球三分拆分。 |
| pass | AST%、AST/TOV、TOV%、Usage 下的助攻负载、位置 | pass 不等于场均助攻,要看球权环境下的组织产出和失误控制。 | derived-v1 暂用 BPM、VORP、PER、archetype 和组织标签 proxy;仍缺 AST%、TOV%、AST/TOV。 |
| usage | USG%、FGA、FTA、TOV、on-ball role | usage 应主要由 USG% 和出手/罚球/失误占有决定,再用角色标签校准。 | derived-v1 暂用 PPG、PER、BPM、archetype 使用权重和主攻标签 proxy;仍缺 USG%。 |
| finish | 2P%、rim FG%、FTr、FTA、扣篮/篮下频率 | 终结要同时看篮下效率、造罚球、对抗产量和持球突破压力。 | derived-v1 暂用 PPG、TS%、PER、位置、archetype 和终结标签 proxy;仍缺篮下出手、造罚球率和 2P 分区。 |
| reb | TRB%、ORB%、DRB%、位置、上场时间 | 篮板必须按位置校准。后卫高 TRB% 和中锋高 TRB% 的含义不同。 | derived-v1 暂用 PER、WS/48、BPM、位置和篮板标签 proxy;仍缺 TRB%、ORB%、DRB%。 |
| def | DBPM、DWS、STL%、BLK%、DPOY/All-Defense、位置 | 防守最难量化,要用高阶防守数据、抢断盖帽、奖项和位置校准共同生成。 | derived-v1 暂用 BPM、WS/48、archetype、防守标签和位置 proxy;仍缺 DBPM、DWS、STL%、BLK%。 |
| off | PPG、TS%、USG%、OBPM、OWS、PER | 进攻总分由产量、效率、球权难度和高阶进攻影响共同决定。 | derived-v1 暂用 PPG、TS%、PER、BPM、usage 和 shoot proxy;仍缺 OBPM、OWS、USG%。 |
| impact | BPM、VORP、WS/48、MVP shares、季后赛 lift | impact 是综合历史影响力,不只是常规赛效率,需要加入荣誉和季后赛校准。 | derived-v1 使用 BPM、VORP、WS/48、PER、奖项和季后赛标签;仍缺 MVP shares 和更严谨的季后赛 lift。 |
| OVR | off、def、impact、位置角色、峰值荣誉 | OVR 应作为派生结果,而不是输入变量。它应该从各子能力和历史影响力聚合得到。 | 当前已经改为派生值:由 impact、off、def、max(pass/shoot/finish)、reb、usage 聚合。 |
十二、可复算公式草案
下面是更完整的数据版公式形态。当前 derived-v1 已经先用可用字段实现了 proxy 版本; 等 USG%、AST%、TRB%、DBPM、3PAr 等字段补齐后,可以把 proxy 替换为更严格的 percentile 或 z-score。
注意这里的 award_bonus 和 role_bonus 不是随便拍脑袋,而是明确的 dummy/校准层。 例如 MVP、DPOY、Finals MVP、一阵、一防可以有固定加成,但加成需要封顶,避免奖项重复导致爆表。
十三、落地顺序
当前阵容层模型已切到 derived-v2:保留 derived-v1-calibrated 球员分,并用固定阵容回归集约束胜场和季后赛改动。后面继续补真实组件。
一句话总结
当前评分系统是一个可解释的专家规则模型:它先把五张球员卡转换成阵容特征,再通过时代交互、 兼容度、球权风险和高阶影响力形成净强度,最后以 41 胜为基准映射到常规赛胜场。 它适合做可玩、可解释、可快速迭代的模拟器原型;如果要变成更严谨的统计模型,下一步应该用真实历史球队数据做参数校准和评分审计。