Chapter 1: The Origin of Prediction — The Birth and Intuitive Anchor of Linear Regression
1885年11月的一个阴雨清晨,伦敦皇家学会的实验室里弥漫着旧羊皮纸和福尔马林的气味。弗朗西斯·高尔顿爵士站在堆满了家谱记录的木桌前,手里捏着一根刚削好的铅笔,眉头拧成了一个结。他面前摊着的是过去12年里从英国各地收集的928个家庭的身高数据:父亲、母亲、以及他们所有成年子女的身高,每一个数据都来自他亲自寄给各地牧师和绅士的信件,甚至他还在自己举办的优生学讲座上请听众现场填报身高的家族记录。作为达尔文的的表弟,高尔顿此行的目的是验证一个他坚信不疑的假说:优秀的身高是可以完全遗传的,高个子父母的后代应该一代比一代高,最终造就一个身高不断突破极限的完美人种。
他花了三个小时把数据点画在坐标纸上:横轴是双亲身高的平均值,纵轴是成年子女的身高,单位都是英寸。随着最后一个点落下,他盯着散点图看了足足十分钟,预期的“斜率大于1的直线”根本没有出现——散点大致围绕一条斜率仅为0.58的直线分布:如果父母平均身高是70英寸(约178厘米,属于当时英国的上层身高水平),子女的平均身高只有68英寸(约173厘米);而如果父母平均身高是60英寸(约152厘米,属于当时的下层身高水平),子女的平均身高反而能到63英寸(约160厘米)。高个子父母的孩子反而没那么高,矮个子父母的孩子反而没那么矮,这种“向均值回归”的现象让高尔顿大受震撼:他原本以为遗传是完美的代际传递,没想到自然里藏着一种看不见的拉力,把所有极端值往中间拽。
<!-- 电子版侧边栏:你知道吗?高尔顿当年给这个现象起名“回归”(regression)时,本意是指子女的身高向父母平均身高的“均值回归”,没想到这个词后来成了整个统计学和机器学习领域最核心的范式之一,甚至我们今天说的“线性回归”,名字就来自这里。 --> <!-- 纸书格式:此处为章节开篇的历史叙事段落,印刷时可搭配高尔顿当年手绘的散点图复制品 -->
高尔顿没有停下脚步。他很快发现这种“回归”不是身高独有的:他收集的豌豆种子重量数据、学生的考试成绩数据,都呈现出类似的规律:父代的极端值对应的子代值总是更接近总体均值。为了量化这种规律,他和学生卡尔·皮尔逊一起发展出了“回归线”的概念:就是那条让所有数据点到它的垂直距离的平方和最小的直线。这个“平方和最小”的规则,后来成了整个预测建模的基石,而我们今天所说的线性回归,正是从这个维多利亚时代的生物学观察里走出来的。
1.1 最小二乘法的直觉:拉一根最紧的橡皮筋
要理解最小二乘法的核心逻辑,我们不需要一开始就啃公式。想象你面前有一块钉着928个图钉的木板,每个图钉的位置对应高尔顿数据里的一个$(x_i, y_i)$点:$x_i$是父母平均身高,$y_i$是子女身高。现在你要拉一根橡皮筋,让它的一端固定在木板的左上角,另一端固定在右下角,要求橡皮筋尽可能贴近所有图钉。你怎么判断哪一根橡皮筋是“最合适”的?
如果你直接拿一根橡皮筋去套,会发现如果橡皮筋离某个图钉越远,你需要用的力就越大,而拉力做的功和橡皮筋的伸长量的平方成正比——这就是物理世界里的弹性势能公式$E = \frac{1}{2}kx^2$,$k$是橡皮筋的劲度系数,$x$是伸长量。换句话说,每个数据点到直线的“距离的平方”,本质上就是橡皮筋拉到那个点需要做的功。我们要找的那根“最合适的直线”,就是让总功最小的那根:也就是所有数据点到直线的垂直距离的平方和最小。
用数学语言来描述,假设我们的预测模型是$\hat{y} = \theta_0 + \theta_1 x$,其中$\theta_0$是截距,$\theta_1$是斜率,那么最小二乘法的目标就是最小化损失函数: $$J(\theta_0, \theta_1) = \sum_{i=1}^n (y_i - (\theta_0 + \theta_1 x_i))^2$$ 你可能会问:为什么是平方和,而不是绝对值和?毕竟绝对值和看起来更符合“总距离最小”的直觉。这里有两个关键原因:第一,平方函数处处可导,而绝对值函数在0点不可导,这意味着我们可以用微积分轻松求出损失函数的最小值,而绝对值和需要用到更复杂的线性规划方法;第二,平方惩罚会对离群点施加更大的权重——如果一个点距离直线特别远,它的平方误差会比绝对误差大得多,这让我们在拟合的时候不会过度受极端异常值的影响,符合我们对“整体趋势”的追求。
1805年,法国数学家阿德里安-马里·勒让德第一次把这个“平方和最小”的规则写成正式的数学方法,用来处理天文观测中的轨道计算误差:当时的天文学家需要从几十次有观测误差的彗星位置数据里,拟合出最准确的彗星轨道,最小二乘法完美解决了这个问题。而仅仅4年后,德国数学家高斯在计算谷神星轨道的时候也独立发现了这个方法,还证明了一个里程碑式的结论:如果我们的观测误差服从正态分布,那么最小二乘估计就是所有线性无偏估计里方差最小的——也就是所谓的最佳线性无偏估计(BLUE),这就是著名的高斯-马尔可夫定理。这个定理给最小二乘法提供了坚实的理论基础:只要误差满足正态性假设,我们拟合出来的直线就是“最好”的直线。
<!-- 电子版侧边栏:高斯当年用最小二乘法计算谷神星轨道的速度有多快?他只用了一晚上就完成了其他天文学家需要几个月才能完成的工作,这个结果让整个欧洲科学界震惊,也让最小二乘法成了19世纪科学研究的标配工具。 --> <!-- Markdown标签:#最小二乘法 #高斯马尔可夫定理 #历史背景 -->
当数据维度超过1维的时候,我们把$x$扩展成向量$\mathbf{x} \in \mathbb{R}^n$,参数也扩展成$\boldsymbol{\theta} \in \mathbb{R}^{n+1}$(包含截距项),损失函数可以写成矩阵形式: $$J(\boldsymbol{\theta}) = \frac{1}{2} \|\mathbf{X}\boldsymbol{\theta} - \mathbf{y}\|_2^2$$ 其中$\mathbf{X}$是$n \times (m+1)$的设计矩阵,每一行是一个样本的特征向量(前面加一个1对应截距项),$\mathbf{y}$是$n$维的标签向量,$\|\cdot\|_2$是L2范数。对$\boldsymbol{\theta}$求导并令导数为0,我们可以直接得到解析解,也就是正规方程: $$\hat{\boldsymbol{\theta}} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y}$$ 这个公式是线性回归的“闭式解”,只要$\mathbf{X}^T \mathbf{X}$可逆,我们就能一步算出最优的参数。但这里有一个隐藏的前提:$\mathbf{X}^T \mathbf{X}$不能是奇异矩阵,也就是设计矩阵的列之间不能完全线性相关——如果两个特征完全一样,比如同时把“房屋面积(平方米)”和“房屋面积(平方英尺)”放进特征里,$\mathbf{X}^T \mathbf{X}$就不可逆了,正规方程算不出来。这个问题就是我们在工业实践中经常遇到的多重共线性,我们会在后面的案例部分详细讲解。
1.2 正则化的几何本质:给回归加一把“弹簧”
最小二乘法虽然简单优雅,但在工业实践中有一个致命的缺陷:当特征维度很高、数据噪声很大的时候,它很容易过拟合——也就是模型把训练数据里的噪声也学进去了,在训练集上表现很好,但在未见过的测试集上表现很差。比如你要预测房价,特征里有“房屋面积”“房间数量”“建造年份”“周边学校评分”等127个特征,训练集有1000万条数据,最小二乘法可能会拟合出一个非常复杂的直线,给每个特征都分配一个非常大的参数,刚好匹配训练数据里的随机波动,但泛化能力极差。
解决过拟合最常用的方法就是正则化:我们在损失函数里加一个惩罚项,限制参数的大小,不让参数变得太大。最常用的两种正则化是L1正则(Lasso回归)和L2正则(Ridge回归),它们的损失函数分别是: $$J_{\text{L1}}(\boldsymbol{\theta}) = \frac{1}{2} \|\mathbf{X}\boldsymbol{\theta} - \mathbf{y}\|_2^2 + \lambda \sum_{j=1}^m |\theta_j|$$ $$J_{\text{L2}}(\boldsymbol{\theta}) = \frac{1}{2} \|\mathbf{X}\boldsymbol{\theta} - \mathbf{y}\|_2^2 + \lambda \sum_{j=1}^m \theta_j^2$$ 其中$\lambda$是正则化系数,控制惩罚的强度:$\lambda$越大,参数被压得越小,模型越简单,越不容易过拟合;$\lambda$越小,惩罚越弱,模型越接近普通最小二乘。
很多人会把L1和L2的区别停留在“L1会让参数为0,L2不会”的层面,但如果我们从几何视角来看,会理解得更加深刻。想象我们把损失函数的等高线画在参数空间里:最小二乘的损失函数的等高线是一圈一圈的椭圆,椭圆的中心就是普通最小二乘的最优解。现在我们要加一个参数约束:要求$\sum_{j=1}^m |\theta_j| \leq C$(L1约束)或者$\sum_{j=1}^m \theta_j^2 \leq C$(L2约束),这两个约束在二维参数空间里的形状分别是菱形和圆形(高维空间里是超菱形和超球面)。
我们的目标是在约束区域内找到损失函数最小的点,也就是等高线和约束区域的切点。对于L2的圆形约束,等高线和圆形的切点几乎不会出现在坐标轴上(除非损失函数的椭圆刚好和圆相切于坐标轴),所以最优解里的所有参数都会是非零的,只是被压得更小——这就是为什么L2正则不会做特征选择,只会让所有参数都变小。而对于L1的菱形约束,菱形的四个顶点都在坐标轴上,等高线和菱形的切点非常容易落在顶点上——也就是某个$\theta_j=0$,其他参数非零,这就是L1正则能做特征选择的原因:它会自动把没用的特征的参数压到0,相当于自动做了特征筛选。
```mermaid graph TD subgraph L1 Regularization (Lasso) A[Loss Contour Ellipse] --> B[Diamond Constraint (|θ₁|+|θ₂|≤C)] B --> C[Optimal Point at Vertex (θ₂=0)] style C fill:#ff9999,stroke:#333,stroke-width:2px end subgraph L2 Regularization (Ridge) D[Loss Contour Ellipse] --> E[Circular Constraint (θ₁²+θ₂²≤C)] E --> F[Optimal Point on Edge (θ₁>0,θ₂>0)] style F fill:#99ff99,stroke:#333,stroke-width:2px end %% 标注 G[<center>二维参数空间下的约束区域与最优解对比</center>] ```
除了特征选择能力,L1和L2还有另一个关键区别:对异常值的鲁棒性。L2的惩罚是二次的,会对大的参数施加非常大的惩罚,所以L2正则的模型会把离群点的影响分摊到所有特征上,对异常值更敏感;而L1的惩罚是线性的,对大的参数的惩罚是固定的,所以L1正则的模型对异常值更鲁棒。在工业实践中,如果你的特征里有大量噪声,或者你更看重模型的可解释性(需要筛选出关键特征),优先选L1正则;如果你的特征都是有用的,只是需要防止过拟合,优先选L2正则;如果两者都需要,就用两者的结合——Elastic Net,它的损失函数同时包含L1和L2惩罚项,是目前工业界最常用的正则化方案之一。
<!-- 纸书格式:此处为L1/L2正则化几何对比图,印刷时可搭配三维参数空间的超球面/超菱形示意图 --> <!-- Markdown标签:#正则化 #L1正则 #L2正则 #ElasticNet #过拟合 -->
这里还有一个工业界新手常踩的坑:正则化之前必须对特征做标准化。因为正则化是对参数值的惩罚,如果你的特征尺度差异很大——比如“房屋面积”的单位是平方米,取值范围是10到500,“地铁距离”的单位是米,取值范围是100到5000——那么尺度大的特征的参数会被惩罚得更重,导致模型 bias 严重。正确的做法是把所有特征都标准化到均值为0、方差为1的分布,再做正则化,保证每个特征的惩罚是公平的。
1.3 从线性回归到广义线性模型:打破“线性”的桎梏
普通线性回归有一个隐含的假设:目标变量$y$和特征$\mathbf{x}$是线性关系,且$y$服从正态分布。但这个假设在绝大多数工业场景里都不成立:比如我们要预测用户是否会点击广告,目标变量是0或1,服从伯努利分布,不可能服从正态分布;我们要预测一天里某个网站的访问量,目标变量是非负整数,服从泊松分布,也不符合正态假设。这时候我们就需要用到广义线性模型(Generalized Linear Model, GLM),它是线性回归的自然扩展,打破了“目标变量必须正态分布、必须线性关系”的桎梏。
GLM的核心是三个组成部分: 1. 随机成分:目标变量$y$服从指数族分布(正态分布、伯努利分布、泊松分布、伽马分布都属于指数族分布),它的期望$\mu = E(y)$是我们想要预测的值。 2. 系统成分:线性预测器$\eta = \boldsymbol{\theta}^T \mathbf{x}$,也就是我们熟悉的线性组合,和普通线性回归的线性部分完全一样。 3. 链接函数:$g(\mu) = \eta$,它是一个单调可导的函数,把目标变量的期望$\mu$的空间(比如0到1的概率空间、非负的计数空间)映射到线性预测器$\eta$的 unrestricted 空间(可以是任何实数)。
举个最常见的例子:逻辑回归,它是用来做二分类的GLM,目标变量服从伯努利分布,链接函数是logit函数: $$g(p) = \log\left(\frac{p}{1-p}\right) = \boldsymbol{\theta}^T \mathbf{x}$$ 其中$p$是样本属于正类的概率,$\frac{p}{1-p}$是几率(odds),$\log(\frac{p}{1-p})$是对数几率。我们可以把逻辑回归的预测过程拆成两步:第一步先
我们可以把逻辑回归的预测过程拆成两步:第一步先计算线性预测器$\eta = \boldsymbol{\theta}^T \mathbf{x}$,第二步通过sigmoid函数把实数空间的$\eta$映射到$(0,1)$的概率空间,得到正类的概率$p = \sigma(\eta) = \frac{1}{1 + e^{-\eta}}$。这里的链接函数$g(p) = \log(\frac{p}{1-p})$刚好是sigmoid函数的反函数,这也是为什么逻辑回归属于GLM的范畴——它完全符合GLM的三个组成部分:伯努利分布的随机成分、线性预测器的系统成分、logit链接函数。
你可能会问:逻辑回归既然叫“回归”,为什么用来做分类?其实这个名字是历史的遗留:逻辑回归最早被生物学家用来研究物种的生存概率和特征的关系,本质还是回归问题——回归的是概率这个连续值,只是最终我们把概率大于0.5的样本判定为正类,小于0.5的判定为负类,才成了分类算法。和普通线性回归的核心区别在于,逻辑回归不再假设目标变量服从正态分布,而是服从伯努利分布(只有0和1两个取值),因此它不再用最小二乘法求解,而是用最大似然估计:对于每个样本,如果真实标签是$y_i=1$,我们希望模型预测的概率$p_i$尽可能大;如果$y_i=0$,我们希望$1-p_i$尽可能大。把所有样本的似然函数乘起来取对数,就得到了逻辑回归的损失函数——也就是二元交叉熵损失: $$J(\boldsymbol{\theta}) = -\frac{1}{n} \sum_{i=1}^n \left[ y_i \log p_i + (1 - y_i) \log(1 - p_i) \right]$$ 这个损失函数和最小二乘的平方损失有本质区别:它对预测错误的惩罚是log函数,当预测概率和真实标签差距很大的时候,惩罚会急剧上升——比如真实标签是1,模型预测概率是0.1,交叉熵损失是$-\log(0.1) \approx 2.3$,如果预测概率降到0.01,损失直接升到$-\log(0.01) \approx 4.6$,翻了一倍;而最小二乘的损失是$(1-0.1)^2=0.81$和$(1-0.01)^2=0.98$,惩罚只增加了20%。这种对分类错误的敏感度,让交叉熵损失比平方损失更适合分类任务,这也是它现在被广泛用于所有分类模型的根本原因。
除了逻辑回归,GLM还有两个工业界常用的成员:泊松回归和伽马回归。泊松回归的随机成分是泊松分布,适合非负整数计数的预测场景,比如预测网站的每日访问量、电商的每日订单量、客服中心的每日呼入量,它的链接函数是log链接$g(\mu) = \log(\mu) = \boldsymbol{\theta}^T \mathbf{x}$,可以保证预测出来的计数是非负的,符合泊松分布的定义。比如某跨境电商在2023年黑五期间,用泊松回归预测每个SKU的每日订单量,特征包括商品价格、折扣力度、过往7天的销量、是否是热门品类,预测误差比普通线性回归低了32%,核心原因就是普通线性回归会预测出负的订单量,完全不符合业务逻辑,而泊松回归天然解决了这个问题。伽马回归的随机成分是伽马分布,适合右偏的连续正数预测场景,比如用户的LTV(生命周期价值)、保险的理赔金额、设备的故障维修时间,这些变量都是右偏分布,普通线性回归拟合出来的结果会有大量低估,而伽马回归的倒数链接$g(\mu) = 1/\mu = \boldsymbol{\theta}^T \mathbf{x}$可以保证预测值始终为正,效果远好于普通线性回归。
所有GLM的求解都可以用迭代重加权最小二乘(IRLS)算法,它的核心思想是把GLM的非线性损失函数转化成一系列加权最小二乘问题:每次迭代根据当前的参数估计计算每个样本的权重,然后用最小二乘法求解加权后的线性问题,更新参数,直到损失函数收敛。这个算法的好处是我们可以复用最小二乘的成熟实现,不需要为每个GLM单独写求解器,这也是为什么GLM在工业界这么流行:实现简单、求解速度快、可解释性强,而且可以适配几乎所有类型的预测任务。
<!-- 电子版侧边栏:你知道吗?GLM的提出者约翰·内茨(John Nelder)和罗伯特·韦德伯恩(Robert W