数据清洗第一课:缺失值、重复值和异常值怎么处理

数据清洗不是把数据改漂亮,而是识别缺失、重复、异常和格式问题,让模型拿到可靠的输入。

学习路线:传统机器学习基础(21~34) · 第 22 课
第 22 课一张表格被放大检查,缺失值、重复行和异常点被不同颜色标记出来。
Learning Path

传统机器学习基础(21~34)

补齐文本分类项目背后的数据处理、算法、评估和模型选择知识。

学完本阶段你能做到:拿到一份结构化表格数据,独立完成清洗、特征工程、建模、评估、模型选择和保存,并用规范流程比较多个算法。

推荐读法:建议系统读。做项目时遇到数据和模型选择问题,也可以按需回查。

查看完整阶段 · 14 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「数据清洗第一课:缺失值、重复值和异常值怎么处理」解决的核心问题
  • 知道它在「传统机器学习基础(21~34)」中的位置
  • 把 分类与回归、机器学习、监督学习 这些关键词联系起来

前置知识

  • 建议先读完上一篇:机器学习项目的完整流程:从原始数据到模型预测
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【分类与回归】判断邮件是不是垃圾邮件是分类,预测房价是多少是回归。 前面或后面会反复用到它。
  • 【机器学习】机器学习的重点不是手写所有规则,而是准备数据、定义目标,让模型自己找到可复用的模式。 前面或后面会反复用到它。
  • 【监督学习】如果训练数据里有“题目”和“答案”,模型学会以后再给它新题目,它就尝试给出答案。 前面或后面会反复用到它。
  • 【特征工程】模型不能直接理解很多现实信息,特征工程就是把信息翻译成模型能吃进去的格式。 前面或后面会反复用到它。

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要把概念孤立背下来,要放回数据到结果的完整链路里。

课后练习

  • 用 3 句话向一个零基础朋友解释「数据清洗第一课:缺失值、重复值和异常值怎么处理」。
  • 打开概念库里的「分类与回归」,补一遍它和本文的关系。
  • 读下一课「Pandas 数据清洗实战:把混乱表格变成可训练数据」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 用一句话说清「数据清洗第一课:缺失值、重复值和异常值怎么处理」解决了什么问题。

合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。

2. 这篇文章和上一课或下一课是什么关系?

它应该为下一课「Pandas 数据清洗实战:把混乱表格变成可训练数据」铺路:读完后要知道下一课为什么自然出现。

下一步建议读「Pandas 数据清洗实战:把混乱表格变成可训练数据」。

机器学习项目里,数据清洗经常被低估。

很多人以为模型效果不好,是因为算法不够高级。但真实项目里,更常见的原因是:数据本身就有问题。

这一课先不写复杂模型,只把数据清洗里最常见的三类问题讲清楚:缺失值、重复值和异常值。

第 22 课视频 · 数据清洗第一课(约 1 分 40 秒)

数据清洗到底在清什么

数据清洗不是为了让表格看起来整齐。

它真正要解决的是:模型拿到的数据,是否能代表真实问题,是否能稳定计算,是否会误导训练。

常见脏数据包括:

  • 缺失值:某些字段没有记录;
  • 重复值:同一条样本出现多次;
  • 异常值:数值明显偏离正常范围;
  • 格式混乱:日期、金额、类别写法不统一;
  • 标签错误:答案本身标错了。

这篇先抓住前三类,因为它们最常见,也最容易影响模型。

缺失值:不是所有空值都能直接删

缺失值就是数据里没有记录的部分。

例如一个用户表:

年龄    收入      是否购买
25      8000      是
空      12000     否
38      空        是

看到空值时,先不要急着删除。

你要先问两个问题:

  1. 这个字段重要吗?
  2. 缺失本身有没有含义?

有些缺失只是录入不完整,比如收入没填。

有些缺失本身就是信号,比如用户没有填写职业,可能和用户画像有关。

缺失值的常见处理方式

常见方法有三种。

第一种,删除。

当缺失比例很小,而且缺失样本不关键时,可以删除:

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()

这样更接近真实问题。

异常值:离群不等于错误

异常值是明显偏离大多数样本的值。

例如:

  • 年龄是 300;
  • 月收入是 -5000;
  • 身高是 5 米;
  • 商品价格突然是平时的 100 倍。

异常值可能是录入错误,也可能是真实极端情况。

所以处理异常值时,不能只靠公式。

一个常见方法是用四分位数粗略定位:

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)

第四,保留。

如果异常值是真实业务现象,比如大客户、高消费用户,直接删除可能会丢掉重要信息。

清洗数据时最容易犯的错

第一个错误:先拆分数据集之后,又用全量数据计算填充值。

比如用整个数据集的均值填充训练集和测试集,这会造成数据泄漏。

更稳妥的做法是:只在训练集上学习填充规则,再应用到验证集和测试集。

第二个错误:为了追求干净,把所有不顺眼的样本都删掉。

这会让训练数据过于理想化,模型上线后反而不适应真实世界。

第三个错误:只清洗特征,不检查标签。

如果标签本身错了,模型就会认真学习错误答案。

小结

数据清洗的目的,是让模型拿到更可信的输入。

这节课先记住三件事:

  1. 缺失值要先判断含义,再决定删除或填充。
  2. 重复值要结合业务主键判断,不能机械去重。
  3. 异常值要区分录入错误和真实极端样本。

下一课,我们会用 Pandas 做一次小型清洗实战,把混乱表格一步步整理成可以训练的数据。

Discussion

留言讨论