【机器学习】(1)—— 线性回归
线性回归:从一条直线到预测模型
目录
- 线性回归:从一条直线到预测模型
- 1. 为什么从线性回归开始
- 2. 问题定义:特征、标签与预测
- 3. 线性回归方程
- 3.1 单特征情形
- 3.2 多特征情形
- 3.3 向量化写法
- 4. 训练时到底在更新什么
- 5. 损失函数:如何衡量「够好」
- 5.1 残差与均方误差
- 5.2 从几何直觉理解
- 6. 梯度下降:如何找到最优参数
- 6.1 核心思路
- 6.2 学习率:最重要的超参数之一
- 6.3 批量、随机与小批量
- 6.4 收敛与解析解
- 7. 线性回归的能力边界
- 7.1 适合的场景
- 7.2 局限与应对
- 8. 一个完整的训练流程回顾
- 9. 小结
1. 为什么从线性回归开始
线性回归是机器学习里最基础、也最有代表性的监督学习模型之一。它形式简单,却几乎涵盖了机器学习训练流程中的全部核心环节:特征与标签、模型参数、损失函数、优化算法、超参数调优。
理解线性回归,等于拿到了一把钥匙——后面遇到的逻辑回归、神经网络,本质上都是在更复杂的结构里做类似的事情:用参数把输入映射到输出,再用数据把参数调到合适的位置。
本篇以「预测汽车油耗」为例,把线性回归从直觉、公式到训练过程串起来讲清楚。
2. 问题定义:特征、标签与预测
假设我们想根据汽车的重量,预测它的燃油效率(英里/加仑,MPG)。手头有这样一份数据:
| 重量(千磅) | 油耗 MPG(标签) |
|---|---|
| 3.5 | 18 |
| 3.69 | 15 |
| 3.44 | 18 |
| 3.43 | 16 |
| 4.34 | 15 |
| 4.42 | 14 |
| 2.37 | 24 |
把数据画成散点图,可以观察到一个清晰的规律:车越重,油耗(MPG)往往越低。这不是严格的物理定律,而是数据呈现出的统计趋势。
在机器学习的语境下:
| 概念 | 含义 | 本例中 |
|---|---|---|
| 特征(Feature) | 模型的输入 | 汽车重量 |
| 标签(Label) | 希望预测的真实值 | 油耗 MPG |
| 预测值(Prediction) | 模型输出的估计值 | 记作 y’ |
我们的目标,是找到一种从「重量」到「油耗」的映射关系,使得预测值尽量接近真实标签。
3. 线性回归方程
3.1 单特征情形
中学数学里,直线方程是:
y = m x + b y = mx + by=mx+b
其中m mm是斜率,b bb是截距。机器学习里习惯写成:
y ′ = b + w 1 x 1 y' = b + w_1 x_1y′=b+w1x1
各项含义如下:
| 符号 | 名称 | 说明 |
|---|---|---|
| y’ | 预测标签 | 模型输出 |
| b | 偏置(Bias) | 对应直线截距,有时也记作 w0 |
| w1 | 权重(Weight) | 对应直线斜率,衡量特征对预测的影响方向和强度 |
| x1 | 特征 | 输入数据,训练过程中不会被修改 |
偏置和权重统称为模型参数(Parameter)。它们不是人工指定的,而是在训练阶段由算法从数据中学习得到。
对上面的汽车数据,拟合出的直线大致满足:截距b ≈ 34 b \approx 34b≈34,斜率w 1 ≈ − 4.6 w_1 \approx -4.6w1≈−4.6。模型可写为:
y ′ = 34 + ( − 4.6 ) × x 1 y' = 34 + (-4.6) \times x_1y′=34+(−4.6)×x1
代入一辆 4000 磅(即x 1 = 4.0 x_1 = 4.0x1=4.0)的车:
y ′ = 34 + ( − 4.6 ) × 4.0 = 15.6 y' = 34 + (-4.6) \times 4.0 = 15.6y′=34+(−4.6)×4.0=15.6
预测结果约为15.6 MPG。
这就是线性回归做预测的基本方式:一次乘法、一次加法。
3.2 多特征情形
真实问题很少只依赖一个特征。预测油耗时,还可以引入:
- 发动机排量
- 百公里加速时间
- 气缸数
- 马力
多特征模型的形式是自然延伸:
y ′ = b + w 1 x 1 + w 2 x 2 + w 3 x 3 + w 4 x 4 + w 5 x 5 y' = b + w_1 x_1 + w_2 x_2 + w_3 x_3 + w_4 x_4 + w_5 x_5y′=b+w1x1+w2x2+w3x3+w4x4+w5x5
每个特征有各自独立的权重。排量和重量通常与 MPG 呈负相关(数值越大,油耗越低);加速时间越长(车越「肉」),MPG 往往反而更高——这些都可以被不同的w i w_iwi捕捉。
3.3 向量化写法
特征一多,展开写很冗长。工程实现中更常用向量形式:
y ′ = w T x + b y' = \mathbf{w}^T \mathbf{x} + by′=wTx+b
其中x = [ x 1 , x 2 , … , x n ] T \mathbf{x} = [x_1, x_2, \ldots, x_n]^Tx=[x1,x2,…,xn]T,w = [ w 1 , w 2 , … , w n ] T \mathbf{w} = [w_1, w_2, \ldots, w_n]^Tw=[w1,w2,…,wn]T。批量训练时,还会把许多样本叠成矩阵,一次性算出所有预测值——这是后续用 NumPy、PyTorch 写代码时的标准姿势。
4. 训练时到底在更新什么
一个常见误区是把「预测值」也当成要学习的对象。实际上:
| 对象 | 训练时是否更新 |
|---|---|
| 偏置 b、权重 wi | 是— 这是训练的核心 |
| 特征 xi | 否— 来自数据集 |
| 预测值 y’ | 否— 由参数和特征计算得出 |
训练的本质,就是在海量可能的参数组合中,找到让预测「足够好」的那一组。
5. 损失函数:如何衡量「够好」
5.1 残差与均方误差
对每个样本i ii,残差(Residual)是预测值与真实值的差,记为:
e i = y i ′ − y i e_i = y'_i - y_iei=yi′−yi
残差可正可负,直接相加会互相抵消。因此回归任务最常用的损失函数是均方误差(MSE, Mean Squared Error):
L = 1 N ∑ i = 1 N ( y i ′ − y i ) 2 L = \frac{1}{N} \sum_{i=1}^{N} (y'_i - y_i)^2L=N1i=1∑N(yi′−yi)2
MSE 有几个优点:
- 处处可导,便于用梯度下降等优化方法;
- 对大误差更敏感(平方放大),促使模型认真对待偏离较远的样本;
- 形式简洁,与「最小二乘法」在数学上等价。
有时也使用均方根误差(RMSE),即对 MSE 开方:
R M S E = L \mathrm{RMSE} = \sqrt{L}RMSE=L
其单位与标签一致,更易向业务方解释。
5.2 从几何直觉理解
在单特征情形下,最小化 MSE 等价于找一条直线,使所有数据点到直线的竖直距离平方和最小——这就是「最小二乘拟合」的几何含义。参数b bb和w 1 w_1w1确定直线位置,损失函数衡量直线与数据的贴合程度。
6. 梯度下降:如何找到最优参数
6.1 核心思路
参数空间可以看作一座「地形图」,损失函数是海拔高度。训练的目标,是走到海拔最低的山谷。
梯度下降(Gradient Descent)的做法很直接:
- 随机或按顺序取一组初始参数;
- 计算损失函数对各个参数的梯度(偏导数),梯度指向损失上升最快的方向;
- 沿梯度的反方向走一小步,更新参数;
- 重复,直到损失足够小或达到迭代上限。
单变量权重w 1 w_1w1的更新公式:
w 1 ← w 1 − η ∂ L ∂ w 1 w_1 \leftarrow w_1 - \eta \frac{\partial L}{\partial w_1}w1←w1−η∂w1∂L
偏置b bb同理。η \etaη是学习率(Learning Rate),控制每步迈多大。
6.2 学习率:最重要的超参数之一
学习率η \etaη不在训练数据中「学」出来,而是训练前由人设定的超参数(Hyperparameter)。
| 学习率情况 | 典型表现 |
|---|---|
| 过大 | 损失震荡甚至发散,参数越过最优点 |
| 过小 | 收敛极慢,训练时间大幅拉长 |
| 适中 | 损失平稳下降,较快逼近最优 |
实践中常采用「先试几个数量级」的策略,例如10 − 1 10^{-1}10−1、10 − 2 10^{-2}10−2、10 − 3 10^{-3}10−3,观察损失曲线再定夺。线性回归因为损失面相对光滑,通常比深度网络更容易调。
6.3 批量、随机与小批量
按每次更新使用多少样本,梯度下降有三种常见变体:
| 方法 | 每次更新使用的样本 | 特点 |
|---|---|---|
| 批量梯度下降(BGD) | 全部 N 个 | 稳定,但数据量大时慢 |
| 随机梯度下降(SGD) | 1 个 | 快、有噪声,有助于逃离浅局部极小 |
| 小批量梯度下降(Mini-batch) | 一批(如 32、64) | 工程上最常用,兼顾速度与稳定性 |
现代框架默认基本都是 Mini-batch SGD 及其改进变体(如 Adam)。线性回归数据量不大时,用全部样本做一次 BGD 也完全可行。
6.4 收敛与解析解
线性回归有一个「捷径」:在特征不多、矩阵可逆时,可以直接用正规方程(Normal Equation)算出闭式解,不必迭代:
w = ( X T X ) − 1 X T y \mathbf{w} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y}w=(XTX)−1XTy
但当特征维度很高(成千上万)或数据量极大时,矩阵求逆代价过高,梯度下降反而更实用。理解梯度下降,是为了掌握更复杂模型里通用的优化范式。
7. 线性回归的能力边界
线性回归强大,但不是万能的。认清它的适用边界,能避免很多踩坑。
7.1 适合的场景
- 特征与标签之间近似线性;
- 需要可解释性(每个权重直接表示特征贡献);
- 作为复杂模型的基线(Baseline),快速验证数据和特征是否有效。
7.2 局限与应对
| 局限 | 说明 | 常见应对 |
|---|---|---|
| 只能拟合线性关系 | 对抛物线、周期性等模式力不从心 | 特征工程:多项式特征、交叉特征 |
| 对异常值敏感 | MSE 会放大大误差的影响 | 换用 MAE 损失,或清洗异常点 |
| 多重共线性 | 特征高度相关时,权重不稳定 | 删除冗余特征、L2 正则化 |
| 外推风险 | 超出训练数据范围的预测不可靠 | 限制预测区间,或换更合适的模型 |
例如,重量与 MPG 在观测范围内近似线性,但若把模型外推到「10 吨重卡」,预测结果很可能失真——因为训练数据里根本没有这个区间。
8. 一个完整的训练流程回顾
把以上内容串成实际工作中的步骤:
1. 准备数据 -> 划分特征 x 与标签 y,必要时做归一化 2. 初始化参数 -> b、w 置零或随机小值 3. 前向计算 -> y' = b + w * x 4. 计算损失 -> MSE(y', y) 5. 反向求梯度 -> dL/db, dL/dw 6. 更新参数 -> 沿梯度反方向走,步长由学习率控制 7. 重复 3-6 -> 直到收敛 8. 评估与部署 -> 在验证集上看 RMSE,满意后用于推理其中第 3-6 步就是几乎所有可训练模型共同拥有的「训练循环」。神经网络只是把线性映射换成了多层非线性变换,其余骨架不变。
9. 小结
线性回归用一条直线(或高维空间里的一个超平面)描述特征与标签的关系。模型本身很简单,但训练它的过程——定义损失、算梯度、调学习率、观察收敛——与深度学习并无本质区别。下一篇可以继续深入逻辑回归,看看当标签不再是连续数值、而是「是/否」这类分类问题时,模型形式和损失函数如何相应变化。
系列导航:
- 下一篇:【机器学习】(2)—— 线性回归:损失函数
