Skip to content

线性回归

线性回归是所有机器学习算法的鼻祖——用一条直线(多维时是超平面)去拟合自变量与因变量之间的关系,简单、可解释、计算高效。它既是最小二乘法的最经典应用,也是理解逻辑回归、神经网络等更复杂模型的起点。前置阅读:监督学习。

把线性回归想象成用尺子在散点图上画一条最贴数据的直线:

  • “线性”指对参数线性:y=a⋅x+by = a \cdot x + b 是线性,y=a⋅x1+b⋅x2+cy = a \cdot x_1 + b \cdot x_2 + c 也是线性,甚至 y=a⋅x2+b⋅xy = a \cdot x^2 + b \cdot x 对参数 a、b 而言也是线性(只要把 x2x^2 当作一个新特征)。“线性”不是限制特征的形式,而是限制参数进入模型的方式。
  • “回归”指拟合连续值:与分类相对,目标是预测一个连续的数值(房价、温度、销量),而不是离散类别。
  • “最佳拟合”的标准:让所有数据点到这条线的”垂直距离平方和”最小——这就是最小二乘准则。平方让正负误差不抵消,且自然地重罚大误差。

为什么是”平方和”而不是”绝对值和”?因为当误差服从正态分布(Normal Distribution,即高斯分布,自然界中测量误差最常见的分布形态)时,最小化平方误差恰好等价于最大似然估计(Maximum Likelihood Estimation, MLE,即”选择让已观测数据出现概率最大的参数”)——平方损失有坚实的统计学依据。

给定 n 个特征 x1 到 xn,权重 w1 到 wn,偏置 b,线性回归模型为:

y^=w1⋅x1+w2⋅x2+⋯+wn⋅xn+b\hat{y} = w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_n \cdot x_n + b

矩阵形式记作 y^=X⋅w+b\hat{y} = X \cdot w + b,其中 X 是设计矩阵(Design Matrix,每行一个样本、每列一个特征的矩阵),w 是权重向量。为了把偏置 b 也纳入矩阵运算,通常在 X 左侧补一列全 1,把 b 并入 w 向量的首位,这样模型就简化为 y^=X⋅w\hat{y} = X \cdot w。

最常用的损失是均方误差(MSE, Mean Squared Error)——所有样本预测值与真实值之差的平方再求平均:

MSE=1m∑(y^i−yi)2\text{MSE} = \frac{1}{m} \sum (\hat{y}_i - y_i)^2

其中 m 是样本数。MSE 是权重 w 的二次函数,全局只有一个最小值(凸函数,Convex Function,形如碗状、任意两点连线仍在函数图像上方的函数),因此一定能找到全局最优——这是线性回归”好求解”的根本原因。

从概率角度推导 MSE:假设每个真实值 y_i = X_i·w + ε_i,其中噪声 ε_i 独立地服从均值为 0、方差为 σ² 的正态分布。那么在给定 X_i 和 w 时,y_i 出现的概率密度为:

p(yi∣Xi,w)=12πσ2⋅exp⁡(−(yi−Xi⋅w)22σ2)p(y_i \mid X_i, w) = \frac{1}{\sqrt{2\pi\sigma^2}} \cdot \exp\left( -\frac{(y_i - X_i \cdot w)^2}{2\sigma^2} \right)

全部 m 个样本同时出现的概率(似然函数 Likelihood)是各项相乘:

L(w)=∏p(yi∣Xi,w)L(w) = \prod p(y_i \mid X_i, w)

取对数(把乘法变成加法,单调性不变所以不改变最优解)并去掉与 w 无关的常数项后,最大化对数似然等价于最小化 ∑(yi−Xi⋅w)2\sum (y_i - X_i \cdot w)^2——这正好就是 MSE。这个推导告诉我们:用 MSE 等价于默认噪声是正态的。如果噪声是重尾(Heavy-tailed,极端值出现概率远高于正态分布的情况,如金融收益),MSE 会被离群点严重带偏,此时改用 Huber 损失(平方与绝对值的平滑混合)或分位数回归(Quantile Regression,拟合某个百分位数而非均值)更稳健。

有两种主流求解路径:

