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

评估「这个街区清干净了没有」,也可以用固定模式:三条规则,满足两条就算。 十个街区实测:三票制判对 8 条,五变量加权模型判对 9 条——复杂模型多对一条。 但复杂模型有一个可调的阈值:从 40 拨到 60,成绩在 7 到 9 之间摆。三票制没有旋钮。

📝 本章和前面几章的关系

上一篇讲的快省树是启发法的一个特例。这一篇把它推广成「固定模式」,用在评估上。 这里的规则、阈值、十条街区的数据都是本节设定值,结论只对这组设定成立。

一、评估也要能算

「这个街区算不算清干净了」听着是个主观判断,可它必须能算——不然预算没法分配。 把它拆成三条能查的规则:件数降幅超过 30%;大件垃圾清零;连续两次抽样都在下降。 三条里满足两条以上,判「算干净」。这就是一个固定模式:规则提前定好,不随街区变。

固定模式的关键是「提前定」:先定规则再看数据,而不是看完数据再挑规则。

二、十个街区跑一遍

街区 降幅 大件清零 连续下降 专家
K1 46% 是 是 算干净
K2 38% 是 是 算干净
K3 22% 否 否 还不算
K4 51% 是 是 算干净
K5 12% 是 否 还不算
K6 35% 否 是 还不算
K7 44% 是 否 算干净
K8 18% 否 否 还不算
K9 29% 否 是 算干净
K10 41% 是 是 算干净

三票制判对 8 条。错的是 K6 和 K9:两条都只拿到两票,一个被判「干净」而专家说不算,一个反过来。 两票就判干净,标准偏松。这是固定模式的代价:它不区分「两票是哪些票」。

三、复杂模型多对一条

再建一个五变量加权模型:降幅每点 0.5 分、大件 20 分、看着干净 12 分、连续下降 8 分, 45 分以上判干净。 它判对 9 条,只错 K9:分数 34.5,差 10.5 分。 多对一条,代价是多了一个变量(看着干净)和一个阈值。这两个东西都是要花钱、要解释的。

四、阈值一拨,成绩就变

阈值 判对条数
40 分 9/10
45 分 9/10
50 分 9/10
55 分 8/10
60 分 7/10

权重一个没改,只动分界线,成绩就从 9 掉到 7。分数算得没错,错在「45」这个数根本没有依据。 三票制没有旋钮:规则提前定死,成绩固定 8 条。它不惊艳,但也不会因为你随手调一个数就变差。 简单规则的价值常在「没有可调旋钮」这一条上——它让结论可预期、可复算、也没法事后调参。

五、固定模式为什么有启发性

真实世界的信号通常弱、样本通常小。变量一多,模型就会把噪声当信号学进去。 固定模式强制你只用少量线索,等于提前把「过拟合」这条路堵死了。 它的另一个好处是能讲:三条规则一句话说完,议员听得懂,被扫的街区也服气。

能讲清楚的模型,才有机会被用起来。

六、动手 Demo:更简单的评估方法

三票制对一个五变量加权模型,十个街区各判一遍。 再把加权模型的阈值从 40 拨到 60,看成绩怎么变。

# (街区, 降幅%, 大件清零, 看着干净, 连续下降)
BLK = [("K1", 46, 1, 1, 1), ("K2", 38, 1, 1, 1), ("K3", 22, 0, 1, 0),
       ("K4", 51, 1, 1, 1), ("K5", 12, 1, 0, 0), ("K6", 35, 0, 1, 1),
       ("K7", 44, 1, 1, 0), ("K8", 18, 0, 0, 0), ("K9", 29, 0, 1, 1),
       ("K10", 41, 1, 1, 1)]
LAB = [1, 1, 0, 1, 0, 0, 1, 0, 1, 1]

ok = 0
for i, (nm, drop, big, vis, cont) in enumerate(BLK):
    votes = (1 if drop > 30 else 0) + big + cont
    ok += ((1 if votes >= 2 else 0) == LAB[i])
print("三票制:%d/10" % ok)

