错误分析
从混淆类别、样本质量、人群来源、极端区域和置信度定位模型失败机制。
学习前需要掌握
背景与问题
整体分数只能说明平均结果,无法直接告诉我们该修标签、补数据还是改变模型。错误分析把独立预测与原始样本、业务切片和错误类型联系起来,形成可以验证的改进假设。
分析对象应来自验证、留出或合规的折外预测。训练集上的错误更少,通常不能代表真实泛化问题。
概念定义
错误分析把汇总指标还原到具体样本与切片,决定下一步应改数据、特征、模型还是指标。
直观理解
不要只问“错了多少”,还要问“错的是谁、在哪里、为什么、代价多大”。
核心原理
先定义错误与分母。二分类的漏报、误报需要分别看,多分类可从混淆对开始,回归则可检查残差与大误差。只展示几个明显失败样本,无法说明问题出现的频率。
切片应与使用条件有关,例如设备、地区、时间、数据缺失或样本难度。报告每个切片的样本数与错误率,避免把小组的偶然波动当成确定差异;反复寻找最差切片也会产生选择偏差。
查看原始记录与标注,可以区分标签错误、输入质量、分布变化和模型容量问题。解释应转成可测假设,例如“移动端图片压缩导致细节丢失”,再用针对性数据或实验检验。
改进后在固定协议下回归总体和相关切片,确认没有牺牲其他群体。若已经根据测试错误调方案,原测试集已参与开发,需要另有独立检查,不能继续把它视为未见数据。
数学表达
核心表达
在独立预测上建立可重复切片;避免只展示方便解释的个例。结论需转成可验证改进假设。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1生成独立预测
- 2定位错误索引
- 3按真实/预测类统计
- 4按来源/范围切片
代码对应位置
示例 1按设备统计独立预测的错误数量:固定构造数据演示切片统计与原行定位,不据 6 条记录推断真实设备差异。
案例:设备切片必须同时看样本数
构造 6 条独立预测,移动端 3 条中错 2 条,桌面端 3 条中错 1 条。这个小样本可以提示进一步检查移动端输入,却不足以证明移动端必然更难。
下一步应核对错误是否集中于模糊图片、特定类别或标签问题,并扩大有代表性的验证样本。若只截图两条移动端失败而不报告分母,很容易把故事当统计结论。下方代码固定行索引,避免真实值与预测错位。
计算与实现步骤
- 生成独立预测
- 定位错误索引
- 按真实/预测类统计
- 按来源/范围切片
- 人工检查标签
- 提出改进并重新验证
代码实现
示例 1
按设备统计独立预测的错误数量
example_01.py用途:固定构造数据演示切片统计与原行定位,不据 6 条记录推断真实设备差异。
import pandas as pd
data = pd.DataFrame({
"device": ["mobile", "desktop", "mobile", "desktop", "mobile", "desktop"],
"true": [1, 0, 1, 0, 1, 0],
"pred": [0, 0, 1, 1, 0, 0],
})
data["error"] = data["true"] != data["pred"]
for device, group in data.groupby("device", sort=True):
print(f"{device}: n={len(group)}, errors={int(group['error'].sum())}, rate={group['error'].mean():.3f}")
print("error_rows:", data.index[data["error"]].tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
固定构造数据演示切片统计与原行定位,不据 6 条记录推断真实设备差异。
mean- 训练特征逐列均值。
Step 1 · 1–1 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import pandas as pdStep 2 · 3–11 行
只从训练数据逐列计算均值与标准差,对应标准化公式中的 μ 和 σ。
data = pd.DataFrame({
"device": ["mobile", "desktop", "mobile", "desktop", "mobile", "desktop"],
"true": [1, 0, 1, 0, 1, 0],
"pred": [0, 0, 1, 1, 0, 0],
})
data["error"] = data["true"] != data["pred"]
for device, group in data.groupby("device", sort=True):
print(f"{device}: n={len(group)}, errors={int(group['error'].sum())}, rate={group['error'].mean():.3f}")
print("error_rows:", data.index[data["error"]].tolist())代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
本地 scikit-learn 1.8.0 的核对输出: desktop: n=3, errors=1, rate=0.333 mobile: n=3, errors=2, rate=0.667 error_rows: [0, 3, 4]
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- 只挑能讲故事的个例,不报告对应分母和全部错误分布。
- 混用不同索引的标签与预测,制造并不存在的错误样本。
- 在最终测试错误上反复迭代,却继续声称最终测试独立。
实际应用
- 模型迭代
- 公平性与风险审查
常见错误
- 只挑能讲故事的个例,不报告对应分母和全部错误分布。
- 混用不同索引的标签与预测,制造并不存在的错误样本。
- 在最终测试错误上反复迭代,却继续声称最终测试独立。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。