解析解(正规方程 Normal Equation):当特征数不太大时,可以一步求出精确最优解。推导思路是对 MSE 求梯度并令其为零:

∂MSE∂w=2m⋅XT⋅(X⋅w−y)=0  ⟹  XTX⋅w=XTy  ⟹  w=(XTX)−1⋅XTy\frac{\partial \text{MSE}}{\partial w} = \frac{2}{m} \cdot X^T \cdot (X \cdot w - y) = 0 \implies X^T X \cdot w = X^T y \implies w = (X^T X)^{-1} \cdot X^T y

这是最小二乘法的直接结果。直觉上,XTXX^T X 是特征之间的协方差结构,XTyX^T y 是特征与目标的相关结构,相除就得到”在特征相关约束下、对目标的最佳响应”。缺点:求矩阵逆的计算量随特征数立方增长(O(n³)),且当特征高度共线时 XTXX^T X 接近不可逆(行列式趋近 0),数值不稳定。工程实践中通常用 SVD(Singular Value Decomposition,奇异值分解,将矩阵分解为旋转-缩放-旋转三个矩阵的乘积)分解代替直接求逆,如 numpy.linalg.lstsq,既稳定又能处理非方阵。

梯度下降(Gradient Descent):当样本或特征数很大时(如百万级),求逆代价过高,改用梯度下降迭代逼近——这也是深度学习框架内部的做法。梯度形式简洁:∂MSE∂w=2m⋅XT⋅(X⋅w−y)\frac{\partial \text{MSE}}{\partial w} = \frac{2}{m} \cdot X^T \cdot (X \cdot w - y),每步沿梯度反方向更新 w。梯度下降有几个变体值得知道:

  • 批梯度下降(Batch GD):每步用全部样本算梯度,稳定但慢。
  • 随机梯度下降(SGD, Stochastic Gradient Descent):每步只取一个样本,更新频繁、能跳出局部结构,但噪声大。
  • 小批量梯度下降(Mini-batch GD):每步取几十到几百个样本,是深度学习训练的默认选择。

对于线性回归这种凸问题,SGD 通常配学习率衰减(Learning Rate Decay,随训练步数逐步缩小步长)就能稳定收敛。

裸 MSE 在特征多、样本少,或特征高度相关时会过拟合(权重变得极大)。加正则项(Regularization Term,对权重幅度施加额外惩罚的项)约束权重幅度:

  • 岭回归(Ridge / L2):损失加上 λ⋅∥w∥2\lambda \cdot \|w\|^2,惩罚权重大小但不会压到 0,适合特征都有用但需稳定的情况。几何直觉:约束权重落在一个半径为 t 的球内。
  • Lasso(L1):损失加上 λ⋅∥w∥1\lambda \cdot \|w\|_1(权重绝对值之和),会把不重要特征的权重精确压到 0,自动做特征选择,产出稀疏解(Sparse Solution,大部分分量为 0 的向量)。几何直觉:L1 约束区域是菱形(有棱角),等高线与棱角相切的概率远高于与圆边相切,切点恰好在坐标轴上——这就是 Lasso 能产生稀疏解的几何原因。
  • ElasticNet:L1 与 L2 混合(损失加 λ1⋅∥w∥1+λ2⋅∥w∥2\lambda_1 \cdot \|w\|_1 + \lambda_2 \cdot \|w\|^2),兼顾稀疏性与稳定性。当多个相关特征都重要时,纯 Lasso 倾向于只保留其中一个、丢弃其余,ElasticNet 能把它们一起保留。

正则强度 λ 是关键超参数,一般用交叉验证(Cross-Validation,把数据反复划分为训练/验证集来评估不同超参数的表现)选取。详见正则化与交叉验证。

经典线性回归(OLS, Ordinary Least Squares,普通最小二乘)依赖几个假设,违反时模型仍能算出结果,但统计性质不再成立:

  • 线性关系:y 与特征的线性组合相关(而非与原始特征本身)——可以通过多项式特征、对数变换等让非线性关系也能用线性回归建模。
  • 误差独立同分布:残差之间不相关,方差恒定(无异方差 Heteroscedasticity,即残差的波动幅度不随预测值大小而变化)。
  • 特征无完全共线:否则 XTXX^T X 不可逆,需正则化处理。
  • 误差近似正态:保证置信区间、p 值等统计推断(Statistical Inference,从样本数据对总体参数做出带概率保证的结论)有效。

