0. 前言
线性回归是机器学习领域最基础、最经典的算法之一。它不仅是统计学的基石,更是通向深度学习、神经网络等高阶模型的"第一级台阶"。很多复杂的算法(如逻辑回归、支持向量机、神经网络)都在不同程度上继承了线性回归的思想。
这篇文章将从数学原理、损失函数推导、求解方法、评估指标、正则化扩展、代码实现到应用场景,为你呈现一份关于线性回归的完整知识图谱。无论你是刚入门的新手,还是希望系统梳理知识的老手,相信都能从中获得收获。
1. 什么是线性回归?
1.1 核心概念
线性回归(Linear Regression)是一种监督学习算法 ,用于建立连续型因变量(目标值) 与一个或多个自变量(特征) 之间的线性关系模型。
通俗地讲,线性回归要解决的问题是:给定一堆数据点,如何找到一条直线(或超平面)最好地"穿过"这些点,使得我们能根据新的输入预测输出。
1.2 历史溯源
线性回归的概念最早可以追溯到1875年。英国统计学家弗朗西斯·高尔顿在研究父代与子代身高关系时,分析了1078对父子的数据,发现身高数据呈正相关趋势,并将这种现象命名为"回归效应"。他给出的表达式正是历史上第一个线性回归模型。
1.3 数学模型
一元线性回归(单特征):y=wx+by=wx+by=wx+b
多元线性回归(多特征):y=w1x1+w2x2+...+wnxn+by=w_{1}x_{1}+w_{2}x_{2}+...+w_{n}x_{n}+by=w1x1+w2x2+...+wnxn+b
用矩阵形式统一表达:y=Xw+by=Xw+by=Xw+b
其中:
- yyy:预测值(目标变量)
- XXX:特征矩阵(每行一个样本,每列一个特征)
- www:权重系数(回归系数)
- bbb:偏置项(截距)
为简化运算,通常将 bbb 吸收进权重向量 www,并在特征矩阵 XXX 中增加一列全1向量。此时模型简化为:y=Xw+by=Xw+by=Xw+b
2. 损失函数:如何衡量"好"与"坏"
有了模型表达式,下一个问题是:如何评价一组参数 www 的好坏?我们需要一个量化指标来衡量预测值 与真实值 之间的差距------这就是损失函数。
2.1 最小二乘法
线性回归最常用的损失函数是均方误差 (Mean Squared Error, MSE),也称最小二乘法:
J(w)=∑i=1m(yi−y^i)2=∑i=1m(yi−Xiw)2 J(w) = \sum_{i=1}^{m} (y_i - \hat{y}i)^2 = \sum{i=1}^{m} (y_i - X_i w)^2 J(w)=i=1∑m(yi−y^i)2=i=1∑m(yi−Xiw)2
矩阵形式:
J(w)=(y−Xw)T(y−Xw) J(w) = (y - Xw)^T (y - Xw) J(w)=(y−Xw)T(y−Xw)
我们的目标:找到一组 www,使 J(w)J(w)J(w) 最小。
2.2 概率视角:极大似然估计
为什么最小二乘法是合理的?我们可以从概率角度解释。
假设真实值 = 预测值 + 噪声,且噪声 ϵ\epsilonϵ 服从均值为0、方差为 σ2\sigma^2σ2 的正态分布:
y=Xw+ϵ,ϵ∼N(0,σ2) y = Xw + \epsilon, \quad \epsilon \sim N(0, \sigma^2) y=Xw+ϵ,ϵ∼N(0,σ2)
那么 yyy 的概率密度函数为:
P(y∣X;w)=12πσexp(−(y−Xw)22σ2) P(y \mid X; w) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left( -\frac{(y - Xw)^2}{2\sigma^2} \right) P(y∣X;w)=2π σ1exp(−2σ2(y−Xw)2)
对所有样本求极大似然估计,经过对数变换后,最大化似然函数等价于最小化 (y−Xw)2(y - Xw)^2(y−Xw)2------这正是最小二乘法。
结论:在误差服从正态分布的假设下,最小二乘法与极大似然估计是等价的。
3. 参数求解方法
有了目标函数,接下来就是如何求解最优参数 www。主要有两条路径:解析解法(正规方程) 和 迭代优化法(梯度下降)。
3.1 正规方程法(Normal Equation)
正规方程通过对损失函数求导并令导数为0,直接得到解析解。推导过程:
∂J(w)∂w=2XT(Xw−y)=0 \frac{\partial J(w)}{\partial w} = 2X^T (Xw - y) = 0 ∂w∂J(w)=2XT(Xw−y)=0
解得:
w=(XTX)−1XTy w = (X^T X)^{-1} X^T y w=(XTX)−1XTy
优点:
- 无需选择学习率
- 一次性计算出最优解
- 小数据集上高效
缺点:
- 计算 (XTX)−1(X^TX)^{-1}(XTX)−1 时间复杂度 O(n3)O(n^3)O(n3),特征数量大时极慢
- 当 XTXX^TXXTX 不可逆(特征数>样本数、特征间存在多重共线性)时无法求解
- 不能很好地处理过拟合问题
适用场景:特征数量 < 1万,且样本数量适中。
3.2 梯度下降法(Gradient Descent)
梯度下降是计算机科学家的解法------不求一步到位,而是步步为营。
思想:沿着损失函数下降最快的方向(负梯度方向)逐步更新参数,直到收敛。
更新公式:
w:=w−α∂J(w)∂w w := w - \alpha \frac{\partial J(w)}{\partial w} w:=w−α∂w∂J(w)
其中 α\alphaα 是学习率(步长),∂J(w)∂w=2mXT(Xw−y)\frac{\partial J(w)}{\partial w} = \frac{2}{m}X^T(Xw - y)∂w∂J(w)=m2XT(Xw−y)(取平均后)
三种常见变体:
| 方法 | 英文缩写 | 每次迭代使用数据量 | 特点 |
|---|---|---|---|
| 批量梯度下降 | BGD | 全部训练样本 | 准确、稳定,但大数据集极慢 |
| 随机梯度下降 | SGD | 1个随机样本 | 快、可在线学习,但波动大 |
| 小批量梯度下降 | MBGD | n个样本(如16/32/64) | 工业界最常用,平衡效率与稳定性 |
4. 模型评估指标
训练完模型,如何评价它的好坏?线性回归有一套完整的评估指标体系。
| 指标 | 公式 | 含义 | 备注 |
|---|---|---|---|
| 均方误差(MSE) | 1m∑(yi−y^i)2\frac{1}{m}\sum (y_i - \hat{y}_i)^2m1∑(yi−y^i)2 | 误差平方的平均值 | 对异常值敏感 |
| 均方根误差(RMSE) | MSE\sqrt{MSE}MSE | 误差的平均幅度 | 与原始数据单位一致 |
| 平均绝对误差(MAE) | $\frac{1}{m}\sum | y_i - \hat{y}_i | $ |
| 决定系数(R2R^2R2) | 1−∑(yi−y^i)2∑(yi−yˉ)21 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}1−∑(yi−yˉ)2∑(yi−y^i)2 | 模型解释了数据中多少方差 | 范围[0,1],越接近1越好 |
| 调整后R2R^2R2 | 1−(1−R2)(n−1)n−p−11 - \frac{(1-R^2)(n-1)}{n-p-1}1−n−p−1(1−R2)(n−1) | 惩罚多余特征 | 用于多元回归特征选择 |
| AIC/BIC | - | 权衡拟合度与模型复杂度 | 越小越好 |
重要提示 :R2R^2R2 随特征数量增加只增不减,即使加入无关特征也会上升。因此多元回归中应优先参考调整后R2R^2R2。
5. 过拟合与正则化
线性回归虽然简单,但同样面临过拟合问题------模型在训练集上表现极好,在测试集上却一塌糊涂。
5.1 过拟合的表现
- 权重系数 www 的绝对值非常大
- 模型对训练数据中的噪声也进行了拟合
- 微小扰动导致预测结果剧烈变化
5.2 正则化:给损失函数加约束
核心思想:在损失函数中加入惩罚项,限制权重的大小,防止模型过于复杂。
| 方法 | 惩罚项 | 特点 | 适用场景 |
|---|---|---|---|
| 岭回归(Ridge) | L2L_2L2:λ∑wj2\lambda \sum w_j^2λ∑wj2 | 权重缩小但不归零 | 所有特征都有用 |
| Lasso回归 | L1L_1L1:$\lambda \sum | w_j | $ |
| 弹性网络(Elastic Net) | $\lambda_1 \sum | w_j | + \lambda_2 \sum w_j^2$ |
正则化后的解析解(以Ridge为例): w = (X\^T X + \\lambda I)\^{-1} X\^T y
这个公式解决了 XTXX^TXXTX 不可逆的问题------加 λI\lambda IλI 后矩阵一定可逆。
5.3 超参数选择
正则化系数 λ\lambdaλ 需要通过交叉验证 来确定。近期研究还提出了多惩罚Ridge回归 ,为每个特征分配不同的 λ\lambdaλ,通过双层优化自动学习,效果优于传统正则化方法。
6. 代码实战:从数据到模型
下面以波士顿房价预测为例,演示线性回归的完整流程(注:波士顿房价数据集虽已从sklearn移除,但仍是经典教学案例,此处仅作演示)。
6.1 数据准备与预处理
python
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, Lasso
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
# 加载数据
housing = fetch_california_housing()
X, y = housing.data, housing.target
# 训练/测试集划分
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 特征标准化(重要!)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 只用训练集的均值和标准差
6.2 模型训练与对比
python
# 1. 正规方程法(LinearRegression默认使用)
lr = LinearRegression()
lr.fit(X_train_scaled, y_train)
y_pred_lr = lr.predict(X_test_scaled)
# 2. 梯度下降法(SGDRegressor)
sgd = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, random_state=42)
sgd.fit(X_train_scaled, y_train)
y_pred_sgd = sgd.predict(X_test_scaled)
# 3. 岭回归(L2正则化)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train_scaled, y_train)
y_pred_ridge = ridge.predict(X_test_scaled)
# 4. Lasso回归(L1正则化)
lasso = Lasso(alpha=0.1)
lasso.fit(X_train_scaled, y_train)
y_pred_lasso = lasso.predict(X_test_scaled)
6.3 模型评估
python
def evaluate_model(name, y_true, y_pred):
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_true, y_pred)
print(f"{name:12s} | MSE: {mse:.2f} | RMSE: {rmse:.2f} | R²: {r2:.4f}")
print("模型性能对比:")
print("-" * 60)
evaluate_model("线性回归", y_test, y_pred_lr)
evaluate_model("SGD回归", y_test, y_pred_sgd)
evaluate_model("岭回归", y_test, y_pred_ridge)
evaluate_model("Lasso", y_test, y_pred_lasso)
模型性能对比:
------------------------------------------------------------
线性回归 | MSE: 0.56 | RMSE: 0.75 | R²: 0.5758
SGD回归 | MSE: 0.55 | RMSE: 0.74 | R²: 0.5798
岭回归 | MSE: 0.56 | RMSE: 0.75 | R²: 0.5758
Lasso | MSE: 0.68 | RMSE: 0.82 | R²: 0.4814
6.4 系数分析(模型可解释性)
python
# 查看特征重要性
feature_names = housing.feature_names
coef_df = pd.DataFrame({
'feature': feature_names,
'coef_lr': lr.coef_,
'coef_ridge': ridge.coef_,
'coef_lasso': lasso.coef_
})
print(coef_df.sort_values('coef_lr', key=abs, ascending=False))
feature coef_lr coef_ridge coef_lasso
6 Latitude -0.896929 -0.896168 -0.011469
7 Longitude -0.869842 -0.869071 -0.000000
0 MedInc 0.854383 0.854327 0.710598
3 AveBedrms 0.339259 0.339008 0.000000
2 AveRooms -0.294410 -0.294210 -0.000000
1 HouseAge 0.122546 0.122624 0.106453
5 AveOccup -0.040829 -0.040833 -0.000000
4 Population -0.002308 -0.002282 -0.000000
线性回归的最大优势之一就是可解释性------权重 wjw_jwj 直接反映了特征 xjx_jxj 每变化一个单位对目标值的影响程度。
7. 线性回归的局限与扩展
7.1 局限性
| 局限 | 说明 | 解决方法 |
|---|---|---|
| 只能拟合线性关系 | 对非线性数据效果差 | 多项式回归、特征变换 |
| 对异常值敏感 | 最小二乘法放大了大误差的影响 | 稳健回归(Huber回归、RANSAC) |
| 特征间需独立 | 多重共线性导致系数不稳定 | 岭回归、主成分分析 |
| 数据需服从正态分布假设 | 严格来说要求误差正态 | 广义线性模型 |
7.2 扩展方法
-
多项式回归
通过增加 x2,x3,x1x2x^2, x^3, x_1x_2x2,x3,x1x2 等高次项,使线性模型能够拟合非线性关系。
-
广义线性模型(GLM)
通过连接函数,将线性回归扩展到非正态分布的因变量(如泊松回归、逻辑回归)。
-
贝叶斯线性回归
为参数引入先验分布,在小样本和在线学习场景表现优异。
-
稳健线性回归
针对异常值设计的鲁棒估计算法,最新研究已扩展到在线学习和多元场景。
8. 典型应用场景
线性回归虽简单,但因其高效、可解释、易部署的优势,在工业界应用极为广泛:
- 🏠 房价预测:面积、房间数、地段 → 房价
- 📈 销量预测:历史销量、促销力度、季节 → 未来销量
- 💰 金融风控:收入、负债、信用分 → 违约概率(配合逻辑回归)
- 🏥 医疗诊断:年龄、体重、血压 → 疾病风险指数
- ⚙️ 工业控制:温度、压力、转速 → 设备寿命预测
- 📱 互联网广告:用户画像、点击历史 → 广告点击率(CTR预估)
9. 总结与学习建议
线性回归是机器学习的"Hello World ",但它绝不只是一个入门玩具。它所承载的建模思想、损失函数设计、优化方法、正则化策略,几乎可以映射到所有监督学习算法中。
学习建议:
- 手推公式:正规方程、梯度下降至少亲手推导一遍
- 对比实验:在同一数据集上比较正规方程、SGD、Ridge、Lasso的差异
- 诊断模型:学会看残差图、Q-Q图,判断模型假设是否满足
- 思考本质:为什么MSE是凸函数?为什么梯度下降能找到全局最优?------因为线性回归的损失函数是凸函数,没有局部极小值困扰