本节你会学到
- 说清楚「数据清洗第一课:缺失值、重复值和异常值怎么处理」解决的核心问题
- 知道它在「传统机器学习基础(21~34)」中的位置
- 把 分类与回归、机器学习、监督学习 这些关键词联系起来
数据清洗不是把数据改漂亮,而是识别缺失、重复、异常和格式问题,让模型拿到可靠的输入。
学习路线:传统机器学习基础(21~34) · 第 22 课
补齐文本分类项目背后的数据处理、算法、评估和模型选择知识。
学完本阶段你能做到:拿到一份结构化表格数据,独立完成清洗、特征工程、建模、评估、模型选择和保存,并用规范流程比较多个算法。
推荐读法:建议系统读。做项目时遇到数据和模型选择问题,也可以按需回查。
查看完整阶段 · 14 篇先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。
合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。
它应该为下一课「Pandas 数据清洗实战:把混乱表格变成可训练数据」铺路:读完后要知道下一课为什么自然出现。
机器学习项目里,数据清洗经常被低估。
很多人以为模型效果不好,是因为算法不够高级。但真实项目里,更常见的原因是:数据本身就有问题。
这一课先不写复杂模型,只把数据清洗里最常见的三类问题讲清楚:缺失值、重复值和异常值。
数据清洗不是为了让表格看起来整齐。
它真正要解决的是:模型拿到的数据,是否能代表真实问题,是否能稳定计算,是否会误导训练。
常见脏数据包括:
这篇先抓住前三类,因为它们最常见,也最容易影响模型。
缺失值就是数据里没有记录的部分。
例如一个用户表:
年龄 收入 是否购买
25 8000 是
空 12000 否
38 空 是
看到空值时,先不要急着删除。
你要先问两个问题:
有些缺失只是录入不完整,比如收入没填。
有些缺失本身就是信号,比如用户没有填写职业,可能和用户画像有关。
常见方法有三种。
第一种,删除。
当缺失比例很小,而且缺失样本不关键时,可以删除:
df = df.dropna()
第二种,填充。
数值字段可以用均值、中位数、固定值填充:
df["age"] = df["age"].fillna(df["age"].median())
类别字段可以用“未知”填充:
df["city"] = df["city"].fillna("未知")
第三种,增加缺失标记。
如果缺失本身可能有意义,可以额外加一列:
df["income_missing"] = df["income"].isna().astype(int)
这样模型既能看到填充后的数值,也能知道这条记录原本缺失过。
重复值是指同一条记录出现多次。
比如用户 ID、时间、行为完全一样,却重复出现在数据里。
这会带来一个问题:模型会误以为这类样本更重要。
检查重复值可以这样写:
df.duplicated().sum()
删除完全重复的行:
df = df.drop_duplicates()
但注意,不是所有看起来相似的记录都应该删。
如果同一个用户在不同时间购买了多次商品,那不是重复,而是真实行为。
所以判断重复时,要结合业务主键。
例如:
df.duplicated(subset=["user_id", "order_id"]).sum()
这样更接近真实问题。
异常值是明显偏离大多数样本的值。
例如:
异常值可能是录入错误,也可能是真实极端情况。
所以处理异常值时,不能只靠公式。
一个常见方法是用四分位数粗略定位:
q1 = df["income"].quantile(0.25)
q3 = df["income"].quantile(0.75)
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
outliers = df[(df["income"] < lower) | (df["income"] > upper)]
这能帮你找到可疑样本,但不能自动决定删除。
你还要判断:这些值在业务上是否可能存在?
常见处理方式有四种。
第一,修正。
如果明显是单位错误或录入错误,可以按规则修正。
第二,删除。
如果确认是错误记录,且样本量足够,可以删除。
第三,截断。
把过大的值压到合理范围内:
df["income"] = df["income"].clip(lower=0, upper=100000)
第四,保留。
如果异常值是真实业务现象,比如大客户、高消费用户,直接删除可能会丢掉重要信息。
第一个错误:先拆分数据集之后,又用全量数据计算填充值。
比如用整个数据集的均值填充训练集和测试集,这会造成数据泄漏。
更稳妥的做法是:只在训练集上学习填充规则,再应用到验证集和测试集。
第二个错误:为了追求干净,把所有不顺眼的样本都删掉。
这会让训练数据过于理想化,模型上线后反而不适应真实世界。
第三个错误:只清洗特征,不检查标签。
如果标签本身错了,模型就会认真学习错误答案。
数据清洗的目的,是让模型拿到更可信的输入。
这节课先记住三件事:
下一课,我们会用 Pandas 做一次小型清洗实战,把混乱表格一步步整理成可以训练的数据。
留言讨论