下半五条:非线性与多元回归、假设检验、随机性、协作文档、你自己的专业技能。 加一个 0/1 变量,误差从 1.39 降到 0.90;再加交互项,降到 0.87——和分区模型完全一样。 模拟 1000 轮抛 10 次硬币,有 105 轮出现连续五个正面。随机最爱扎堆,人的直觉最不擅长这件事。
上一篇指了五个方向。这一篇剩下五条,其中前三条都能用手上的数据立刻演一遍。 最后两条不是技术,但对结果的影响比技术大。
一、第一条:非线性与多元回归
一条直线不够用的时候,有两条路:加变量,或者加曲线。 加变量叫多元回归:y 同时由 x1、x2 决定。加曲线叫非线性回归:把 x 平方一下再放进去。 第 11 章的分区模型,其实就是多元回归的一个特例——加一个 0/1 变量再加一个交互项。
所以那不是三种方法,是一种方法的三副面孔。 这一点想通了,「该用哪个模型」的纠结会少一大半。
二、第二条:假设检验
第 5 章讲过假设:把它写成一句能被数据否掉的话。 假设检验把这件事做成了一套固定流程:定原假设、算统计量、看概率、决定。 它的结论永远是「数据不足以否掉原假设」,不是「原假设成立」。
这个区别是统计里最常被说错的一句话。 「没有证据表明有差别」和「证明没有差别」,是两件事。
三、第三条:随机性
人对随机序列的直觉很差:总觉得随机应该均匀交替。 实际上随机最爱扎堆——连出五个正面,在纯随机里也不算罕见。 所以看到「连续几个月都超标」就断定有问题,多半是看错了。
判断随机要看分布,不能看片段。这是第 7 章主观概率那套东西的延伸。
四、第四、五条:协作与专业
协作文档解决的是「别互相覆盖」,和关系数据库解决「别分叉」是同一类问题。 多人改一份表,最怕的不是改错,是不知道谁改的、改之前是什么。 最后一条最难写进书里:你知道这家公司有一条「不写在制度上的惯例」,这句话比任何算法都值钱。
模型的上限由领域知识决定,不由算法决定。这是十条要诀里唯一一条无法外包的。
五、十条合起来是什么
前九条都能学,第十条只能攒。 所以这本书真正的建议是:方法学到够用就行,剩下时间花在「搞懂这门生意」上。 一个懂业务的人用简单方法,通常赢过一个不懂业务的人用复杂方法。
六、动手 Demo:交互项就是分区模型,随机串里长串不罕见
同一批 84 条数据,跑三个模型:只有分数、加部门、再加交互项。 再模拟 1000 轮抛硬币,数有多少轮出现连续五个正面。
import numpy as np
def mk(seed, n, lo, hi, a, b0, noise):
S = [seed]
def rnd():
S[0] = (S[0] * 1103515245 + 12345) % 2147483648
return S[0] / 2147483648.0
out = []
for i in range(n):
x = lo + int(round(i * (hi - lo) / float(n - 1)))
y = a + b0 * x + (rnd() - 0.5) * noise
out.append((x, round(y, 1)))
return out
TECH = mk(20261102, 60, 40, 95, 1.2, 0.085, 3.2)
SALE = mk(88117, 24, 42, 92, 1.0, 0.055, 2.6)
XS = np.array([p[0] for p in TECH + SALE], dtype=float)
YS = np.array([p[1] for p in TECH + SALE], dtype=float)
D = np.array([0.0] * 60 + [1.0] * 24)
def rmse_of(cols):
A = np.column_stack(cols + [np.ones_like(XS)])
c, *_ = np.linalg.lstsq(A, YS, rcond=None)
return float(np.sqrt(((YS - A.dot(c)) ** 2).mean()))
print("只有分数 %.2f" % rmse_of([XS]))
print("分数 + 部门 %.2f" % rmse_of([XS, D]))
print("分数 + 部门 + 交互 %.2f" % rmse_of([XS, D, XS * D]))
实跑输出:
--------------------------------------------------------------------
交互项就是分区模型,随机串里长串不罕见
--------------------------------------------------------------------
① 附录 A 下半张清单
--------------------------------------------------------------------
| 方向 | 它解决什么 | 往下走的入口 |
|---|---|---|
| 非线性与多元回归 | 一条直线不够用时怎么办 | 加变量、加平方项 |
| 原假设-备择假设检验 | 把「有没有差别」写成可判的形式 | t 检验、方差分析 |
| 随机性 | 分辨「像随机」和「真随机」 | 随机数检验、置换检验 |
| Google Docs | 多人同时改一份表 | 共享、评论、版本历史 |
| 你的专业技能 | 把领域知识写进模型 | 只有你能提供的那部分 |
最后一条最重要:模型的上限由领域知识决定,不由算法决定。
② 一条直线不够用:加变量
--------------------------------------------------------------------
第 11 章我们按部门切开,各自建了一条线。那件事其实可以用一个方程写出来。
办法是加一个 0/1 变量:技术部记 0,销售部记 1,再乘上分数得到一个交互项。
方程变成:加薪 = b0 + b1×分数 + b2×部门 + b3×(分数×部门)。四个参数,两条线。
这不是新方法,是把「两条线」写成了一个式子的样子。
③ 三个模型比一比
--------------------------------------------------------------------
| 模型 | RMSE(百分点) |
|---|---:|
| 只有分数 | 1.39 |
| 分数 + 部门 | 0.90 |
| 分数 + 部门 + 交互项 | 0.87 |
加一个 0/1 变量,误差从 1.39 降到 0.90;再加交互项,降到 0.87。
第三个模型的 0.87,和第 11 章「两条线各算各的」算出来的 0.87 完全一致——它就是同一件事。
! 所以「分区模型」和「带交互项的多元回归」是同一个模型的两个名字。
④ 随机性:连续五个正面罕见吗
--------------------------------------------------------------------
模拟 1000 轮「抛 10 次硬币」,其中有连续 5 个正面的:105 轮(10.5%)。
十次里连出五个正面,看着像「这硬币有问题」,其实在纯随机里也常有。
人对随机序列的直觉很差:总觉得随机应该均匀交替,实际上随机最爱扎堆。
⑤ 协作与技能这两条
--------------------------------------------------------------------
Google Docs 这类协作文档解决的是「别互相覆盖」,和关系数据库解决「别分叉」是同一类问题。
专业技能那条最难写进书里:你知道这家公司的加薪规则里有一条「不写在制度上的惯例」,
这句话比任何算法都值钱。
附录 A 十条要诀,真正拉开差距的是最后一条。
第三个数 0.87 和第 11 章「两条线各算各的」完全一样。同一个模型,两种写法:一种切片,一种加项。 第二种(只加部门)把误差从 1.39 压到 0.90,说明「部门」确实带信息; 但要压到底,还得给部门一个自己的斜率。
30 秒实验
- 只加部门变量时,两条线是平行的还是相交的?为什么?
- 如果把分数平方也加进模型,误差会继续降吗?降了就说明该用曲线吗?
- 想一想:为什么「没有证据表明有差别」不能读成「证明没有差别」?
常见误区
- 把分区模型和多元回归当两种方法:加交互项之后它们完全等价。
- 把不显著当无关:只能说不显著,不能说无关。
- 用一小段序列判断随机性:连续五个正面在纯随机里也常见。
- 只学方法不学业务:模型的上限是领域知识,不是算法。
自测三问(点开对答案)
1. 分区模型和带交互项的回归是什么关系? —— 同一个模型的两种写法。切片之后各拟合一条线,等于在方程里加一个 0/1 变量和一个交互项。 2. 假设检验的结论应该怎么表述? —— 「数据不足以否掉原假设」,不是「原假设成立」。没有证据和有反证是两件事。 3. 为什么不能靠一段序列判断随机性? —— 随机序列本来就爱扎堆。要判断得看整体分布,比如长串出现的频率是否超出随机预期。附录 A 到此结束。附录 B 讲装 R,附录 C 讲装 Excel 的分析工具包——两个都已经过时得只剩方法值钱。
- ☐ (本篇完,下一篇 B.1 启动 R:从装到能跑)