下图直观展示正则化的几何差异:等高线是 MSE 损失的等值线,阴影区域是正则约束的可行域,切点即最优解。

from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.datasets import make_regression
from 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}")
import numpy as np
# 构造数据:y ≈ 3x + 2
X = 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 @ y
print("偏置 b ≈", round(w[0], 3), "斜率 ≈", round(w[1], 3))
# 输出:偏置 b ≈ 2.0 斜率 ≈ 3.0(与生成参数一致)
import numpy as np
# 同样的数据:y ≈ 3x + 2
X = 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.0
lr = 0.1
for 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_b
print(f"收敛后 w ≈ {w:.3f}(标准化空间),b ≈ {b:.3f}")
# 把标准化空间的 w 还原回原始尺度
w_orig = w / sigma
b_orig = b - w_orig * mu
print(f"原始尺度:斜率 ≈ {w_orig:.3f},偏置 ≈ {b_orig:.3f}")
from sklearn.linear_model import RidgeCV
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from 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}")
import statsmodels.api as sm
import 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,再判断深度模型是否真的值得引入额外复杂度。
  • 趋势分解:时间序列分析中,用线性回归拟合长期趋势项,再分离季节性与残差。
  • 因果效应估计(双重差分 / 合成控制):政策评估中,用线性回归估计”干预前后的差异减去未干预组的变化”,这是因果推断的核心工具。
类库语言说明
sklearn.linear_model.LinearRegressionPython最常用 OLS 实现,接口简洁
sklearn.linear_model.Ridge / Lasso / ElasticNetPython带正则化的线性回归,含交叉验证版本 RidgeCV / LassoCV
sklearn.linear_model.HuberRegressor / RANSACRegressorPython鲁棒回归,抗离群点
statsmodels.OLSPython统计学风格,输出 p 值、置信区间、F 检验、残差诊断
numpy.linalg.lstsqPython底层最小二乘求解器,基于 SVD,数值稳定
glmnetR / PythonLasso / ElasticNet 高效实现,处理高维稀疏数据
scikit-learn SGDRegressorPython用随机梯度下降训练,适合超大规模数据
术语英文解释
线性回归Linear Regression用线性模型拟合连续型目标变量的监督学习方法
均方误差Mean Squared Error, MSE预测值与真实值之差的平方的均值,最常用回归损失
决定系数R² / Coefficient of Determination模型解释的目标方差比例,0 到 1 之间,越接近 1 越好
正规方程Normal EquationOLS 的解析解 w=(XTX)−1XTyw = (X^T X)^{-1} X^T y,一步求出最优权重
岭回归Ridge Regression加 L2 正则的线性回归,缓解共线性,权重趋小但不为 0
LassoLasso Regression加 L1 正则的线性回归,产生稀疏解,可做特征选择
ElasticNetElastic NetL1 与 L2 混合正则,兼顾稀疏性与稳定性
共线性Multicollinearity特征之间高度相关,导致 OLS 权重不稳定
异方差Heteroscedasticity残差方差不恒定,违反 OLS 假设,影响统计推断
残差Residual真实值与预测值之差,用于诊断模型假设是否成立
最大似然估计Maximum Likelihood Estimation, MLE选择让已观测数据出现概率最大的参数的估计方法
凸函数Convex Function碗状函数,只有一个全局最小值,保证梯度下降收敛到最优
稀疏解Sparse Solution大部分分量为 0 的解向量,Lasso 的典型产物
方差膨胀因子Variance Inflation Factor, VIF衡量某特征被其他特征线性解释的程度,>10 提示严重共线

线性回归作为一个”已收敛”的经典方法,近年来的进展不在于算法本身的重写,而在于它与新需求(大规模、高维、隐私、可解释、因果)的结合方式。以下是值得关注的几个方向:

  • 高维统计的”双下降”现象:当特征数 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 因果性”的读者。也推荐配合最小二乘法与正则化阅读。