数据质量检查
在训练前系统检查形状、类型、缺失、重复、异常单位、标签和采集来源。
学习前需要掌握
背景与问题
模型分数异常时,问题可能早在采集与表连接阶段发生:同一记录重复、单位混用、标签错位或时间字段解析失败,都可能被正常执行的训练程序隐藏。
数据审计应先描述发现,再决定处理,不能把“清洗”理解成自动删除所有不常见的样本。异常值可能是错误,也可能正是任务需要识别的目标。
概念定义
数据质量检查系统地核对结构、数值、标签与来源。结构包括行列、类型和主键,数值包括缺失、范围与分布,标签包括比例和口径,来源包括时间、实体和采集方式。
检查结论应与任务相联系。某个值是否不合理,需要单位和业务定义;某条重复记录是否应删除,需要区分重复导出与真实重复事件。
直观理解
先像检查原始实验记录一样核对每列从哪里来,再看汇总统计。漂亮的均值无法保证个别行没有错,几个截图样本也无法替代完整计数。
三行小表中的三个不同问题
构造年龄 [20,-5,20]、收入 [100,缺失,100]、标签 [0,1,0]。这份表有一条全行重复、一项缺失收入和一个不合理年龄,它们需要分别统计,不能把三者都叫作“异常值”。
删除重复行会改变类别比例;填补收入需要从训练范围学习统计量;修正负年龄则应先追溯原始来源。处理动作与影响应逐项记录,而不是只输出一个“清洗成功”。
核心原理
先验证唯一键和连接关系。一次意外的一对多连接可能放大行数,使同一对象重复出现在训练与验证中;缺失检查不能发现所有这类重复问题。
按列检查 dtype、缺失比例、合法范围和分位数,并按来源或时间分组对照。整体分布平稳,也可能掩盖某一设备的单位发生变化。
标签审计应检查定义、生成时点、少数类支持数和冲突标注。标签比例突然变化不一定是世界变了,也可能是采样或标注流程变化。
记录处理规则、受影响行数与理由,并保留可恢复的原始数据。数据驱动的填补、阈值或缩放规则还要遵守训练边界,不能利用测试集选取最有利的清理方案。
计算与实现步骤
- 核对样本数、特征数和 X/y 对应。
- 查看每列 dtype 与单位。
- 统计缺失和重复。
- 检查分位数、极端值与不可能值。
- 查看类别分布和标签定义。
- 记录时间、来源与群组字段。
- 把发现转成可重复断言和报告。
代码实现
示例 1
对固定小表分别统计质量问题
example_01.py用途:提供完整输入,区分重复、缺失与范围违反。
import pandas as pd
df = pd.DataFrame({"age": [20, -5, 20],
"income": [100.0, float("nan"), 100.0],
"target": [0, 1, 0]})
print("duplicates:", int(df.duplicated().sum()))
print("missing_income:", int(df["income"].isna().sum()))
print("invalid_age:", int((df["age"] < 0).sum()))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
提供完整输入,区分重复、缺失与范围违反。
Step 1 · 1–7 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import pandas as pd
df = pd.DataFrame({"age": [20, -5, 20],
"income": [100.0, float("nan"), 100.0],
"target": [0, 1, 0]})
print("duplicates:", int(df.duplicated().sum()))
print("missing_income:", int(df["income"].isna().sum()))
print("invalid_age:", int((df["age"] < 0).sum()))预期输出或运行结果
duplicates: 1 missing_income: 1 invalid_age: 1
常见错误 · 3 条
- 只看均值不看单位和来源
- 把所有极端值直接删除
- 忽略标签定义变化
实际应用
- 建模前数据验收
- 训练/线上数据契约
- 错误样本追踪
常见错误
- 只看均值不看单位和来源
- 把所有极端值直接删除
- 忽略标签定义变化
推荐学习资料
参考库不会生成虚假资源或无效外部链接。