数据清洗是数据理解之后、特征工程之前的步骤。原始数据往往存在噪声、缺失、错误、冗余等问题,数据清洗就是按照业务规则,修正或者剔除这些有问题的数据,提升数据集质量,保证后续模型训练稳定、结果可靠。
一、数据清洗主要工作内容
- 处理缺失值
缺失值是最常见的数据问题。不能直接固定一种处理方式,要结合缺失比例和业务含义选择方案:
- 删除:缺失占比很高,且该字段不是核心特征;或者样本缺失关键标签;
- 填充数值型:均值、中位数;
- 填充分类型:众数,或者新增一个“未知”类别;
- 高级方式:模型预测填充。
注意:随机删除大量样本会改变数据分布,容易引入偏差。
- 处理重复数据
重复分为整行重复、关键字段重复。
- 完全重复样本:直接去重;
- 关键字段重复但其他字段不一致:结合业务规则判断保留哪一条,或者标记待核实。
- 处理异常值
异常值是明显脱离正常取值范围的数据。
常用识别方法:箱线图、3σ原则。
处理方式:
- 核查:确认是不是业务真实发生的数据(不要盲目删除);
- 修正:录入错误的数据进行更正;
- 截断/缩尾:限制数值上下限;
- 删除:确认是错误数据时剔除。
- 修正格式与逻辑错误
- 统一字段格式:日期、大小写、单位统一;
- 校验逻辑矛盾:比如年龄负数、收入为负、时间先后颠倒;
- 统一文本编码、去除多余空格、特殊符号。
- 剔除无关冗余数据
删除和预测目标无关、完全不具备区分能力的字段,例如唯一ID、日志流水号等无关字段,减少干扰。
二、代码示例(Pandas)
import pandas as pd
df = pd.read_csv("data.csv")
# 1. 查看重复行
print("重复行数:", df.duplicated().sum())
# 删除重复行
df = df.drop_duplicates()
# 2. 缺失值处理
# 中位数填充数值列
df["age"] = df["age"].fillna(df["age"].median())
# 众数填充分类列
df["gender"] = df["gender"].fillna(df["gender"].mode()[0])
# 3. 异常值简单过滤示例(年龄大于120视为异常)
df = df[df["age"] <= 120]
# 4. 文本清洗,去除首尾空格
df["name"] = df["name"].str.strip()
# 5. 重置索引(删除行之后索引会不连续)
df = df.reset_index(drop=True)
三、数据清洗原则
- 可追溯:每一步清洗操作最好记录下来,方便复现和排查;
- 业务优先:优先看业务含义,而不是单纯依靠统计规则删数据;
- 最小改动:能修复就不删除,尽量保留原始样本信息;
- 不要泄露测试集信息:清洗规则只从训练集总结,再应用到验证集、测试集。
四、常见误区
- 看到缺失值、异常值直接删除;
- 清洗训练集和测试集分开写两套逻辑,造成分布不一致;
- 清洗过度,把真实但是少数的有效样本当成噪声删掉。
小结
数据清洗的目标:让数据准确、一致、可用。
高质量的数据,远比复杂模型更影响最终效果。
思考题:如果某特征缺失率达到 60%,我们优先考虑填充还是直接删除该字段?
0 条笔记