偏差、方差与学习曲线
高偏差表现为训练验证都差,高方差表现为训练好而验证落后;学习曲线观察数据量增加时二者变化。
学习前需要掌握
背景与问题
模型表现不好,可能是很多训练集上都学不到主要趋势,也可能是对训练样本的小变化过于敏感。偏差与方差提供不同解释,但真实任务中无法只看一次拟合就精确分离它们。
学习曲线通过改变数据量或训练过程,比较训练与验证表现,帮助提出诊断假设;它需要与数据质量、优化状态及划分设计结合。
概念定义
在常见平方误差分析中,偏差描述模型平均预测与目标规律之间的系统差异,方差描述更换训练数据后预测的波动,另外还存在无法仅靠模型消除的噪声。
学习曲线不是偏差方差的直接测量仪。它显示某个指标随训练样本量或轮数变化的情况,相关曲线形态可以提供线索,但不能替代对问题来源的检查。
直观理解
许多模型始终预测得差不多、却整体偏离目标,可以直观理解为偏差较大;不同训练样本让预测大幅摆动,则提示对数据敏感。稳定地错与不稳定地对,都需要不同改进。
固定输入上的三次模型预测
设某个输入的无噪声目标为 10。第一组模型预测 [6,6,6],平均为 6,平方偏差为 16,方差为 0;第二组预测 [6,10,14],平均为 10,平方偏差为 0,平均平方波动为 32/3≈10.6667。
这个构造例子只展示固定输入上的分解。它不是从真实学习曲线估计出的性能,也不表示波动模型一定更好;真实数据还可能包含不可约噪声。
核心原理
要先明确纵轴方向:误差越低越好,准确率或 R² 等得分通常越高越好。不能把两套图形规则的“高、低”混用;训练与验证还必须采用同一定义。
训练和验证都表现差且接近,可能是表达能力或特征信息不足,也可能是优化失败。训练很好而验证较差,可能是高方差,也要排查分布差异、泄漏和标签质量。
增加有代表性的数据有时能降低波动,但不能凭空提供缺失的关键信息。如果任务规律超出模型表达能力,仅增加相似数据未必解决系统偏差。
经典分解有特定假设,通常针对固定输入、平方损失和对训练数据的重复抽样期望。分类错误、交叉熵或实际单次验证差距,不能不加说明地直接等同于这三个分量。
数学表达
核心表达
两曲线都低且靠近提示高偏差;训练高验证低且差距随数据缩小,更多代表性数据可能有效。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1计算训练/验证分数
- 2观察差距
- 3多折检查波动
- 4绘制不同训练量曲线
代码对应位置
示例 1核对固定输入上的平方误差分解:把偏差、波动与总平方误差算在同一组构造预测上。
计算与实现步骤
- 计算训练/验证分数
- 观察差距
- 多折检查波动
- 绘制不同训练量曲线
- 结合基线诊断
- 选择模型/数据策略
代码实现
示例 1
核对固定输入上的平方误差分解
example_01.py用途:把偏差、波动与总平方误差算在同一组构造预测上。
import numpy as np
target = 10.0
groups = {"biased": [6., 6., 6.], "variable": [6., 10., 14.]}
for name, values in groups.items():
predictions = np.array(values)
bias2 = (predictions.mean() - target) ** 2
variance = predictions.var()
mse = np.mean((predictions - target) ** 2)
assert np.isclose(mse, bias2 + variance)
print(f"{name}: bias2={bias2:.4f} var={variance:.4f} mse={mse:.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
把偏差、波动与总平方误差算在同一组构造预测上。
mean- 训练特征逐列均值。
Step 1 · 1–10 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
target = 10.0
groups = {"biased": [6., 6., 6.], "variable": [6., 10., 14.]}
for name, values in groups.items():
predictions = np.array(values)
bias2 = (predictions.mean() - target) ** 2
variance = predictions.var()
mse = np.mean((predictions - target) ** 2)
assert np.isclose(mse, bias2 + variance)
print(f"{name}: bias2={bias2:.4f} var={variance:.4f} mse={mse:.4f}")代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
biased: bias2=16.0000 var=0.0000 mse=16.0000 variable: bias2=0.0000 var=10.6667 mse=10.6667
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 差距小就说模型好
- 只看一折
- 数据分布变化被误判为方差
实际应用
- 复杂度诊断
- 判断增加数据是否有益
常见错误
- 差距小就说模型好
- 只看一折
- 数据分布变化被误判为方差
推荐学习资料
参考库不会生成虚假资源或无效外部链接。