线性回归
用特征加权和预测连续数值,通过最小化平方误差学习权重与偏置。
学习前需要掌握
背景与问题
如果想根据面积预测房价、根据广告投入预测销量,输出是一个连续数值。最简单的起点,是假设预测值能够写成输入特征的加权和,再加上一个整体偏移。
线性回归既是可解释的基线,也是理解损失、拟合、残差和正则化的入口。它能帮助检查数据是否具有可利用的关系,但拟合出一条线不等于证明特征对结果有因果影响。
概念定义
单特征线性回归写成预测值等于 w 乘以 x 再加 b。w 表示输入每增加一个单位时预测值的变化,b 表示输入为零时模型给出的基准预测;如果零点不在合理输入范围内,b 未必具有实际业务含义。
多特征情形把多个特征分别乘以权重后相加。这里的“线性”主要指对参数的线性关系:即使把平方项作为输入特征,只要参数仍线性组合,也可以用线性回归求解。
直观理解
把每个样本的真实值与预测值画在同一张图上,两者之间的竖直差称为残差。最小二乘选择参数,让所有残差的平方和尽量小;平方会让正负残差都产生代价,也会更强地惩罚大误差。
有噪声的数据不必被直线逐点穿过。让训练点全部零误差不一定是目标,尤其当数据本身存在测量噪声或模型要预测新的样本时。
核心原理
拟合只使用训练集。确定 w 与 b 之后,对验证集、测试集和未来输入都直接应用同一个预测函数,不应为了让测试预测更好而重新拟合。
最小化平方误差和与最小化平均平方误差,在同一份固定数据上得到相同的最优参数,因为两者只差一个正的常数因子。但 MSE 的单位是目标单位的平方,不能脱离目标的尺度解释数值大小。
多个高度相关的特征可能使权重估计不稳定:预测值相近,并不意味着每个权重都能被稳定地单独解释。异常值也可能显著改变拟合结果,需要结合残差、数据来源和稳健性检查判断。
模型适用范围还取决于输入范围和关系形式。训练数据仅覆盖小面积房屋时,直接外推到极大面积可能不合理;明显弯曲的关系则需要合适的特征或其他模型,而不只是增加训练次数。
数学表达
核心表达
权重和偏置由训练数据 fit;MSE 强调大误差。尺度、异常值、共线性和高维会影响稳定性。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1检查连续目标
- 2划分数据
- 3建立均值基线
- 4拟合线性回归
代码对应位置
示例 1用完整小数据核对权重、偏置与 MSE:拟合上面的三个点,并核对解析解与模型预测。
手算:三个点怎样决定一条拟合直线
使用构造数据 、、。样本均值为 、。当 x 不是常量时,单特征最小二乘解为:
| x | 真实 y | 预测值 | 残差:真实 − 预测 |
|---|---|---|---|
| 1 | 2 | 11/6 ≈ 1.8333 | 1/6 |
| 2 | 3 | 10/3 ≈ 3.3333 | -1/3 |
| 3 | 5 | 29/6 ≈ 4.8333 | 1/6 |
平方残差的平均值为 ,约为 0.055556。输入 x=4 时模型给出约 6.333333,但这个点没有提供真实标签,因此不能凭它计算测试误差。
这个小例子同时说明两件事:拟合线不必穿过每个点;计算出一个新输入的预测值,不等于已经验证这个预测正确。
计算与实现步骤
- 检查连续目标
- 划分数据
- 建立均值基线
- 拟合线性回归
- 查看权重与残差
- 用 MAE/RMSE/R² 评价
代码实现
示例 1
用完整小数据核对权重、偏置与 MSE
example_01.py用途:拟合上面的三个点,并核对解析解与模型预测。
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
x_train = [[1.0], [2.0], [3.0]]
y_train = [2.0, 3.0, 5.0]
model = LinearRegression().fit(x_train, y_train)
prediction = model.predict(x_train)
print(f"w={model.coef_[0]:.6f}, b={model.intercept_:.6f}")
print(f"train_mse={mean_squared_error(y_train, prediction):.6f}")
print(f"x=4 prediction={model.predict([[4.0]])[0]:.6f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
拟合上面的三个点,并核对解析解与模型预测。
y_train- 与 X_train 对齐的训练目标。
model- 组合预处理和估计器的模型对象。
w- 模型权重或当前待优化参数。
b- 偏置项。
Step 1 · 1–2 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_errorStep 2 · 4–10 行
调用 fit 学习训练数据中的参数;若在 Pipeline 中,预处理器与模型会按顺序拟合。
x_train = [[1.0], [2.0], [3.0]]
y_train = [2.0, 3.0, 5.0]
model = LinearRegression().fit(x_train, y_train)
prediction = model.predict(x_train)
print(f"w={model.coef_[0]:.6f}, b={model.intercept_:.6f}")
print(f"train_mse={mean_squared_error(y_train, prediction):.6f}")
print(f"x=4 prediction={model.predict([[4.0]])[0]:.6f}")代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
w=1.500000, b=0.333333 train_mse=0.055556 x=4 prediction=6.333333
常见错误 · 5 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 把相关关系解释成因果关系,或把权重大小直接当成不受单位影响的特征重要性。
- 在测试集上反复选特征、调参数或重新拟合,导致最终评价失去独立性。
- 只看一个总分,不检查残差是否随输入变化、是否由少数异常点主导。
- 把直线延伸到训练范围外仍当成可靠结论,忽略输入分布变化。
实际应用
- 房价预测
- 趋势基线
常见错误
- 把相关关系解释成因果关系,或把权重大小直接当成不受单位影响的特征重要性。
- 在测试集上反复选特征、调参数或重新拟合,导致最终评价失去独立性。
- 只看一个总分,不检查残差是否随输入变化、是否由少数异常点主导。
- 把直线延伸到训练范围外仍当成可靠结论,忽略输入分布变化。
推荐学习资料
Google Machine Learning Crash Course
以短视频、可视化和练习讲解回归、分类、数据、过拟合与神经网络基础。
Google · Google for Developers
资料笔记
An Introduction to Statistical Learning
以较低数学门槛系统讲解回归、分类、重采样、树模型、正则化与无监督学习。
James / Witten / Hastie / Tibshirani / Taylor · StatLearning
资料笔记
StatQuest Machine Learning Videos
用图形和分步推理讲解回归、分类、树模型、聚类、PCA 与评估指标。
Josh Starmer · YouTube