🌺The Begin🌺点点关注,收藏不迷路🌺

前言

在数据挖掘项目中,有一句行业经典名言:“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。”

而在数据准备阶段,数据缺失是最常见、最影响模型效果的数据问题。直接使用含缺失值的数据训练模型,会导致模型偏差、精度下降、甚至完全不可用。

本文将系统讲解数据缺失值的成因、分类、处理原则、6大核心处理方法、适用场景、Python代码实现,搭配清晰流程图,带你一站式掌握缺失值处理的完整方案。


一、缺失值:定义与产生原因

1. 缺失值:定义

缺失值:指数据集中某些样本的某些属性没有记录值,通常用 NaNNULL?、空字符串等符号表示。

2. 缺失值:产生原因

  1. 人为原因:用户未填写、调查遗漏、数据录入失误
  2. 设备原因:传感器故障、数据采集中断
  3. 系统原因:数据同步失败、数据表关联丢失
  4. 逻辑原因:某些属性对特定样本无效(如儿童的年薪)

二、缺失值:三种类型分类

1. 完全随机缺失(MCAR)

定义:缺失与任何变量无关,纯随机发生(如随机丢失数据)
特点:无规律,处理难度低

2. 随机缺失(MAR)

定义:缺失与其他已观测变量有关(如收入越高越不填薪资)
特点:有规律,可通过其他变量推断

3. 非随机缺失(MNAR)

定义:缺失与自身未观测值有关(如低收入用户故意不填收入)
特点:难度最高,需要专业方法处理


三、缺失值处理:标准执行流程图

缺失值处理必须遵循科学流程,不能盲目填充/删除,标准流程如下:

加载数据集

检测缺失值&统计缺失率

缺失率 < 5%?

简单填充/删除

缺失率 5%-50%?

高级填充算法

缺失率 > 50%?

考虑删除该特征

数据验证

完成缺失值处理


四、缺失值处理:6大核心方法(序号+详细说明)

方法1:直接删除法

定义:直接删除含缺失值的样本或特征
适用场景

  • 缺失率 < 5%
  • 样本量极大
  • 特征无重要价值
    优点:简单高效、无数据偏差
    缺点:丢失数据信息

方法2:常量填充法

定义:用固定值填充缺失值(0、均值、中位数、众数)
分类

  1. 数值型:均值、中位数
  2. 分类型:众数、Unknown常量
    优点:实现简单、速度快
    缺点:引入噪声,影响数据分布

方法3:插值填充法

定义:利用数据趋势线性/非线性插值
适用:时序数据、连续数据
常用:线性插值、多项式插值

方法4:模型预测填充法

定义:将缺失特征作为目标,用其他特征训练模型预测填充
常用模型:KNN、随机森林、XGBoost
优点:准确率高、保留数据分布
缺点:计算量大、复杂度高

方法5:热卡填充法

定义:找到与缺失样本最相似的样本,用其值填充
核心:基于相似度匹配

方法6:不处理(算法自适应)

定义:使用自带缺失值处理能力的算法
支持算法:XGBoost、LightGBM、CatBoost
优点:无需预处理、效果最优
缺点:依赖特定算法


五、缺失值处理:标准执行步骤(序号版)

步骤1:缺失值检测

统计每列缺失值数量、缺失率,判断严重程度。

步骤2:缺失类型判断

根据业务理解,判断属于MCAR/MAR/MNAR。

步骤3:选择处理方法

根据缺失率、特征类型、数据量选择对应方法。

步骤4:执行处理

删除/填充/建模预测。

步骤5:效果验证

检查处理后数据分布,确保无偏差。

步骤6:进入后续建模

完成数据清洗,进入特征工程。


六、缺失值处理:Python实战代码(全方法)

import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer, SimpleImputer

# 1. 创建含缺失值的测试数据
data = {
    'A': [1,2,np.nan,4,5],
    'B': [np.nan,2,3,np.nan,5],
    'C': ['a','b',np.nan,'a','b']
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)

# 2. 检测缺失值
print("\n缺失值统计:")
print(df.isnull().sum())
print("缺失率:")
print(df.isnull().sum() / len(df))

# 3. 方法1:直接删除
df_drop = df.dropna()  # 删除行
df_drop_col = df.dropna(axis=1)  # 删除列

# 4. 方法2:常量填充
df_fill_mean = df.fillna(df.mean())  # 均值
df_fill_median = df.fillna(df.median())  # 中位数
df_fill_mode = df.fillna(df.mode().iloc[0])  # 众数

# 5. 方法3:KNN模型填充
imputer = KNNImputer(n_neighbors=2)
df_knn = pd.DataFrame(imputer.fit_transform(df.select_dtypes(include=[np.number])), columns=['A','B'])

# 6. 方法4:Sklearn统一接口
imputer = SimpleImputer(strategy='median')
df_sklearn = pd.DataFrame(imputer.fit_transform(df.select_dtypes(include=[np.number])), columns=['A','B'])

print("\nKNN填充结果:")
print(df_knn)

七、缺失值处理方法:适用场景对比表

处理方法 数值型数据 分类型数据 缺失率低 缺失率高 时序数据 优点 缺点
直接删除 简单 丢信息
均值填充 快速 改分布
中位数填充 抗异常 精度一般
众数填充 通用 偏差大
KNN填充 高精度 速度慢
插值填充 时序优 非时序差
树模型填充 最优 复杂度高

八、缺失值处理:最佳实践建议

1. 缺失率 < 5%

优先使用中位数/众数填充,简单高效。

2. 缺失率 5% - 50%

优先使用KNN/随机森林模型填充,保证数据准确性。

3. 缺失率 > 50%

直接删除特征,保留价值更高的特征。

4. 时序数据

使用线性插值/时间插值,保留时间趋势。

5. 分类型数据

使用众数/新增类别Unknown

6. 工业界首选

使用LightGBM/XGBoost,无需手动处理缺失值。


总结

  1. 缺失值危害:导致模型偏差、精度下降,必须处理。
  2. 处理流程:检测→统计→判断→选择方法→处理→验证。
  3. 核心方法:删除、常量填充、插值、KNN、模型填充、算法自适应。
  4. 黄金法则:缺失率低简单处理,缺失率高模型填充,极高缺失直接删除。

缺失值处理是数据挖掘的第一道门槛,掌握科学处理方法,能大幅提升模型效果,是数据工程师、算法工程师必备核心技能。


在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