8 数据预处理之数据清洗
系列进度
机器学习入门 · 第 8 / 21 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
数据清洗决定模型下限。缺失值、重复样本、异常值和单位不一致,会让模型学到错误规律,后面再调参数也很难补救。
预处理步骤可对照 scikit-learn 数据预处理文档。
我会在清洗前后各保存一份统计表:行数、缺失比例、重复比例、异常样本数量。没有对比,就不知道清洗是否过度。
在机器学习的工作流程中,数据预处理是一个至关重要的步骤。特别是在与数据收集之后的“数据清洗”阶段,我们需要确保我们的数据集是高质量的,以便模型能够学习到有效的信息。在本篇教程中,我们将详细探讨数据清洗的关键步骤与技巧,并结合具体的案例与代码示例,使其更易于理解。
数据清洗的重要性
在数据预处理流程中,数据清洗的目的是去除或修复数据集中的不准确、错误或不完整的数据。数据质量好坏直接影响到模型的表现,数据清洗的过程不仅可以提高数据质量,还能帮助我们在后续的特征选择与工程中更加顺利。
数据清洗的步骤
数据清洗通常包括以下几个步骤:
- 处理缺失值
- 去除重复数据
- 纠正数据类型
- 处理异常值
- 标准化数据
接下来,我们将逐一探讨这些步骤并结合案例进行说明。
1. 处理缺失值
缺失值是数据集中常见的问题。对于缺失值的处理,我们可以采取以下几种策略:
- 删除缺失值:适用于缺失比例很小的情况。
- 填补缺失值:可以使用均值、中位数、众数或进行插值等方法来填补。
示例代码:
import pandas as pd
# 假设我们有如下数据集
data = {
'年龄': [25, 30, None, 35, 40],
'收入': [50000, 60000, 65000, None, 80000]
}
df = pd.DataFrame(data)
# 查看缺失值
print("缺失值统计:\n", df.isnull().sum())
# 填补缺失值(使用均值)
df['年龄'].fillna(df['年龄'].mean(), inplace=True)
df['收入'].fillna(df['收入'].mean(), inplace=True)
print("填补缺失值后:\n", df)
2. 去除重复数据
数据集中有时候会包含完全相同的记录,这会导致模型训练过程中对某些样本的过拟合。
示例代码:
# 创建一个包含重复数据的示例数据集
data_with_duplicates = {
'姓名': ['张三', '李四', '张三', '王五'],
'年龄': [25, 30, 25, 28]
}
df_duplicates = pd.DataFrame(data_with_duplicates)
# 查看重复行
print("重复行统计:\n", df_duplicates.duplicated().sum())
# 去除重复行
df_duplicates.drop_duplicates(inplace=True)
print("去重后的数据集:\n", df_duplicates)
3. 纠正数据类型
数据类型的不一致会影响数据的操作与分析。比如,一列存储日期的字段最好转换为日期格式,以便后续的时间序列分析。
做机器学习数据清洗时,先检查缺失值、重复样本、异常点、格式错误和标签噪声。
示例代码:
# 处理包含日期的示例数据集
data_with_dates = {
'购买日期': ['2021-01-01', '2021-02-01', '2021-03-01'],
'金额': [100, 150, 200]
}
df_dates = pd.DataFrame(data_with_dates)
# 转换购买日期列
df_dates['购买日期'] = pd.to_datetime(df_dates['购买日期'])
print("数据类型:\n", df_dates.dtypes)
4. 处理异常值
异常值可能严重影响数据分析与模型训练,我们可以使用 Z-score 或 IQR 方法来识别并处理异常值。
示例代码:
# 创建一个示例数据集
data_with_outliers = {
'收入': [50000, 60000, 70000, 85000, 100000, 500000] # 500000是异常值
}
df_outliers = pd.DataFrame(data_with_outliers)
# 计算 IQR
Q1 = df_outliers['收入'].quantile(0.25)
Q3 = df_outliers['收入'].quantile(0.75)
IQR = Q3 - Q1
# 识别出异常值的条件
outlier_condition = (df_outliers['收入'] < (Q1 - 1.5 * IQR)) | (df_outliers['收入'] > (Q3 + 1.5 * IQR))
# 去除异常值
df_outliers_cleaned = df_outliers[~outlier_condition]
print("处理后不包含异常值的数据集:\n", df_outliers_cleaned)
5. 标准化数据
标准化是将数据的分布调整到一个标准范围,通常是均值为 0,标准差为 1,常用于特征工程中。
读完《数据预处理之数据清洗》后,可以回头问三件事:它解决什么问题,哪一步最容易出错,自己能否拿一个小例子跑通。
示例代码:
from sklearn.preprocessing import StandardScaler
# 创建一个示例数据集
data_for_scaling = {
'特征1': [1, 2, 3, 4, 5],
'特征2': [10, 20, 30, 40, 50]
}
df_scaling = pd.DataFrame(data_for_scaling)
# 标准化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df_scaling)
print("标准化后的数据:\n", scaled_data)
读到这里,可以把《数据预处理之数据清洗》整理成一张复盘表:先说清主线,再拿一个小任务检查结果。
读完《数据预处理之数据清洗》后,可以先挑一个小样例走完整流程,再判断哪些步骤已经能独立完成。
小结
数据清洗是确保机器学习模型能够有效学习的前提。通过上述步骤,我们能够对数据集进行细致入微的检查与调整,使数据集更加整洁与有效。接下来,在学习数据预处理的下一步“特征选择与工程”时,将能够更好地利用我们清洗后的数据集。
希望本篇教程能够帮助你在数据清洗的过程中,加深对该领域的理解。如有问题或者进一步的讨论,欢迎留言!
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
数据预处理之数据清洗适合谁读?
这是 机器学习入门 系列第 8 / 21 篇,适合正在学习机器学习入门,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇机器学习入门教程要多久?
按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读