第 02 章 · 课程地图:一张表、一条主线、五个部分
这一章要解决什么:在写第一行模型代码之前,先看清"我接下来学的 36 章之间是什么关系"。 这一章没有代码,但值得花 20 分钟读完 —— 它能帮你判断"现在卡住了,应该回头看哪一章"。
本章没有示例代码。
2.1 一句话说清这本书在教什么
把"分数"变成"我敢下判断的证据"。
更具体一点:
❌ "我用随机森林跑出了 R² = 0.96。"
✅ "在按设备划分、5 折分组交叉验证下,随机森林 R² = 0.9580 ± 0.0117;
它的误差主要来自数据里的测量噪声,加数据收益有限,瓶颈在特征。"第二句话里的每个限定词,都是这本书要教的东西。
点开:为什么"限定词"才是重点?
看这两句话的差别:
| 第一句 | 第二句 | |
|---|---|---|
| 划分方式 | 没说 | 按设备划分 |
| 评估次数 | 一次 | 5 折交叉验证 |
| 不确定性 | 没有 | ± 0.0117 |
| 结论边界 | 没有 | 瓶颈在特征,加数据无用 |
第一句话的问题不是"数字错",而是"这句话无法支撑任何决策"。
如果有人问你:"那我该不该再买一批数据?"
- 看第一句:回答不了;
- 看第二句:"加数据收益有限" —— 直接回答了。
★ 这本书的核心技能,就是给数字加上正确的限定词。
而所有限定词,都对应一个具体的技术判断:
| 限定词 | 背后的技术 | 哪一章 |
|---|---|---|
| "按设备划分" | 分组划分、避免泄漏 | 09~10 |
| "5 折交叉验证" | K 折、分组 CV | 11~12 |
| "± 0.0117" | 方差、均值 ± 标准差 | 11 |
| "瓶颈在特征" | 学习曲线读法 | 21 |
| "误差来自测量噪声" | 数据性质分析 | 10、21 |
所以这本书的章节不是"算法清单",而是"限定词清单"。
2.2 全书地图
┌───────────────────────────────────────────────────────────────────────┐
│ A 地基(01~08) 环境 → 监督学习框架 → 特征标签 → 线性回归 → 四指标 │
│ 目标:能把一个问题变成 X/y,并算对指标 │
└───────────────────────────────────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ B ★ 划分与泄漏(09~12) 按设备划分 → 划分泄漏 → 交叉验证 → 分组 CV │
│ 目标:一套可信的评估纪律 ← 【全书重心,时间有限也要读这四章】 │
└───────────────────────────────────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ C 模型(13~20) 多特征 → 系数读法 → 缩放/Pipeline → 树 → 森林 → │
│ 偏差方差 → 提升 → 特征重要性 │
│ 目标:说得清每个模型治什么病、要什么代价 │
└───────────────────────────────────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ D 诊断(21~23) 学习曲线 → 正则化 → 四路横评 │
│ 目标:会诊断,不再瞎调参 │
└───────────────────────────────────────────────────────────────────────┘
↓
┌───────────────────────────────────────────────────────────────────────┐
│ E 不确定性与选型(24~27) 高斯过程 → 置信带 → 选型四维 → ❖ 阶段目标 │
│ 目标:能在业务场景里做选型决策 │
└───────────────────────────────────────────────────────────────────────┘★ 标记的是最值得花时间的部分。 第 09~12 章是全书重心。
2.3 五个部分分别在解决什么问题
A 地基(01~08):把问题变成 X / y
你会反复看到的一个动作:
X = df[FEATS] # 特征:一张表
y = df["soh"] # 标签:一列
model.fit(X, y) # 学
model.predict(X) # 用四行,全书都是这四行。 区别只在于 FEATS 里放什么、model 换成什么。
A 部分真正要建立的三个认知:
| 认知 | 为什么重要 |
|---|---|
| X 永远是二维表 | df["cycle"] 会报错,df[["cycle"]] 才对 |
| 同一实体的相邻行不独立 | 决定第 09 章划分方式的对错 |
| 指标有量纲,要翻译成人话 | MAE=0.017 → "平均偏 1.7 个百分点" |
B ★ 划分与泄漏(09~12):全书重心
这四章在回答一个问题:
"我这个分数,是真的还是假的?"
会看到一个惊人的对照:
按行随机划分 → R² = 0.98745
按设备划分 → R² = 0.96428
↑
差 0.02316,全都是虚高为什么:同一支设备的相邻窗口高度相似。按行随机切,会让"相邻两行" 一个进训练、一个进测试 —— 模型只需要"记住邻居",误差就凭空小 30 倍。
这四章给你的不是技术,是纪律:
① 划分要按"实体",不是按行
② 报分数要带方差
③ 只调参不诊断,等于蒙C 模型(13~20):每个模型治什么病
这一部分最容易变成"算法背诵",所以书里换了一个组织方式:
| 问题 | 该用什么 | 哪一章 |
|---|---|---|
| 只有一个特征,想先看看趋势 | 线性回归 | 06 |
| 特征量纲差几个数量级 | 缩放 + Pipeline | 15 |
| 关系明显不是直线 | 决策树 | 16 |
| 单棵树抖动太大 | 随机森林(治方差) | 17~18 |
| 树本身就不够准 | 梯度提升(治偏差) | 19 |
| 想知道哪个特征在起作用 | 特征重要性 | 20 |
★ 第 18 章(偏差与方差)是这一部分的枢纽。
不学它,你会觉得"森林和提升都是'更高级的模型'"; 学了它,你会知道这两个东西治的是完全不同的病:
随机森林:200 棵独立深树取平均 → 治【方差】(抖动)
提升 :400 棵串联浅树学残差 → 治【偏差】(不够准)所以"森林治不了欠拟合" —— 那是偏差问题,得靠提升。
D 诊断(21~23):不再瞎调参
这一部分教你回答"下一步该做什么":
学习曲线两条线都低且靠拢 → 欠拟合 → 换更强的模型
训练高验证低、差距大 → 过拟合 → 正则化 / 减复杂度
验证线还在涨 → 数据不够 → 加数据
验证线已经平了 → 瓶颈在特征 → 别加数据了,去改特征最后两行是全书的转折点:四路模型横评只差 0.005, 说明卡点不在模型。
E 不确定性与选型(24~27):精度不是唯一指标
你会看到一个反直觉的结论:
| 模型 | R² | 能给不确定性吗 |
|---|---|---|
| 线性回归 | 0.95053 | ❌ |
| 随机森林 | 0.96503 | ❌ |
| 梯度提升 | 0.96394 | ❌ |
| 高斯过程 | 0.82687 | ✅ ±σ |
GPR 的 R² 低了 0.14,但第 26 章会推荐它 —— 在特定的场景里。
"这支设备该不该退役?"
↓
随机森林:SOH 预测 0.815。 ← 只给一个数
GPR :SOH 预测 0.808 ± 0.109。 ← 告诉你"我其实不太确定"
↓
后者可以触发【人工复检】,前者只能让你凭感觉决定★ 第 26 章的选型四维:精度 × 速度 × 可解释性 × 不确定性。
2.4 依赖关系(卡住时看这里)
01 环境 ──────────────────────────────────────► 全部
02 地图
03 监督学习框架 ──► 04 特征标签 ──► 06 线性回归 ──► 08 四指标
│
09 按设备划分 ◄──────────────────────────┘
│
10 划分泄漏 ◄── 必须懂 09
│
11 交叉验证 ◄── 必须懂 09
│
12 分组 CV ◄── 必须懂 10、11
│
13 多特征 ◄── 06、08
14 系数读法 ◄── 13
15 缩放/Pipeline ◄── 13
16 决策树 ◄── 08、09
17 随机森林 ◄── 16
18 偏差方差 ◄── 17
19 提升 ◄── 18
20 特征重要性 ◄── 17
21 学习曲线 ◄── 17、12
22 正则化 ◄── 14、21
23 四路横评 ◄── 08~22 全部
24 高斯过程 ◄── 15、06
25 置信带 ◄── 24
26 选型 ◄── 23、25
27 ❖ 阶段目标 ◄── 全部图怎么用:某一章看不懂时,往左找箭头来源。
例:第 18 章(偏差方差)看不懂
→ 它依赖 17(随机森林)
→ 17 依赖 16(决策树)
→ 16 依赖 08(指标)、09(划分)
→ 回看这四章点开:四个"必读重点"的详细说明
图里标 ★ 的四个位置,是全书最容易出错、收益也最大的地方:
① 第 09~10 章 · 划分与泄漏
- 不读的后果:你后面所有的分数都不可信,而且你不会知道;
- 读完的收益:你能一眼看穿"0.99 的分数"是怎么回事。
② 第 18 章 · 偏差与方差
- 不读的后果:你以为"森林和提升只是两个可选模型",会瞎试;
- 读完的收益:你知道该用哪个、为什么,以及"森林为什么治不了欠拟合"。
③ 第 21 章 · 学习曲线
- 不读的后果:模型效果不好时只会调参(而且经常越调越差);
- 读完的收益:你能判断"该加数据、该换模型、还是该改特征"。
④ 第 26 章 · 模型选型
- 不读的后果:你只会挑 R² 最高的,然后在生产环境里踩坑;
- 读完的收益:你会先问"这个场景要的是什么"。
时间有限时的最小路径:
09 → 10 → 11 → 12 (评估纪律)
18 (模型选择的理论依据)
21 → 26 (诊断与选型)其余章节遇到需要时再回来查。
2.5 三条纪律(贯穿全书,随时回看)
这三条会反复出现。 现在先记住结论,后面每一部分都会给你证据。
纪律一:按"实体"划分,不按行划分
同一支设备的相邻窗口高度相似(soh 只差 0.0003)
↓
按行随机划分 → 邻居跨进测试集 → 模型"背答案"
↓
R² 虚高 0.023(0.987 vs 0.964)
↓
正确做法:按 cell_id 分组划分对应的实操:
# ❌ 按行随机
train_test_split(X, y, test_size=0.2, random_state=42)
# ✅ 按设备分组
GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42).split(X, y, groups=df["cell_id"])看到 0.99 的分数,第一反应是"哪里泄漏了"。
纪律二:报分数要带方差
❌ R² = 0.96
✅ R² = 0.9580 ± 0.0117(5 折分组交叉验证)为什么:单次划分的分差可达 0.036(0.9734 vs 0.9377)—— "抽到哪 12 支设备算你运气"。
一次结果不是结论,是抽样。
纪律三:精度不是唯一指标
离线周报 → 精度优先 → 森林 / 提升
实时看板 → 速度优先 → 线性 / 小树
退役决策 → 不确定性优先 → 高斯过程同一份数据,三个场景,三个答案。 没有"最好的模型"。
点开:这三条纪律其实是一条
它们都在回答同一个问题:
"我的这个数字,能支撑什么决策?"
纪律一(划分) → 数字是真的吗?
纪律二(方差) → 数字稳定吗?
纪律三(多指标) → 数字够用吗?★ 三个问题问完,你才知道这个数字能不能拿去做决定。
这也是这本书和"调包教程"的根本区别:
| 调包教程 | 这本书 | |
|---|---|---|
| 目标 | 把分数调高 | 让分数可信 |
| 遇到低分 | 换模型、调参数 | 先问"为什么低" |
| 遇到高分 | 高兴 | 先怀疑泄漏 |
| 交付物 | 一个数字 | 一个带限定词的结论 |
"遇到高分先怀疑"这条,是全书的性格。
2.6 每章的固定结构
知道这个能省很多时间:
┌─ 开头:这一章要解决什么 + 最容易踩的坑
├─ 概念讲解:是什么、为什么、和什么容易混
├─ 可运行示例:代码 + 真实输出 + 逐段解释
├─ 常见坑:报错信息长什么样、为什么、怎么改
├─ 练习:3 道题,答案默认折叠(先自己做)
└─ 面向工程实践:这一章的知识在真实项目里用在哪每一章都以「下一章」链接结尾,可以顺着读下去。
点开:三种读法,和"先写预期"的习惯
三种读法:
① 顺序读(推荐):主线依赖前面的纪律,跳读容易错过"为什么这么划分"。
② 只读最小路径:第 09~12 + 18 + 21 + 26 章。适合已经在用 sklearn 的人。
③ 当手册查:每章的「常见坑」就是速查表。
★ 一个必须养成的习惯:先写预期,再跑代码。
这本书每一章几乎都有"看起来对但其实错"的写法。
我建议你在跑示例之前,先用注释写下预期:
# 我预期:把 soh 留在特征里,R² 会接近 1.0
# 因为:那就是把答案喂给模型了
# 实测:______为什么这个习惯值钱:
直接跑代码 → 看到 "R² = 1.000000" → "哦,真高" → 翻页
先写预期 → 看到 "R² = 1.000000" → "和我预期一样,但为什么?"
→ 去看 coef_ → 发现是 [-0, 1] → "它在把 soh 乘 1"
→ 真正理解了什么叫"答案在试卷里"同一段代码,两种收益。
这本书的每一章都值得这样跑一遍。
2.7 你会犯的错(提前告诉你)
这一节列出的错,你几乎一定会犯至少一个。 提前知道,就能早一点认出来。
点开:五个最典型的错误(和它们对应的章节)
① 忘了按设备划分,得到一个漂亮的 0.99
# 错
train_test_split(X, y, test_size=0.2, random_state=42)
# 对
GroupShuffleSplit(...).split(X, y, groups=df["cell_id"])识别信号:R² > 0.98。对应第 09~10 章。
② 把 soh 留在特征表里
FEATS = ["cycle", "soh"] # ❌ 标签泄漏识别信号:R² 正好 1.000000 或极接近。对应第 04 章。
③ 把"特征重要性"当成因果
"coulombic_eff 重要性 0.93,所以提高库仑效率就能提高健康度"
↑ 这个推理是错的对应第 20 章。
④ 拿着单次划分的分数当结论
"我的模型 R² = 0.9734" ← 这一次恰好抽到好划分
"换个 random_state:0.9377" ← 差 0.036对应第 11 章。
⑤ 模型效果不好就开始调参
"R² 只有 0.92,我把 n_estimators 从 200 调到 2000 试试"
↓
(没用 —— 学习曲线显示验证线早就平了,瓶颈在特征)对应第 21 章。
★ 这五个错误有一个共同点
① 划分泄漏 → 分数是假的
② 标签泄漏 → 分数是假的
③ 因果误判 → 结论是假的
④ 单次结果 → 结论不稳定
⑤ 盲目调参 → 方向是错的前两个"分数是假的",后三个"结论站不住"。
这本书的存在意义,就是让你能自己认出这五种情况。
2.8 一个提醒:这本书不教什么
为了不让期待落空,明确说一下:
| 不教 | 为什么 |
|---|---|
| 深度学习 / 神经网络 | 这本书讲表格数据的经典机器学习,神经网络不是必需品 |
| 算法数学推导 | 重"判断力"轻"证明";需要时会给公式,但不做推导 |
| 特征工程 | 这是下一本书的主题(见下) |
| 分类问题 | 这本书全程是回归(预测一个连续值);但划分、泄漏、交叉验证的纪律完全通用 |
| 可视化美化 | 画图是为了诊断,不是为了好看 |
点开:为什么"特征工程"是另一本书?这本书的结尾会指给你
第 27 章(阶段目标)跑完四路横评后,会得到一个尴尬的结论:
线性回归 R² = 0.95053
随机森林 R² = 0.96503
梯度提升 R² = 0.96394
↑
四个模型差 0.015,而且换更强的模型几乎没收益这个结论的含义是:
卡点不在模型,在特征。
而"怎么做出更好的特征"是另一个完整的主题:
- 从原始数据构造新特征(滑动统计量、变化率、滞后项);
- 特征选择与构造的取舍;
- 领域知识如何变成特征。
那是下一本书的内容。 这本书会在第 27 章明确把接力棒交出去, 并且告诉你"为什么现在该做特征,而不是继续换模型"。
★ 先学这本书的理由
如果先学特征工程,你会做出很多特征,但不知道它们有没有用
↓
因为"有用"要靠可信的评估才能判断
↓
而可信的评估,正是这本书教的顺序不能反。 先学会判断,再学会创造。
2.9 本章检查清单
读完这一章,请逐条确认(勾选状态会存在你自己的浏览器里):
已勾选 0 / 0 项
本章练习
本章没有编程练习,但有三个值得花 10 分钟想清楚的问题:
思考题 1:为什么"分数高"反而值得警惕?
请用你自己的话说清:一个 R² = 0.99 的结果,在什么情况下是好消息,什么情况下是坏消息?
参考答案
关键判据:这个模型有没有可能"看到过答案"。
是好消息的情况:
- 数据里同一个实体只有一行(没有分组结构)→ 不存在"邻居泄漏";
- 目标本身几乎完全由特征决定(比如用"半径"预测"圆面积");
- 你已经排查过泄漏(特征里没有标签的计算来源、划分是按实体做的)。
是坏消息的情况:
- 数据有分组结构(同一实体多行),而你按行随机划分了;
- 标签混进了特征(比如用
capacity预测soh,而soh = capacity / 额定); - 特征里有未来信息(用"整个周期的均值"预测"第 100 圈的某量");
- 样本量远小于特征数(可能过拟合到记住每个样本)。
★ 一个可操作的判断流程
看到 R² > 0.98
↓
① 把标签从特征里删掉,重跑 → 分数掉了吗?(掉很多 → 之前有标签泄漏)
↓
② 换成"按实体划分",重跑 → 分数掉了吗?(掉很多 → 之前有划分泄漏)
↓
③ 用不同的 random_state 跑 5 次,看方差 → 波动大吗?
↓
④ 三关都过了,这个 0.99 才值得高兴为什么这个思路能救命
真实的教训:一个"预测设备寿命"的模型,离线 R² = 0.998,上线后完全不可用。 排查发现:特征里有一列是"维修记录数",而维修记录是在设备已经坏掉之后才产生的。
这个模型在离线评估时"看到了未来"。
★ 核心认知
模型不会告诉你它作弊了 —— 分数高的时候,正是最需要检查的时候。
这本书从头到尾都在训练这个反应。
思考题 2:为什么"先写预期"比"多跑几次"更有用?
有人说:"我多跑几个模型,看哪个分高不就行了,为什么要先猜?"
请说出这个想法的问题。
参考答案
这个想法的问题:它把"探索"变成了"撞运气"。
具体有两个代价:
代价一:你会错过"反常"
不写预期:R² = 0.965,看下一个模型
写预期 :"我猜大约 0.96" → 0.965 → 符合预期,跳过
"我猜大约 0.96" → 0.999 → 【!为什么?】 → 发现泄漏反常的结果才是信息量最大的地方 —— 但如果心里没有"正常"的标准,反常就不存在。
代价二:你会陷入"瞎试"
"这个模型 0.96,那个 0.97,再试试第三个……"
↓
试了 20 个模型,得到一个 0.975 的结果
↓
但你不知道:
· 这 0.975 是真的,还是 20 次尝试里运气最好的一次?
· 该往哪个方向改进?★ 先写预期的第三个好处:它逼你说出"为什么"
# 我预期:加 max_depth 会让训练 R² 上升、测试 R² 先升后降
# 因为:深度增加 → 拟合能力增强 → 训练集记得更牢(过拟合)写出"因为"的过程,就是你在调用已有知识。
如果写不出"为什么",说明你还没理解这一步在做什么 —— 那才是真正的收获(比跑出任何数字都值钱)。
★ 一个折中做法:把预期写成能验证的形式
# 弱预期(没用):"我觉得这个模型还行"
# 强预期(有用):"我认为按行随机划分的 R² 会比按设备划分高 0.02 左右"强预期的好处:跑完能直接对比,对错分明。 猜对了说明理解到位,猜错了说明有个认知漏洞需要补。
这本书里每个"看起来对但其实错"的地方,都是给你练这个的。
思考题 3:把"三条纪律"翻译成你自己的领域
书里用的是"设备退化"场景。请把三条纪律对应到你熟悉的某个场景 (比如用户流失预测、房价预测、销量预测、成绩预测),各举一个可能违反的例子。
参考答案
以"用户流失预测"为例(你换成自己的领域即可):
纪律一:按"实体"划分,不按行划分
❌ 错误做法:把用户的所有月度记录打散,随机划分
问题:同一个用户 1 月的记录进训练、2 月的进测试
→ 模型记住了"这个用户的行为模式" → 分数虚高
✅ 正确做法:按 user_id 划分 —— 某些用户整个进训练,某些整个进测试
问题变成:"对没见过的用户,我能不能预测他会流失"
这才是真实上线时的处境纪律二:报分数要带方差
❌ "模型 AUC = 0.85"
✅ "模型 AUC = 0.85 ± 0.02(5 折分组交叉验证)"
为什么:不同折的差异可能很大(0.88 vs 0.82),
只报一个数,别人无法判断这个结果稳不稳纪律三:精度不是唯一指标
场景 A:每周给运营一份"高风险用户名单" → 精度优先
场景 B:实时给 App 弹挽留券 → 速度优先(100 ms 内必须出结果)
场景 C:决定要不要给用户打电话 → 不确定性优先
(宁可只对"我很确定"的用户操作,也不要打扰一堆边缘用户)★ 一个通用检查表(换任何领域都能用)
| 问题 | 如果答案是"是",就要警惕 |
|---|---|
| 同一个实体在数据里出现多次吗? | 划分必须按实体 |
| 特征里有没有"结果发生后才产生的信息"? | 有 = 时间穿越式泄漏 |
| 标签是不是由某个特征算出来的? | 是 = 标签泄漏,那个特征不能当特征 |
| 不同子群的样本量差很多吗? | 分数可能被大的子群主导 |
| 业务真正在意的是"准"还是"及时"? | 决定该看哪个指标 |
★ 为什么这个练习值得做
因为"按实体划分"这个纪律,在书里是用"设备窗口"讲的, 但它真正的适用范围远比设备广:
同一实体多行数据,而且行之间相关
├─ 用户 × 多个月份
├─ 患者 × 多次就诊
├─ 门店 × 多个星期
├─ 设备 × 多个时间窗口 ← 本书的场景
└─ 学生 × 多次考试
只要你的数据长这样,"不能按行随机划分"就成立。识别出"我的数据有没有这种结构",比记住任何一个 API 都重要。
面向工程实践:地图的价值在于"知道自己在哪里"
真实项目里,最贵的错误不是"用错模型",而是"用错方法却不知道"。
① 一个真实场景:模型效果变差了
上线三个月,AUC 从 0.85 掉到 0.78
↓
如果只会调参:
重训 → 调超参 → 换模型 → 还是 0.78 (几周过去了)
↓
如果懂"地图":
先问"是模型退化,还是数据变了?"
→ 检查特征分布(数据漂移)
→ 发现上游某个传感器的零点偏了
→ 修数据,不碰模型这正是本书第 21 章(学习曲线)和第 26 章(选型)教的能力 —— 先定位问题在哪一层,再动手。
② "知道自己在哪一层"是所有工程能力的共性
数据库慢:
不懂的人 → 加索引、加机器、换数据库 (瞎试)
懂的人 → 先 EXPLAIN,看是锁、是缺索引、还是查询写错了
模型不准:
不懂的人 → 换模型、调参、加数据 (瞎试)
懂的人 → 先看学习曲线,判断是偏差、方差、还是数据问题★ 这本书教的"分层诊断",是一个可以迁移到任何技术领域的元能力。
③ 一个实操建议:给你的项目画一张图
学完这本书后,试着给你自己的项目画一张类似第 2.2 节的地图:
我的数据有什么结构?(分组?时间序列?)
我的评估可信吗?(划分方式、有没有方差)
我的瓶颈在哪一层?(数据 / 特征 / 模型 / 部署)能画出这张图,说明你真的理解了 —— 而不是记住了一堆 API。
这也是这本书希望留下的东西:
不是"我会用 sklearn",而是"我知道一个模型结果可信不可信、该往哪改进"。
后者才是能带走的能力。