📈 第8章 启发法
📄 一句话概括

最优化要求把一切都量化,可垃圾量不准;纯直觉又说不清理由。启发法就在这两者中间。 快省树:按固定顺序问几个是/否问题,前面的问题就能把选项砍掉大半,后面的问题根本不用问。 十条街实测:快省树判对 9 条,四变量加权打分判对 8 条。省掉的是成本,不一定是准确率。

📝 本章和前面几章的关系

上一篇把「精确计量」这条路堵死了。这一篇给另一条路:不量化全部,只按顺序问几个便宜的问题。 「快省树」这个名字来自 Gigerenzer 的研究,书里用它处理垃圾清扫的调度问题。 这里的规则与数据是本节设定的。

一、两端都走不通

一端是最优化:把因素全量化、加权、求解。可垃圾量都量不准,权重更没依据,这条路走不通。 另一端是纯直觉:老师傅扫了二十年,说得出「今天该去东街」,但说不出为什么,也没法教给别人。 启发法在中间:用少量线索、按固定顺序问几个是/否问题,快速给出判断。

它的目标不是「最优」,是「够好,而且便宜、透明、能复制」。

二、快省树长什么样

问题一:有成堆的大件垃圾吗?是 → 立刻扫。 问题二:位于人流高峰区吗?是 → 扫。 问题三:距上次清扫超过 7 天吗?是 → 扫;否 → 不扫。

三个问题、三个分支,画出来向右倒——这就是「快省树」的名字来源:快(问得少)、省(线索少)、 树(有分支)。 关键在顺序:第一个问题最便宜、最能一票定案,就先问它。顺序错了,树就不省了。

三、拿十条街试一遍

街道 大件 高峰区 距上次(天) 专家判定
S1 是 是 3 该扫
S2 是 否 5 该扫
S3 否 是 2 该扫
S4 否 否 9 该扫
S5 否 否 3 不扫
S6 是 否 8 该扫
S7 否 是 5 该扫
S8 否 否 12 该扫
S9 否 否 4 不扫
S10 否 是 1 不扫

最后一列是老师傅给的判定,当作标准答案。 快省树判对 9 条。错的是 S10:在高峰区,可刚扫过一天、也没大件垃圾,规则还是判了「该扫」。 错得也有道理:这条规则只认三个线索,S10 的情况需要第四个线索(上次清扫时间)才能纠正。

四、和全信息模型比一比

再建一个「把所有线索都用上」的模型:大件 2 分、高峰 1 分、天数每天 0.3 分、被上报每次 0.5 分, 3.5 分以上判该扫。 它判对 8 条,比快省树少一条。 错的是 S4 和 S7:都是「没大件、不在高峰区,但已经很久没扫」,分数差一点没到线。 原因是加权分把「天数」摊薄了:9 天只值 2.7 分,抵不过一个「大件」。

这不是说加权模型不好,是说它在样本小、线索弱的时候,容易把噪声也当成信号。

五、什么时候不该用启发法

第一,代价极高的时候。手术方案、桥梁承重,这种场合该算清楚,不能靠三个问题。 第二,线索容易被操纵的时候。规则公开,人就照着规则刷分(8.2 讲过)。 第三,数据充足且稳定的时候。有几千条历史记录、变量都测得住,那还是老老实实建模型。

启发法的适用区间很明确:信息少、时间紧、错一次的代价还能承受。

六、动手 Demo:启发法:快省树

十个街区、三个线索,快省树按固定顺序问下去。 再拿一个四变量加权打分模型对照,看两种方法各判对几条。

STREET = [("S1", 1, 1, 3, 2, 1), ("S2", 1, 0, 5, 1, 1),
          ("S3", 0, 1, 2, 4, 1), ("S4", 0, 0, 9, 0, 1),
          ("S5", 0, 0, 3, 0, 0), ("S6", 1, 0, 8, 3, 1),
          ("S7", 0, 1, 5, 1, 1), ("S8", 0, 0, 12, 0, 1),
          ("S9", 0, 0, 4, 1, 0), ("S10", 0, 1, 1, 0, 0)]

def tree(big, peak, days, rep):
    if big:
        return 1
    if peak:
        return 1
    if days > 7:
        return 1
    return 0

def weighted(big, peak, days, rep):
    return 1 if 2 * big + 1 * peak + 0.3 * days + 0.5 * rep >= 3.5 else 0

