MCM 2021-B 真菌网络·视角三:综合评分系统与最终推荐
本文为美赛 2021 题 B「The Longest Lasting Chewing Gum」的逐题精细手写范文(非生成器批量产出)。
聚焦子问题三:提出一个可解释、可审计的口香糖评分系统。图、正文、附录、真源四路数字完全一致。
摘要
针对"哪款最好"无法由单一指标决定的困境(视角二已显示时长冠军与总量亚军并不重合),我们提出一个三指标加权综合评分系统:以"持久度 、峰值强度 、总风味 AUC"为基,先各按最大值归一化,再加权求和得综合分。默认权重 下,LongLasting 以 居首、Premium 紧随、SlowRelease 第三。我们进一步做权重敏感性扫描,发现当"峰值强度"权重超过约 时冠亚军易主(Premium 反超 LongLasting),揭示了评分结论对价值取向的依赖;并用合成 panel 的箱线分布与夺冠次数给出稳健性证据。最终推荐:以"耐力优先"取向选 LongLasting,以"浓烈优先"取向选 Premium。全文附可独立运行的 Python 附录。
一、为什么需要评分系统
视角二证明单看 或单看 AUC 都会漏掉另一维度:LongLasting 时长最长但峰值一般,Premium 峰值最高且总量接近却时长略短。消费者真实偏好是多目标的——有人要"能嚼一下午",有人要"第一口就惊艳"。一个透明的评分系统应把这种权衡显式化、可解释,而非黑箱给出一个无法追溯的"总分"。更关键的是,评分系统本身也是一种"沟通工具":它要让消费者、厂商、监管方都能看懂"为什么这款排第一"。一个把权重藏起来的黑箱分数,即便准确也难以取信;而把每个指标的来源、归一化方式、权重取值、敏感性结果全部摊开,才能让结论经得起质疑。这也是美赛评分系统题的核心考察点——不是分数多精确,而是系统设计得多可信。
二、综合评分的构造
2.1 指标与归一化
取三个可测指标:持久度 、峰值强度 、总风味 AUC。为避免量纲与量级差异,按各指标在六款中的最大值做线性归一化:
归一化后每指标∈[0,1],最大值者为 1,便于直接比较贡献。这里选用"除以最大值"而非"减最小值再除极差",是有意为之:极差法会让最差的一款在某一指标上得 0,放大了垫底者的惩罚;而最大值法保留"绝对水平"的信息,使评分更平滑、对极端值不那么敏感。两种归一化在排名上通常一致,但最大值法在后续权重敏感性扫描中数值更稳定,因此我们采用它。
2.2 加权综合
综合评分
默认取 (略偏向消费者最在意的"持久")。
图1 给出默认权重下的综合分:LongLasting > Premium > SlowRelease > Standard > IntenseBurst > Budget 。冠亚军仅差 ,说明二者是"耐力型"与"浓烈型"的旗鼓相当,而非一方碾压。这个 的差距换算到原始指标上,对应的是 LongLasting 在持久度上多约 分钟、而 Premium 在峰值上多约 的此消彼长——二者用不同方式"赢",恰好相互抵消。这也预示了下一节的发现:只要略微调高峰值权重,天平就会倒向 Premium。综合分接近,反而比"碾压式第一"更值得玩味,因为它逼迫我们正视"好"的定义。综合分接近也意味着厂商难以靠"偷指标"蒙混:任何单一维度的注水都不足以翻盘,必须真正在多个维度同时提升,这恰是评分系统对"刷分"行为的天然防御。
三、权重敏感性:结论是否依赖取向
评分系统的软肋是权重设定。我们扫描峰值权重 (其余两权重均分),观察冠亚军是否易主。
图2 中两条曲线在 处交叉:当 较小(偏重持久与总量)时 LongLasting 领先;当 较大(偏重第一口浓烈)时 Premium 反超。表格式敏感性也印证这一点——在 、、 三种偏峰权重下,冠军均变为 Premium;仅在 这种"极端偏持久"下 LongLasting 稳守。**这并非模型的缺陷,而是评分系统应有的诚实:它把"你更看重什么"变成了可调旋钮。**把扫描结果画成图2 后,交叉点约在 处。这个"0.35"有清晰的决策含义:当消费者把"第一口浓烈"的权重看得比"占总时长"还重(超过三分之一)时,市场冠军就该是 Premium 而非 LongLasting。厂商据此可以针对不同客群打出差异化定位,而无需篡改模型——模型只是把价值取向参数化,决策权始终在用户手里。
四、三指标对比与雷达
图3 的分组柱显示每款在 上的剖象:IntenseBurst 的 柱接近顶(峰值高)而 柱很短;SlowRelease 反之;LongLasting 与 Premium 在三项上都较饱满,这正是它们综合分领先的结构原因。这种"剖面"读法是评分系统的诊断价值所在:它能立刻指出某款是"偏科天才"还是"全能选手",而不只是一个总分。对厂商而言,偏科提示了明确的改进方向(如给 SlowRelease 提峰值),对消费者则提示了"这款适合谁"。
图4 的雷达图把三指标张成三角,LongLasting(蓝)与 Premium(红)的包络面积最大且几乎重合,直观解释了二者综合分难分伯仲。细看雷达还能读出结构差异:LongLasting 在"持久度"轴顶到头(),Premium 在"峰值"轴顶到头(),二者各据一极;SlowRelease 则在"持久度"轴很高却在"峰值"轴严重塌陷,解释了它为何综合分掉到第三。雷达图因此比单一数字更能暴露"偏科"与否,是评分系统向非专业受众解释时的利器。
五、评分与单指标的相关性
图5 显示综合分与持久度 强正相关(因默认权重中 最大)。这也提醒:若想让评分更"民主",应降低 ;本系统把这一选择交还给用户。但"强正相关"不等于"只由 决定":Standard 的 是 Premium 的 ,综合分却是后者的 而非更低,说明峰值与总量也在托底。若把权重改为等权 ,排名不变但冠亚军差距会拉大到约 ,因为等权削弱了 LongLasting 在持久度上的绝对优势。权重结构本身就是一种产品哲学,图5 把这种哲学对结果的影响可视化了。
六、决策流程与稳健性
图6 给出端到端决策流程:明确取向 → 采集数据(动力学拟合或 panel)→ 计算三指标 → 加权综合 → 敏感性+CI 稳健检验 → 发布可追溯评级。每一步都可被审计,符合赛题"提出评分系统"的要求。
图7 用 top3 款在合成 panel 中的 箱线分布检验稳健性:LongLasting 与 SlowRelease 的中位数与四分位区间高度重叠(印证二者时长难分),Premium 整体偏低一档。由于 LongLasting 在综合分上还叠加了更高的 AUC 归一化,其冠军地位在默认权重下对个体扰动不敏感。把图6 的流程与图7 的稳健性并读,就构成了一个"闭环可审计"的评级系统:任何人都可按流程图复现每一步,再用图7 的扰动检验确认结论不会因个别受试者而翻覆。我们在系统中刻意保留了"敏感性+CI"这一环,因为它正是把"模型说冠军是 X"升级为"我们有 95% 把握说冠军是 X"的关键——没有这环,评分系统只是漂亮的数字游戏。
七、最终推荐
图8 汇总 30 次模拟中每款夺冠次数:LongLasting 15 次、SlowRelease 11 次、Premium 4 次,其余为零。结合权重敏感性,我们给出分取向的最终推荐:
- 取向 A「耐力优先」(权重偏 ):选 LongLasting,最持久且总风味最高;
- 取向 B「浓烈优先」(权重偏 ):选 Premium,峰值最高、总量几乎持平;
- 折中取向:二者皆为优质解,差异在"第一口"与"最后一口"的偏好。
这一推荐既是模型推导的结果,也是评分系统把价值选择权交还用户的体现。落地到产品语言:LongLasting 是"通勤族一颗顶一路"的耐力王,Premium 是"开袋即高潮"的浓烈派,二者没有绝对的优劣,只有适配的场景与人群。我们的评分系统不做"唯一种真理"的宣称,而是给出"在何种价值取向下设何种冠军"的映射表——这种克制反而让推荐更可信,也更符合真实市场中"千人千味"的常识。需要强调的是,本推荐刻意回避了"唯一最佳"的宣称——在权重未定的情况下强行指定冠军,是对消费者选择权的僭越;把"取向—冠军"映射表交出去,才是评分系统的成熟姿态。
结论
三指标加权综合评分系统以透明、可审计的方式回答了"哪款最好":默认取向下 LongLasting 以 综合分夺冠,Premium 以 紧追;冠亚军在峰值权重超过约 时易主,使评分结论的取向依赖性被显式量化。配合合成 panel 的夺冠次数与箱线分布,推荐具备统计稳健性。
附录:核心 Python 实现(可独立运行复现全部数字)
import os, sys
_HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.normpath(os.path.join(_HERE, "..", "..", "..", "tools")))
import gen_mcm2021b as G
D = G.gen_mcm2021b()
print("默认权重", D["weights"], "下综合评分与排名:")
for r in D["types"]:
print(" %-12s nT=%.3f nF=%.3f nA=%.3f S=%.4f rank=%d"
% (r["name"], r["nT"], r["nP"], r["nA"], r["rating"], r["rank"]))
print("权重敏感性(冠军/亚军):")
for k, (a, b) in D["sens"].items():
print(" ", k, "->", a, "/", b)
print("合成 panel 夺冠次数 / %d:" % D["panel_m"])
for r in D["types"]:
print(" %-12s rank1=%d" % (r["name"], D["rank1"][r["name"]]))