Skip to content

第 02 章 · 课程地图:一张表、一条主线、五个部分 ​

这一章要解决什么:在写第一行模型代码之前,先看清"我接下来学的 36 章之间是什么关系"。 这一章没有代码,但值得花 20 分钟读完 —— 它能帮你判断"现在卡住了,应该回头看哪一章"。

本章没有示例代码。

2.1 一句话说清这本书在教什么 ​

把"分数"变成"我敢下判断的证据"。

更具体一点:

❌ "我用随机森林跑出了 R² = 0.96。"
✅ "在按设备划分、5 折分组交叉验证下,随机森林 R² = 0.9580 ± 0.0117;
    它的误差主要来自数据里的测量噪声,加数据收益有限,瓶颈在特征。"

第二句话里的每个限定词,都是这本书要教的东西。

点开:为什么"限定词"才是重点?

看这两句话的差别:

第一句第二句
划分方式没说按设备划分
评估次数一次5 折交叉验证
不确定性没有± 0.0117
结论边界没有瓶颈在特征,加数据无用

第一句话的问题不是"数字错",而是"这句话无法支撑任何决策"。

如果有人问你:"那我该不该再买一批数据?"

  • 看第一句:回答不了;
  • 看第二句:"加数据收益有限" —— 直接回答了。

★ 这本书的核心技能,就是给数字加上正确的限定词。

而所有限定词,都对应一个具体的技术判断:

限定词背后的技术哪一章
"按设备划分"分组划分、避免泄漏09~10
"5 折交叉验证"K 折、分组 CV11~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 ​

你会反复看到的一个动作:

python
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
特征量纲差几个数量级缩放 + Pipeline15
关系明显不是直线决策树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 分组划分

对应的实操:

python
# ❌ 按行随机
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 每章的固定结构 ​

知道这个能省很多时间:

text
┌─ 开头:这一章要解决什么 + 最容易踩的坑
├─ 概念讲解:是什么、为什么、和什么容易混
├─ 可运行示例:代码 + 真实输出 + 逐段解释
├─ 常见坑:报错信息长什么样、为什么、怎么改
├─ 练习:3 道题,答案默认折叠(先自己做)
└─ 面向工程实践:这一章的知识在真实项目里用在哪

每一章都以「下一章」链接结尾,可以顺着读下去。

点开:三种读法,和"先写预期"的习惯

三种读法:

① 顺序读(推荐):主线依赖前面的纪律,跳读容易错过"为什么这么划分"。

② 只读最小路径:第 09~12 + 18 + 21 + 26 章。适合已经在用 sklearn 的人。

③ 当手册查:每章的「常见坑」就是速查表。

★ 一个必须养成的习惯:先写预期,再跑代码。

这本书每一章几乎都有"看起来对但其实错"的写法。

我建议你在跑示例之前,先用注释写下预期:

python
# 我预期:把 soh 留在特征里,R² 会接近 1.0
# 因为:那就是把答案喂给模型了
# 实测:______

为什么这个习惯值钱:

直接跑代码  →  看到 "R² = 1.000000"  →  "哦,真高"  →  翻页
先写预期    →  看到 "R² = 1.000000"  →  "和我预期一样,但为什么?"
              →  去看 coef_  →  发现是 [-0, 1]  →  "它在把 soh 乘 1"
              →  真正理解了什么叫"答案在试卷里"

同一段代码,两种收益。

这本书的每一章都值得这样跑一遍。

2.7 你会犯的错(提前告诉你) ​

这一节列出的错,你几乎一定会犯至少一个。 提前知道,就能早一点认出来。

点开:五个最典型的错误(和它们对应的章节)

① 忘了按设备划分,得到一个漂亮的 0.99

python
# 错
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 留在特征表里

python
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 次尝试里运气最好的一次?
  · 该往哪个方向改进?

★ 先写预期的第三个好处:它逼你说出"为什么"

python
# 我预期:加 max_depth 会让训练 R² 上升、测试 R² 先升后降
# 因为:深度增加 → 拟合能力增强 → 训练集记得更牢(过拟合)

写出"因为"的过程,就是你在调用已有知识。

如果写不出"为什么",说明你还没理解这一步在做什么 —— 那才是真正的收获(比跑出任何数字都值钱)。

★ 一个折中做法:把预期写成能验证的形式

python
# 弱预期(没用):"我觉得这个模型还行"
# 强预期(有用):"我认为按行随机划分的 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",而是"我知道一个模型结果可信不可信、该往哪改进"。

后者才是能带走的能力。


下一章:第 03 章 · 什么是监督学习:从一条直线说起