线性回归
线性回归是所有机器学习算法的鼻祖——用一条直线(多维时是超平面)去拟合自变量与因变量之间的关系,简单、可解释、计算高效。它既是最小二乘法的最经典应用,也是理解逻辑回归、神经网络等更复杂模型的起点。前置阅读:监督学习。
把线性回归想象成用尺子在散点图上画一条最贴数据的直线:
- “线性”指对参数线性: 是线性, 也是线性,甚至 对参数 a、b 而言也是线性(只要把 当作一个新特征)。“线性”不是限制特征的形式,而是限制参数进入模型的方式。
- “回归”指拟合连续值:与分类相对,目标是预测一个连续的数值(房价、温度、销量),而不是离散类别。
- “最佳拟合”的标准:让所有数据点到这条线的”垂直距离平方和”最小——这就是最小二乘准则。平方让正负误差不抵消,且自然地重罚大误差。
为什么是”平方和”而不是”绝对值和”?因为当误差服从正态分布(Normal Distribution,即高斯分布,自然界中测量误差最常见的分布形态)时,最小化平方误差恰好等价于最大似然估计(Maximum Likelihood Estimation, MLE,即”选择让已观测数据出现概率最大的参数”)——平方损失有坚实的统计学依据。
给定 n 个特征 x1 到 xn,权重 w1 到 wn,偏置 b,线性回归模型为:
矩阵形式记作 ,其中 X 是设计矩阵(Design Matrix,每行一个样本、每列一个特征的矩阵),w 是权重向量。为了把偏置 b 也纳入矩阵运算,通常在 X 左侧补一列全 1,把 b 并入 w 向量的首位,这样模型就简化为 。
损失函数:均方误差
Section titled “损失函数:均方误差”最常用的损失是均方误差(MSE, Mean Squared Error)——所有样本预测值与真实值之差的平方再求平均:
其中 m 是样本数。MSE 是权重 w 的二次函数,全局只有一个最小值(凸函数,Convex Function,形如碗状、任意两点连线仍在函数图像上方的函数),因此一定能找到全局最优——这是线性回归”好求解”的根本原因。
从概率角度推导 MSE:假设每个真实值 y_i = X_i·w + ε_i,其中噪声 ε_i 独立地服从均值为 0、方差为 σ² 的正态分布。那么在给定 X_i 和 w 时,y_i 出现的概率密度为:
全部 m 个样本同时出现的概率(似然函数 Likelihood)是各项相乘:
取对数(把乘法变成加法,单调性不变所以不改变最优解)并去掉与 w 无关的常数项后,最大化对数似然等价于最小化 ——这正好就是 MSE。这个推导告诉我们:用 MSE 等价于默认噪声是正态的。如果噪声是重尾(Heavy-tailed,极端值出现概率远高于正态分布的情况,如金融收益),MSE 会被离群点严重带偏,此时改用 Huber 损失(平方与绝对值的平滑混合)或分位数回归(Quantile Regression,拟合某个百分位数而非均值)更稳健。
有两种主流求解路径:
解析解(正规方程 Normal Equation):当特征数不太大时,可以一步求出精确最优解。推导思路是对 MSE 求梯度并令其为零:
这是最小二乘法的直接结果。直觉上, 是特征之间的协方差结构, 是特征与目标的相关结构,相除就得到”在特征相关约束下、对目标的最佳响应”。缺点:求矩阵逆的计算量随特征数立方增长(O(n³)),且当特征高度共线时 接近不可逆(行列式趋近 0),数值不稳定。工程实践中通常用 SVD(Singular Value Decomposition,奇异值分解,将矩阵分解为旋转-缩放-旋转三个矩阵的乘积)分解代替直接求逆,如 numpy.linalg.lstsq,既稳定又能处理非方阵。
梯度下降(Gradient Descent):当样本或特征数很大时(如百万级),求逆代价过高,改用梯度下降迭代逼近——这也是深度学习框架内部的做法。梯度形式简洁:,每步沿梯度反方向更新 w。梯度下降有几个变体值得知道:
- 批梯度下降(Batch GD):每步用全部样本算梯度,稳定但慢。
- 随机梯度下降(SGD, Stochastic Gradient Descent):每步只取一个样本,更新频繁、能跳出局部结构,但噪声大。
- 小批量梯度下降(Mini-batch GD):每步取几十到几百个样本,是深度学习训练的默认选择。
对于线性回归这种凸问题,SGD 通常配学习率衰减(Learning Rate Decay,随训练步数逐步缩小步长)就能稳定收敛。
正则化:岭回归与 Lasso
Section titled “正则化:岭回归与 Lasso”裸 MSE 在特征多、样本少,或特征高度相关时会过拟合(权重变得极大)。加正则项(Regularization Term,对权重幅度施加额外惩罚的项)约束权重幅度:
- 岭回归(Ridge / L2):损失加上 ,惩罚权重大小但不会压到 0,适合特征都有用但需稳定的情况。几何直觉:约束权重落在一个半径为 t 的球内。
- Lasso(L1):损失加上 (权重绝对值之和),会把不重要特征的权重精确压到 0,自动做特征选择,产出稀疏解(Sparse Solution,大部分分量为 0 的向量)。几何直觉:L1 约束区域是菱形(有棱角),等高线与棱角相切的概率远高于与圆边相切,切点恰好在坐标轴上——这就是 Lasso 能产生稀疏解的几何原因。
- ElasticNet:L1 与 L2 混合(损失加 ),兼顾稀疏性与稳定性。当多个相关特征都重要时,纯 Lasso 倾向于只保留其中一个、丢弃其余,ElasticNet 能把它们一起保留。
正则强度 λ 是关键超参数,一般用交叉验证(Cross-Validation,把数据反复划分为训练/验证集来评估不同超参数的表现)选取。详见正则化与交叉验证。
经典线性回归(OLS, Ordinary Least Squares,普通最小二乘)依赖几个假设,违反时模型仍能算出结果,但统计性质不再成立:
- 线性关系:y 与特征的线性组合相关(而非与原始特征本身)——可以通过多项式特征、对数变换等让非线性关系也能用线性回归建模。
- 误差独立同分布:残差之间不相关,方差恒定(无异方差 Heteroscedasticity,即残差的波动幅度不随预测值大小而变化)。
- 特征无完全共线:否则 不可逆,需正则化处理。
- 误差近似正态:保证置信区间、p 值等统计推断(Statistical Inference,从样本数据对总体参数做出带概率保证的结论)有效。
下图直观展示正则化的几何差异:等高线是 MSE 损失的等值线,阴影区域是正则约束的可行域,切点即最优解。
sklearn 三种正则对比
Section titled “sklearn 三种正则对比”from sklearn.linear_model import LinearRegression, Ridge, Lassofrom sklearn.datasets import make_regressionfrom sklearn.model_selection import train_test_split
# 生成回归数据:100 个特征,只有 10 个真正有用X, y = make_regression(n_samples=500, n_features=100, n_informative=10, noise=10.0, random_state=42)X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42)
for name, model in [("OLS", LinearRegression()), ("Ridge", Ridge(alpha=10.0)), ("Lasso", Lasso(alpha=1.0))]: model.fit(X_tr, y_tr) # 非零权重数量(Lasso 会把不重要特征压到 0) nnz = sum(abs(model.coef_) > 1e-6) print(f"{name}: R²={model.score(X_te, y_te):.3f}, 非零权重数={nnz}")numpy 手写正规方程求解
Section titled “numpy 手写正规方程求解”import numpy as np
# 构造数据:y ≈ 3x + 2X = np.array([[1], [2], [3], [4], [5]])y = np.array([5, 8, 11, 14, 17], dtype=float)
# 在 X 左侧补一列 1,把偏置 b 也并入正规方程Xb = np.hstack([np.ones((5, 1)), X])# 正规方程:w = (XᵀX)⁻¹ Xᵀy,一步求出 [b, slope]w = np.linalg.inv(Xb.T @ Xb) @ Xb.T @ yprint("偏置 b ≈", round(w[0], 3), "斜率 ≈", round(w[1], 3))# 输出:偏置 b ≈ 2.0 斜率 ≈ 3.0(与生成参数一致)numpy 手写梯度下降
Section titled “numpy 手写梯度下降”import numpy as np
# 同样的数据:y ≈ 3x + 2X = np.array([[1], [2], [3], [4], [5]], dtype=float)y = np.array([5, 8, 11, 14, 17], dtype=float)m = len(y)
# 标准化特征,帮助梯度下降快速收敛mu, sigma = X.mean(), X.std()Xn = (X - mu) / sigma
# 初始化参数,迭代更新w, b = 0.0, 0.0lr = 0.1for epoch in range(300): y_hat = w * Xn.flatten() + b grad_w = (2 / m) * np.sum((y_hat - y) * Xn.flatten()) grad_b = (2 / m) * np.sum(y_hat - y) w -= lr * grad_w b -= lr * grad_bprint(f"收敛后 w ≈ {w:.3f}(标准化空间),b ≈ {b:.3f}")# 把标准化空间的 w 还原回原始尺度w_orig = w / sigmab_orig = b - w_orig * muprint(f"原始尺度:斜率 ≈ {w_orig:.3f},偏置 ≈ {b_orig:.3f}")用 RidgeCV 自动选正则强度
Section titled “用 RidgeCV 自动选正则强度”from sklearn.linear_model import RidgeCVfrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import make_pipelinefrom sklearn.model_selection import train_test_splitfrom sklearn.datasets import make_regression
X, y = make_regression(n_samples=300, n_features=20, n_informative=5, noise=15.0, random_state=0)X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=0)
# 用 pipeline 保证标准化只在训练集上拟合,避免数据泄漏pipe = make_pipeline(StandardScaler(), RidgeCV(alphas=[0.01, 0.1, 1.0, 10.0, 100.0], cv=5))pipe.fit(X_tr, y_tr)print(f"最优 alpha = {pipe.named_steps['ridgecv'].alpha_}")print(f"测试集 R² = {pipe.score(X_te, y_te):.3f}")用 statsmodels 做统计推断
Section titled “用 statsmodels 做统计推断”import statsmodels.api as smimport numpy as np
X = np.array([[1], [2], [3], [4], [5]], dtype=float)y = np.array([5, 8, 11, 14, 17], dtype=float)X_with_const = sm.add_constant(X) # 自动补截距列
model = sm.OLS(y, X_with_const).fit()print(model.summary())# 输出含每个系数的 p 值、95% 置信区间、F 统计量、R² 与调整 R²# 适合需要做假设检验、写论文或出统计报告的场景- 先标准化特征:尤其用 Ridge / Lasso 时,正则项对各特征一视同仁,量纲不一致会让大幅特征逃避惩罚。先
StandardScaler。 - 共线性要警惕:特征高度相关时 OLS 权重会变得极不稳定(小数据扰动就剧烈变化)。岭回归或丢弃冗余特征是常用对策。可用 VIF(Variance Inflation Factor,方差膨胀因子,衡量某特征能被其他特征线性解释的程度,>10 通常视为严重共线)来诊断。
- 检查残差图:把残差对预测值画出来。若呈漏斗形(异方差)或有明显曲线,说明线性假设或恒方差假设不成立——可尝试对 y 取对数、加多项式特征,或改用更灵活的模型。
- 别只看 R²:R² 会随加入更多特征单调上升,即使这些特征是噪声。用调整 R²(Adjusted R²,对特征数做惩罚的 R² 变体)或在测试集上评估。
- 小心外推:线性模型在训练数据范围外是线性外推的,预测可能严重失真。超出训练范围的输入要格外谨慎。
- 离散特征要正确编码:类别变量用 one-hot 编码(注意丢弃一列避免虚拟变量陷阱,Dummy Variable Trap,即截距与全部哑变量共线导致 XᵀX 不可逆),有序类别可用序号编码。
- 处理离群点:MSE 对大误差平方敏感,少量离群点能拉偏整条回归线。先用 IQR 规则或 Isolation Forest 检测异常,再决定剔除或改用 RANSAC、Huber 回归等鲁棒方法。
- 特征工程往往比换模型更有效:对偏态特征做
log(1+x)变换、构造交互项x1·x2、加多项式特征x²,常常比直接上深度模型收益更大且更可解释。
- 房价预测:根据面积、房龄、地段等特征预测房屋成交价——线性回归是入门 baseline,也是解读”每平米多少钱”最直观的模型。
- 销量/需求预测:零售业用线性回归预测未来销量,作为库存与定价决策的依据。详见时间序列。
- A/B 测试效果量化:用线性回归(含协变量)估计实验组与对照组的指标差异,控制混杂因素(Confounder,同时影响处理与结果的变量),比简单 t 检验更稳健。详见因果推断。
- 金融因子模型:Fama-French 三因子模型本质就是线性回归——用市场、规模、价值三个因子解释股票收益。
- 医学剂量-反应分析:用线性回归(或广义线性模型)估计药物剂量与疗效指标的定量关系,是临床统计的基础工具。
- 作为更复杂模型的基线:任何回归任务都先用线性回归跑一个 baseline,再判断深度模型是否真的值得引入额外复杂度。
- 趋势分解:时间序列分析中,用线性回归拟合长期趋势项,再分离季节性与残差。
- 因果效应估计(双重差分 / 合成控制):政策评估中,用线性回归估计”干预前后的差异减去未干预组的变化”,这是因果推断的核心工具。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| sklearn.linear_model.LinearRegression | Python | 最常用 OLS 实现,接口简洁 |
| sklearn.linear_model.Ridge / Lasso / ElasticNet | Python | 带正则化的线性回归,含交叉验证版本 RidgeCV / LassoCV |
| sklearn.linear_model.HuberRegressor / RANSACRegressor | Python | 鲁棒回归,抗离群点 |
| statsmodels.OLS | Python | 统计学风格,输出 p 值、置信区间、F 检验、残差诊断 |
| numpy.linalg.lstsq | Python | 底层最小二乘求解器,基于 SVD,数值稳定 |
| glmnet | R / Python | Lasso / ElasticNet 高效实现,处理高维稀疏数据 |
| scikit-learn SGDRegressor | Python | 用随机梯度下降训练,适合超大规模数据 |
| 术语 | 英文 | 解释 |
|---|---|---|
| 线性回归 | Linear Regression | 用线性模型拟合连续型目标变量的监督学习方法 |
| 均方误差 | Mean Squared Error, MSE | 预测值与真实值之差的平方的均值,最常用回归损失 |
| 决定系数 | R² / Coefficient of Determination | 模型解释的目标方差比例,0 到 1 之间,越接近 1 越好 |
| 正规方程 | Normal Equation | OLS 的解析解 ,一步求出最优权重 |
| 岭回归 | Ridge Regression | 加 L2 正则的线性回归,缓解共线性,权重趋小但不为 0 |
| Lasso | Lasso Regression | 加 L1 正则的线性回归,产生稀疏解,可做特征选择 |
| ElasticNet | Elastic Net | L1 与 L2 混合正则,兼顾稀疏性与稳定性 |
| 共线性 | Multicollinearity | 特征之间高度相关,导致 OLS 权重不稳定 |
| 异方差 | Heteroscedasticity | 残差方差不恒定,违反 OLS 假设,影响统计推断 |
| 残差 | Residual | 真实值与预测值之差,用于诊断模型假设是否成立 |
| 最大似然估计 | Maximum Likelihood Estimation, MLE | 选择让已观测数据出现概率最大的参数的估计方法 |
| 凸函数 | Convex Function | 碗状函数,只有一个全局最小值,保证梯度下降收敛到最优 |
| 稀疏解 | Sparse Solution | 大部分分量为 0 的解向量,Lasso 的典型产物 |
| 方差膨胀因子 | Variance Inflation Factor, VIF | 衡量某特征被其他特征线性解释的程度,>10 提示严重共线 |
2025-2026 前沿进展
Section titled “2025-2026 前沿进展”线性回归作为一个”已收敛”的经典方法,近年来的进展不在于算法本身的重写,而在于它与新需求(大规模、高维、隐私、可解释、因果)的结合方式。以下是值得关注的几个方向:
- 高维统计的”双下降”现象:当特征数 p 远大于样本数 n 时(如基因数据 p≈10⁴、n≈10²),传统统计认为 OLS 必然过拟合。但 2020 年后一系列研究(Belkin 等)发现在严重过参数化区域(p ≫ n)反而出现测试误差再次下降的”双下降”(Double Descent)曲线。这一现象揭示了 Lasso、岭回归在高维下仍有出乎意料的表现,也解释了为什么深度学习中”参数比数据多”反而不过拟合。线性回归成为研究这一现象最干净的理论模型。
- 联邦线性回归(Federated Linear Regression):在数据不出本地的隐私约束下,多个机构协同训练一个线性回归模型。由于线性回归的梯度与参数都是线性聚合的,它是联邦学习(Federated Learning,多端协同训练、原始数据不离开设备)最容易高效实现的模型之一。2024-2025 年,结合差分隐私(Differential Privacy,在梯度中注入校准噪声以数学可证明地保护个体)的联邦岭回归已在医疗联合研究中落地。
- 鲁棒回归与重尾噪声:面对金融收益、传感器异常等重尾噪声场景,Huber 回归、分位数回归、基于 Tukey 损失的迭代重加权最小二乘(IRLS, Iteratively Reweighted Least Squares)重新受到重视。2025 年的研究趋势是将鲁棒损失函数与自动微分框架(JAX、PyTorch)结合,让任意自定义鲁棒损失都可端到端训练。
- 因果推断与机器学习的深度融合:线性回归是因果效应估计(Causal Effect Estimation)的基础工具——双重机器学习(Double/Debiased ML,Chernozhuzhukov 等 2018,用机器学习估计混杂、再用线性回归做残差化的因果估计)在 2024-2025 年被广泛用于观察性研究的政策评估。EconML、DoubleML 等开源库把这套流程标准化,使线性回归成为”机器学习+因果”工作流中不可替代的一环。详见因果推断。
- 自动特征工程与 AutoML:AutoML 工具(如 Auto-sklearn、TPOT、H2O AutoML)在 2025 年已经能把”特征变换选择 + 正则类型选择 + 超参数调优”全流程自动化。线性模型因为训练快、可解释,常被 AutoML 用作低成本试探多组特征工程的快速评估器——先用线性模型筛出有效特征组合,再喂给树模型或神经网络。详见自动机器学习与可解释性。
- 可解释性与”玻璃盒”模型:在金融风控、医疗诊断等高风险领域,监管要求模型可审计。线性回归因权重即解释,在 2025 年的 AI 可解释性浪潮中反而重新受到青睐——研究热点是用 LIME / SHAP 解释复杂模型时,以局部线性回归作为解释代理(Surrogate Model)的标准做法。
- 与图结构 / 核方法的扩展:图正则化回归(Graph-regularized Regression,在损失中加图拉普拉斯项约束相连节点预测相似)和核岭回归(Kernel Ridge Regression,用核函数隐式映射到高维空间,使线性回归能拟合非线性关系)在推荐系统、药物发现等图结构数据上保持活跃。
总的来说,线性回归的”新意”集中在三个交汇点:线性回归 × 因果推断(政策与医学评估)、线性回归 × 隐私计算(联邦与差分隐私)、线性回归 × 可解释性(复杂模型的解释代理)。掌握线性回归的原理,就掌握了一大半理解这些前沿方向的钥匙。
- Friedman, Hastie & Tibshirani,《The Elements of Statistical Learning》第 3 章:线性回归的统计学习圣经,从 OLS 到岭回归、Lasso 推导严谨,是机器学习领域的必读经典。
- Kutner, Nachtsheim, Neter & Li,《Applied Linear Statistical Models》:应用回归分析的标准教材,详尽讲解假设诊断、变量选择、稳健回归等工程实践。
- Tibshirani,“Regression Shrinkage and Selection via the Lasso” (1996):Lasso 原始论文,提出 L1 正则做特征选择,影响深远。
- Hoerl & Kennard,“Ridge Regression” (Technometrics 1970):岭回归原始论文,解释 L2 正则如何解决共线性。
- Belkin, Hsu, Ma & Mandal,“Reconciling modern machine-learning practice and the classical bias–variance trade-off” (PNAS 2019):双下降现象的奠基论文,用线性模型揭示过参数化反而不过拟合。
- Chernozhukov et al.,“Double/Debiased Machine Learning” (Econometrica 2018):用机器学习+线性回归残差化做因果效应估计,催生了 DoubleML / EconML 生态。
- Angrist & Pischke,《Mostly Harmless Econometrics》:从计量经济学角度讲解线性回归的因果解释,适合想理解”相关性 vs 因果性”的读者。也推荐配合最小二乘法与正则化阅读。