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法(四分位距法)

基于数据的四分位数,不依赖分布假设,鲁棒性更强。

  • 计算步骤:
    1. 计算第一四分位数 Q1(25% 分位)与第三四分位数 Q3(75% 分位)
    2. 计算四分位距 IQR = Q3 - Q1
    3. 定义异常值边界:下限 = Q1 - 1.5 × IQR,上限 = Q3 + 1.5 × IQR
    4. 超出上下限的值视为异常
  • 适用场景:偏态分布、含极端值的数据集
  • 优点:不受极端值影响,适用于非正态分布

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 缺失值与异常值处理流程

下图展示了从原始数据到清洗后数据的完整处理链路,包含缺失值判断、异常值检测与最终处理决策。

缺失值与异常值处理流程 原始数据集 缺失值检测 缺失比例 < 5%? 是 删除缺失行 否 填充缺失值 异常值检测 清洗后数据集
注意事项:异常值不一定是错误值,需结合业务判断。例如,信用卡交易中的大额消费可能是正常行为,不应直接删除。建议先标记异常值,再根据业务规则决定处理方式。

2.4 本章小结

  • 缺失值处理:根据缺失比例选择删除或填充;数值型优先用中位数(偏态数据)或均值(正态数据),分类型用众数。
  • 异常值检测:3σ原则适用于正态分布数据,IQR法适用于偏态分布或未知分布数据。
  • 处理流程:先检测缺失值并处理,再进行异常值检测与处理,最终获得可用于建模的清洗数据集。