解题路线
题目要求:只用客观数值参数,设计可复算的排名算法,评出"世界 Top 10 过山车", 与线上榜单对比,并设计一个给游客推荐过山车的 App。数据就是练习用的那份 1744 台 RCDB 快照。
这份题解按实际解题顺序走:数据检查 → 回归验证 → 评分模型 → 归一化对比 → 敏感性分析 → 与线上榜单对比。 每一步都把图画出来,并写明这一步做了哪些会影响结论的决定:用哪些变量、缺失值怎么办、 用哪种归一化、轴怎么排。练习里"同一份数据画出两张相反的拉票图",根源都在这些决定里。
数据检查:缺失、错误与冗余
拿到数据先检查,再建模。两件事:哪些字段缺数据,哪些字段互相重复。
每个字段缺了多少
高度、极速、长度、翻滚数全齐(这份数据已预筛过),但落差缺 78%、最大倾角缺 83%、时长缺 41%。缺 8 成的变量,填补出来也基本是编的——第一个决定就在这里。
谁跟谁在重复计分
高度和落差相关 0.952——物理上它们本来就是一回事(车爬多高就摔多深)。同时给两者打分,等于让同一个优点投两次票。
① 高度 ↔ 落差二选一:留高度(缺 0%),弃落差(缺 78%)——评委原话就点过"height 和 drop 高度相关,应剔除冗余";
② 最大倾角缺 83%,直接弃用;
③ 时长缺 41%,用"长度 ÷ 极速"回归推补——但 $R^2$ 只有 0.29,推补值全程带 * 号示人,不装作真数据;
④ 只排运营中且核心字段齐全的 1207 台——"世界最佳"起码得是买票能坐到的。
顺带一提:这份数据还有错别字级的问题(Thorpe Park 的 Colossus,乐园一栏填成了所在城市 Chertsey)。真实数据总是脏的,论文里交代清楚比装没看见强。
R²=0.29 长什么样:时长推补的可靠程度
竖着看任何一个位置:全速时间差不多的车,实测时长上下能差 100 秒以上。 橙色带是回归预测的典型误差(±36 秒);对照灰色水平线——不看任何参数、直接猜全库平均 108 秒,典型误差也就 ±43 秒。 回归只把误差从 43 秒缩到 36 秒,这就是 R²=0.29 的全部含义:比瞎猜好,但好得有限。 保留它的理由:大方向没错(又长又慢的车时长确实更长,28 秒和 240 秒不会认错), 而且敏感性分析显示时长权重 ±30% 只换 0–1 席——弱推补翻不动榜单。带 * 交代之后,可以用。
不同 R² 长什么样:五档对照
R²=0.1 时点云几乎看不出方向;0.3(本课时长推补的档位)能看出趋势但预测个体没什么把握; 0.5 是"有用但粗";0.8(本课高度-速度的档位)已经贴得很近;0.95 基本严丝合缝。 经验读法:R² 决定"用 x 猜 y 能猜多准",波动带宽度 ∝ √(1−R²)—— R²=0.3 的剩余波动是 R²=0.95 的约 3.7 倍。
高度和速度:回归与残差图
练习的第一题:过山车越高就越快吗?下面四张图按顺序回答: 线性拟合的表现、它的残差暴露出的问题、换根号模型后的结果、以及新模型的残差。
① 线性拟合
散点贴着直线走,$R^2$ 不低。但这张图回答不了"模型形状选对了吗"。
② 线性模型的残差
矮车段整体偏负、中段偏正、250 ft 以上平均差 −15 mph。残差有系统模式,说明数据的真实关系是弯的,直线模型形状选错了——这是散点图上看不出来的。
③ 根号模型 $v=a\sqrt{h}+b$
能量守恒 $v=\sqrt{2gh}$ 换算成 mph/ft 后理论系数 5.47,回归拟出 5.43;负截距就是摩擦损耗。模型形状不是猜的,是物理给的。
④ 根号模型的残差
分箱均值回到 ±4 mph 内,系统模式消失。剩下的离群点全是弹射型过山车——加速靠电磁弹射而不靠落差,属于另一类机制,不能当噪声删掉。
评分指标与权重
五个指标的权重和理由如下。权重没有客观解——这是第三课讲过的问题——能做的是把数值和理由都写明,接受检验:
| 指标 | 权重 | 为什么 |
|---|---|---|
| 极速 | 28% | "快不快"是多数人对过山车的第一直觉 |
| 时长 | 24% | 28 秒的世界纪录和 4 分钟的旅程,体验完全不同(推补值降权见敏感性) |
| 高度 | 22% | 落差的代表(两者 0.952 相关,只留一个) |
| 长度 | 16% | 轨道越长,内容越多 |
| 翻滚数 | 10% | 刺激的另一个维度,但不是人人都爱 |
合计:刺激类(极速+高度+翻滚)60%,体验类(时长+长度)40%。 不同意这组数字的人,改这张表重跑就能得到自己的榜单——可复算指的就是这个。
归一化:百分位和 min-max 给出两张不同的榜单
权重定了还不够:极速的单位是 mph、长度是英尺,相加之前必须先归一化成无量纲的分数。两种常用做法:
- min-max:把全库最小~最大线性压到 0~1。它保留数值差距——456 ft 的 Kingda Ka 在高度这一项上远超其他车。
- 百分位:这个指标上超过了全库百分之几的车。它抹平数值差距——456 ft 和 250 ft 都在前 1%,得分几乎相同。
两种做法都常见、都没有算错。下面是同一组权重下它们各自的 Top 12:
同一份数据、同一组权重,两张 Top 10 只重合 1 台
百分位榜(左)偏向六七个翻滚、各项都不差的机型;min-max 榜(右)几乎全是速度和高度的纪录保持者。 Kingda Ka:min-max 第 7,百分位第 321——456 ft 的优势被百分位抹平,28 秒的时长却被百分位放大成硬伤。 两榜都进前十的只有 Steel Dragon 2000。 作为对照:同一组权重下把加权求和换成 TOPSIS,Top 10 只变 1 台。对榜单影响最大的不是算法,是归一化。
交互排名器:自选权重和归一化
原题第三问要求设计一个给游客推荐过山车的 App,这里直接做成网页交互: 1207 台运营中的过山车,权重和归一化都是可调控件,改动即时重排。
时长带 * 的是回归推补值(缺失 41%),不是实测。
敏感性分析
权重是人定的,要检验定偏一点会不会翻盘:每个权重单独 ±30%(其余按比例回补), 数一数百分位榜 Top 10 换掉几台车。
单个权重 ±30% 后,Top 10 换人数
极速、高度、时长、长度怎么扰动都最多换 1 台——但翻滚数权重只有 10%,下调 30% 就换掉 5 台。 原因:全库过半数的车翻滚数是 0,百分位在"0 个"和"1 个"之间有一个巨大的台阶, Top 10 的构成实际主要由这 10% 的权重控制。发现之后应该回去改模型——给翻滚数换平滑的记分方式, 或分成"翻滚榜/疾速榜"两张榜单——而不是下结论说模型稳健。 敏感性分析的作用就是定位这种最容易出错的位置。
Bootstrap:从"一次抽样"讲起
第一步,先看清"抽样"这件事本身。把手里的 1744 台当作全体。假设你只有力气调查 50 台: 随机挑 50 台,拟合 v = a√h + b,得到一个系数。问题是——换一批 50 台,数字就不一样。 下面可以反复做这件事,每做一次画一条线:
还没抽过。
每条蓝线是"只看 50 台"的一个平行世界,线束的宽度就是 50 台抽样的运气成分。 我们手里真有全体 1744 台,所以这个宽度是真实的抽样抖动——记住它有多宽。
现实的处境难得多:你通常只有一份样本,没有全体——上面那个动作根本没法做。 假设手里只有一份 50 台的数据,怎么估计自己那条线的运气成分?1979 年统计学家 Efron 的主意: 既然样本是全体的缩影,就把样本自己当作全体,从中"有放回"地重抽同样多的样本 (有的车被抽到两三次,有的一次都没有),重算一遍;重复几百次。 用数据自己评估自己的不确定度,像拔着自己的鞋带把自己提起来——这就是 bootstrap(拔靴带)这个名字的出处。
…
深蓝点是你唯一拥有的 50 台样本(灰点只是背景,这一步的计算完全看不见它们); 每条橙线是一次有放回重抽的拟合。对照上一块:bootstrap 只用这 50 台"自举"出来的线束宽度, 和真实抽样抖动的宽度非常接近——这就是它敢被使用的理由, 也是论文里每个系数后面 [区间] 的来历(按"车"重抽 200 次取中间 95%)。 点「换一份 50 台样本」再试几份,宽度依然对得上。
雷达图:轴顺序和归一化怎样改变图形
排名有争议时,常见做法是画雷达图"让读者自己比较"。但雷达图的形状取决于两个设置: 轴的排列顺序,和归一化方式。选三台风格极端的车演示:Kingda Ka(最高最快,但全程 28 秒)、 Steel Dragon 2000(轨道 8133 ft、全程 4 分钟)、 Colossus(又矮又慢,但 10 个翻滚)。 前三张图数据完全相同,只改这两个设置。
雷达图 α · min-max 归一化
Steel Dragon 看起来最全面,Colossus 除了翻滚一项几乎贴在中心。多边形面积比 Kingda Ka : Steel Dragon ≈ 0.66 : 1。
雷达图 β · 同一数据,只换轴顺序
数值一个没改,面积比变成 0.44 : 1。雷达图的多边形面积由相邻两轴数值的乘积决定,所以轴的排列顺序直接改变面积对比——而读者通常意识不到顺序是可选的。
雷达图 γ · 同一数据,只换归一化(百分位)
Colossus 的图形从贴近中心变成接近满格——它各项数值虽小,但在全库里都处在中游以上。和排名一样,图形也随归一化方式翻转。
对照 · 分指标条形图
每个指标各画各的,不合成总分、不比面积,三台车强在哪弱在哪一目了然。要比总分,就用上面的排名模型,把权重写明。
与线上榜单对比
原题要求把自己的榜单和线上榜单对比。我们两种归一化下的 Top 10:
百分位榜 Top 10 (按名次归一)
min-max 榜 Top 10 (按数值归一)
对照游乐业界投票的 Golden Ticket Awards 2018:钢质前三是 Fury 325、Millennium Force、Steel Vengeance,木质第一是 Phoenix。 我们的 min-max 榜命中了 Fury 325 和 Millennium Force,百分位榜命中了 Steel Vengeance—— 两种归一化各命中一部分。
而 Phoenix(78 ft 高、45 mph 的 1985 年木质车)在我们的百分位榜排第 425、min-max 榜排第 455。 它年年拿奖靠的是失重感和顺滑度——数据库里没有这两列。 数据里没有的维度,模型算不出来;在论文的对比一节写明这个边界,是必要的结论,不是示弱。
注:数据快照晚于 2018 年比赛(含 2019 年开业的 Yukon Striker),课堂演示不影响;真参赛时要用题目给的数据。
论文作图检查清单
- 一张图回答一个问题。说不出这张图回答什么问题,就不要放。
- 拟合必配残差图。残差的系统模式是模型形状错误的直接证据,散点加拟合线看不出来。
- 归一化方式写进图注。min-max、百分位还是 z-score,结论会随它变,读者需要知道。
- 缺失和推补要标记。推补值带 * 号,缺失率写进正文,不把推补值画成实测值。
- 慎用雷达图。轴顺序和归一化都会改变图形;分指标条形图通常更清楚。
- 敏感性分析画出来。它的任务是定位模型最可能出错的地方,不是证明稳健。
- 离群点先解释再处理。弹射车、14 个翻滚的世界纪录都是真实信息,不加解释就删除会丢掉最有信息量的样本。
这份清单逐条对应评委 commentary 对高分论文的要求。 完整数据和本页所有图的数据文件:rcdb_strict.csv · class05-data.js