2. 数据预处理基础:缺失值与异常值处理
数据预处理是机器学习建模前的关键步骤,直接影响模型质量。本章聚焦于缺失值处理与异常值检测两大核心任务,提供可落地的处理方法与判断标准。
2.1 缺失值处理
缺失值指数据集中某些字段为空或未记录的情况。处理方式分为删除法与填充法,选择依据包括缺失比例、数据重要性及业务含义。
2.1.1 缺失值处理方法对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 删除法(行删除) | 缺失比例 < 5%,且缺失随机 | 简单快速,不引入偏差 | 样本量减少,可能丢失信息 |
| 均值填充 | 数值型特征,数据近似正态分布 | 保持均值不变 | 降低方差,扭曲分布 |
| 中位数填充 | 数值型特征,存在偏态或异常值 | 鲁棒性强,不受极端值影响 | 忽略分布形态 |
| 众数填充 | 分类型特征 | 保留类别分布 | 可能强化主导类别 |
2.1.2 填充法代码示例(Python)
import pandas as pd
import numpy as np
# 示例数据
df = pd.DataFrame({
'age': [25, 30, np.nan, 35, 40, np.nan, 28],
'salary': [50000, 60000, 55000, np.nan, 70000, 65000, 62000],
'gender': ['M', 'F', 'M', 'F', np.nan, 'M', 'F']
})
# 均值填充
df['age'].fillna(df['age'].mean(), inplace=True)
# 中位数填充
df['salary'].fillna(df['salary'].median(), inplace=True)
# 众数填充
df['gender'].fillna(df['gender'].mode()[0], inplace=True)
print(df)
实践建议:对于缺失比例超过 50% 的特征,优先考虑删除该特征;对于时间序列数据,可使用前向填充(ffill)或插值法。
2.2 异常值检测
异常值(离群点)指显著偏离数据整体分布的观测值。常用检测方法包括3σ原则(基于正态分布)和IQR法(基于四分位数)。
2.2.1 3σ原则
假设数据服从正态分布,约 99.7% 的数据落在均值 ±3 倍标准差范围内。超出此范围的值视为异常。
- 判定条件: |x - μ| > 3σ
- 适用场景:数据近似正态分布,样本量较大(n ≥ 30)
- 局限性:对极端值敏感,均值与标准差本身可能被异常值扭曲
2.2.2 IQR法(四分位距法)
基于数据的四分位数,不依赖分布假设,鲁棒性更强。
- 计算步骤:
- 计算第一四分位数 Q1(25% 分位)与第三四分位数 Q3(75% 分位)
- 计算四分位距 IQR = Q3 - Q1
- 定义异常值边界:下限 = Q1 - 1.5 × IQR,上限 = Q3 + 1.5 × IQR
- 超出上下限的值视为异常
- 适用场景:偏态分布、含极端值的数据集
- 优点:不受极端值影响,适用于非正态分布
2.2.3 两种方法对比
| 对比维度 | 3σ原则 | IQR法 |
|---|---|---|
| 分布假设 | 正态分布 | 无分布假设 |
| 鲁棒性 | 低(受异常值影响) | 高(基于分位数) |
| 边界宽度 | 固定 3σ | 1.5 × IQR(可调整) |
| 适用数据量 | 大样本 | 中小样本均可 |
| 常见应用 | 工业质量检测 | 金融风控、生物统计 |
2.2.4 异常值检测代码示例
import numpy as np
import pandas as pd
# 示例数据
data = pd.Series([10, 12, 11, 13, 100, 12, 11, 14, 13, 12])
# 3σ原则
mean = data.mean()
std = data.std()
outliers_3sigma = data[(np.abs(data - mean) > 3 * std)]
print("3σ异常值:", outliers_3sigma.tolist())
# IQR法
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers_iqr = data[(data < lower) | (data > upper)]
print("IQR异常值:", outliers_iqr.tolist())
关键区别:3σ原则对极端值敏感,IQR法更稳健。实际项目中建议同时使用两种方法,交叉验证异常点。
2.3 缺失值与异常值处理流程
下图展示了从原始数据到清洗后数据的完整处理链路,包含缺失值判断、异常值检测与最终处理决策。
注意事项:异常值不一定是错误值,需结合业务判断。例如,信用卡交易中的大额消费可能是正常行为,不应直接删除。建议先标记异常值,再根据业务规则决定处理方式。
2.4 本章小结
- 缺失值处理:根据缺失比例选择删除或填充;数值型优先用中位数(偏态数据)或均值(正态数据),分类型用众数。
- 异常值检测:3σ原则适用于正态分布数据,IQR法适用于偏态分布或未知分布数据。
- 处理流程:先检测缺失值并处理,再进行异常值检测与处理,最终获得可用于建模的清洗数据集。