for th in (40, 45, 50, 55, 60):
    c = 0
    for i, (nm, drop, big, vis, cont) in enumerate(BLK):
        score = 0.5 * drop + 20 * big + 12 * vis + 8 * cont
        c += ((1 if score >= th else 0) == LAB[i])
    print("加权模型 阈值 %d:%d/10" % (th, c))

实跑输出:

--------------------------------------------------------------------
更简单的评估方法
--------------------------------------------------------------------

  ① 评估「清干净了没有」,也能用简单规则
  --------------------------------------------------------------------
  三条规则:件数降幅超过 30%;大件垃圾清零;连续两次抽样都在下降。
  三条里满足两条以上,就判「这个街区算清干净了」。
  这是个「固定模式」——规则提前定好,不随街区变。

  ② 十个街区的判定
  --------------------------------------------------------------------

| 街区 | 件数降幅 | 大件清零 | 看着干净 | 连续下降 | 专家 |
|---:|---|:---:|:---:|:---:|---|
| K1 | 46% | 是 | 是 | 是 | 算干净 |
| K2 | 38% | 是 | 是 | 是 | 算干净 |
| K3 | 22% | 否 | 是 | 否 | 还不算 |
| K4 | 51% | 是 | 是 | 是 | 算干净 |
| K5 | 12% | 是 | 否 | 否 | 还不算 |
| K6 | 35% | 否 | 是 | 是 | 还不算 |
| K7 | 44% | 是 | 是 | 否 | 算干净 |
| K8 | 18% | 否 | 否 | 否 | 还不算 |
| K9 | 29% | 否 | 是 | 是 | 算干净 |
| K10 | 41% | 是 | 是 | 是 | 算干净 |


  ③ 简单规则判对几条
  --------------------------------------------------------------------
  三票制判对 8/10 条。

  ④ 复杂模型判对几条
  --------------------------------------------------------------------
  五变量加权(降幅 0.5 分/点、大件 20 分、看着干净 12 分、连续下降 8 分,
  45 分以上判干净)判对 9/10 条。
  比三票制多对了一条。可它有一个三票制没有的东西:一个可调的阈值。

  ⑤ 阈值一拨,成绩就变
  --------------------------------------------------------------------
  同一套权重,只把判定的分界线从 40 拨到 60:
  阈值 40 分:判对 9/10 条
  阈值 45 分:判对 9/10 条
  阈值 50 分:判对 9/10 条
  阈值 55 分:判对 8/10 条
  阈值 60 分:判对 7/10 条
  权重一个没改,成绩就在 7 到 9 之间摆。分数算得没错,错在「45」这个数根本没有依据。
  ! 三票制没有旋钮:规则提前定死,成绩固定 8 条。它不惊艳,但也不会因为你随手调一个数就变差。
  简单规则的价值常在「没有可调旋钮」这一条上。

三票制只用了三条规则、一个门槛;加权模型用了四个变量、一个阈值。参数多一个,可解释性就难一分。 加权模型成绩从 9 掉到 7,全靠一个没人能解释的阈值。三票制的 8 分难看,但它站得住。

30 秒实验

  1. 把三票制的门槛从「两票」改成「三票」,会多判错还是少判错?
  2. 给加权模型再加一个变量(比如「居民投诉降幅」),成绩一定会变好吗?
  3. 想一想:为什么「先定规则再看数据」比「看完数据再定规则」可信?

常见误区

  1. 看完数据再挑规则:这叫事后拟合,换一批数据就废。
  2. 追求多对一条:多对一条可能只是运气,代价是模型变复杂、变难解释。
  3. 阈值随手定:45 这个数要有依据(等分位、成本平衡),否则就是自己给自己发奖。
  4. 以为简单就等于好:简单的前提是规则挑得对,三条烂规则照样能判得一团糟。
自测三问(点开对答案) 1. 固定模式的「固定」指什么? —— 规则提前定好,不随数据变。这是它能被检验、被复算的前提。 2. 为什么加权模型的成绩会随阈值变? —— 因为它把连续的分数硬切成两类,切口在哪儿直接决定谁被分到哪边。 3. 简单规则的价值在哪一条上? —— 没有可调旋钮:结论可预期、可复算,也不能事后调参凑结果。

方法都有了,最后一步是把它讲给不懂统计的人听。下一篇是一页纸的提交稿。

相关笔记