ok_t = ok_w = 0
for nm, big, peak, days, rep, lab in STREET:
    a = tree(big, peak, days, rep)
    b = weighted(big, peak, days, rep)
    ok_t += (a == lab)
    ok_w += (b == lab)
    if a != lab:
        print("快省树判错:%s" % nm)
    if b != lab:
        print("加权模型判错:%s" % nm)
print()
print("快省树 %d/10,加权模型 %d/10" % (ok_t, ok_w))

实跑输出:

--------------------------------------------------------------------
启发法:快省树
--------------------------------------------------------------------

  ① 从直觉到最优化之间有一座桥
  --------------------------------------------------------------------
  最优化要求你把所有因素都量化、加权、求解。可垃圾这块,量都量不准,最优化无从下手。
  纯直觉又太随意:老工人扫了二十年,说得出「这条街脏」,说不出为什么。
  启发法就在这两者之间:用少量线索、按固定顺序问几个是/否问题,快速给出判断。

  ② 快省树长什么样
  --------------------------------------------------------------------
  问题一:有成堆的大件垃圾吗?是 → 立刻扫。
  问题二:位于人流高峰区吗?是 → 扫。
  问题三:距上次清扫超过 7 天吗?是 → 扫;否 → 不扫。
  三个问题、三个分支,画出来像一棵向右倒的树——这就是「快省树」。

  ③ 拿十条街试一遍
  --------------------------------------------------------------------

| 街道 | 大件 | 高峰区 | 距上次(天) | 专家判定该扫 |
|---|:---:|:---:|---:|:---:|
| S1 | 是 | 是 | 3 | 是 |
| S2 | 是 | 否 | 5 | 是 |
| S3 | 否 | 是 | 2 | 是 |
| S4 | 否 | 否 | 9 | 是 |
| S5 | 否 | 否 | 3 | 否 |
| S6 | 是 | 否 | 8 | 是 |
| S7 | 否 | 是 | 5 | 是 |
| S8 | 否 | 否 | 12 | 是 |
| S9 | 否 | 否 | 4 | 否 |
| S10 | 否 | 是 | 1 | 否 |

  最后一列是老师傅给的答案,当成「标准答案」用来检验规则。

  ④ 快省树判对了几条
  --------------------------------------------------------------------
  快省树判对 9/10 条。
  错的那条是 S10:它在高峰区,但刚扫过一天、也没大件垃圾,规则却判了「该扫」。

  ⑤ 全信息模型判对了几条
  --------------------------------------------------------------------
  加权打分(大件 2 分、高峰 1 分、天数每天 0.3 分、被上报每次 0.5 分,
  3.5 分以上判该扫)判对 8/10 条。
  它错的是 S4 和 S7:两条都是「没大件、不在高峰区,但已经 9 天和 5 天没扫」,
  加权分只有 2.7 和 3.0,差一点没到 3.5。
  ! 三个是/否问题判对 9 条,四个变量加权判对 8 条。
  启发法省掉的是成本,不是准确率——有时候连准确率都省不掉。

快省树只用了三个线索,加权模型用了四个(还多一个「被上报次数」),结果快省树多对一条。 别把这条结论扩大化:十个样本说明不了「简单永远更好」,它只说明「简单不一定更差」。 要下强结论得用大样本。

30 秒实验

  1. 把第三个问题的阈值从 7 天改成 5 天,快省树会多判错还是少判错?
  2. 如果 S10 那条规则加一句「刚扫过一天就不扫」,它会变成一棵四问的树——还值不值?
  3. 想一想:这棵树的三个问题顺序能不能换?换成「先问天数」会怎样?

常见误区

  1. 把启发法当偷懒:它是有意识的取舍,前提是你知道砍掉了什么。
  2. 顺序乱排:最便宜、最能定案的问题要放前面,否则树就不省了。
  3. 在代价极高的场合用:手术、承重、法律判决,这类事不能靠三个是/否。
  4. 小样本就宣布「简单更好」:十个案例撑不起这种结论,只能说「没更差」。
自测三问(点开对答案) 1. 快省树的「快」和「省」分别指什么? —— 快是问得少(多数情况一两个问题就定案),省是线索少(只用能得到的信息)。 2. 为什么问题顺序很关键? —— 放在前面的问题如果一票定案,后面的问题就不用问了。顺序错了,等于白问。 3. 什么场合不该用启发法? —— 错一次代价极高、线索容易被操纵、数据又充足稳定的场合。

快省树只是一个例子。下一篇把它推广成「固定模式」,看它怎么用来评估工作成效。

相关笔记