假设 df 是你的DataFrame

星博讯 AI基础认知 1

这是一份清晰的缺失值填充基础指南,涵盖了核心概念、常用方法和实践流程

假设 df 是你的DataFrame-第1张图片-星博讯网络科技知识-SEO优化技巧|AI知识科普|互联网行业干货大全


为什么要处理缺失值?

  1. 算法限制:大多数机器学习算法和统计模型(如逻辑回归、SVM、神经网络)无法直接处理包含缺失值的数据,会直接报错或产生错误结果。
  2. 偏差与误导:缺失值本身可能包含重要信息(不填写收入可能因为收入低),直接删除带有缺失值的行/列会损失大量信息,并可能引入系统性偏差。
  3. 降低效率:数据不完整会降低分析的统计功效和模型的稳定性。

第一步:诊断缺失模式

在填充之前,必须了解数据缺失的模式和原因(缺失机制)。

  1. 完全随机缺失:数据缺失的概率与任何观测到的或未观测到的变量都无关,这是最理想的情况,处理起来最简单。
  2. 随机缺失:数据缺失的概率只与数据集中其他观测到的变量有关,而与自身的真实值无关。
    • 例子:收入数据的缺失与“年龄”和“教育程度”有关(年轻人、学生更可能不填),但与个人的真实收入水平无关。
  3. 非随机缺失:数据缺失的概率与变量自身的真实值有关。
    • 例子:高收入人群更不愿意透露收入,导致收入越高,缺失概率越大,这是最棘手的情况,任何简单的填充都可能导致严重偏差。

分析方法

  • df.isnull().sum():查看每个特征的缺失数量。
  • df.isnull().mean():查看每个特征的缺失比例。
  • 可视化:使用热力图 (sns.heatmap(df.isnull(), cbar=False)) 观察缺失值在数据矩阵中的分布模式。
  • 通过业务逻辑判断缺失原因。

常用缺失值填充方法

A. 简单填充法(适合MCAR或轻微MAR)

  1. 删除

    • 列表删除:删除任何包含缺失值的行(df.dropna())。
      • 优点:简单。
      • 缺点:可能丢失大量数据,如果数据不是MCAR,会引入偏差。
    • 列删除:删除缺失率过高的列(缺失率 > 60%)。
      • 适用场景:该特征不重要或缺失过多,无法有效填充。
  2. 统计值填充

    • 数值型:用均值中位数众数固定值(如0)填充。
      • 均值填充:最常用,但会低估方差,且对异常值敏感。
      • 中位数填充:对异常值更稳健。
      • 固定值填充:将缺失本身作为一种特殊类别(如用 -999 填充收入)。
    • 分类型:用众数(出现最频繁的类别)填充。

B. 模型/算法填充法(更适合MAR,利用数据间关系)

  1. 同类均值/众数填充

    根据其他特征分组后填充,用“本科毕业生”的平均收入填充某个本科学历者的缺失收入。

  2. 邻近填充

    • K-最近邻:找到与缺失样本最相似的K个邻居(基于其他特征),用它们的均值或加权值填充。
    • 优点:利用了局部数据结构。
    • 缺点:计算量大,需要定义距离度量。
  3. 回归/预测模型填充

    • 将缺失特征作为目标变量,其他完整特征作为输入变量,训练一个回归(数值)或分类(类别)模型来预测缺失值。
    • 优点:精度较高,能捕捉变量间复杂关系。
    • 缺点:过程复杂,可能过拟合,且忽略了预测的不确定性。
  4. 迭代插补

    • 这是当前最推荐、最稳健的方法之一(如Scikit-learn中的IterativeImputer)。
    • 原理
      1. 用简单方法(如均值)为所有缺失值提供一个初始猜测。
      2. 将特征1的缺失值作为目标,用特征2,3,4…建立一个模型来预测它,并用预测值更新。
      3. 对特征2、3、4…重复步骤2,一轮“迭代”完成。
      4. 重复多轮迭代,直到填充值趋于稳定。
    • 优点:灵活、能建模复杂关系,结果通常优于单次模型填充。

C. 高级/专门方法

  1. 多重插补

    • 生成多个不同的、合理的填充数据集,分别分析后再合并结果,能更好地反映填充带来的不确定性,常用statsmodelsR中的包实现。
  2. 时间序列填充

    • 对于时间序列数据,常用前向填充后向填充线性插值

基础实践流程(工作流)

一个标准的数据处理流程如下所示:

flowchart TD
    A[加载数据<br>诊断缺失模式与原因] --> B{判断缺失率与重要性}
    B -- “缺失率极高<br>且特征不重要” --> C[删除该特征列]
    B -- “其他情况” --> D[根据缺失机制<br>选择填充方法]
    C --> E[在完成的数据集上<br>训练分析模型]
    D --> E
    subgraph D [模型/算法填充流程]
        D1[划分数据] --> D2[使用完整部分<br>训练填充模型]
        D2 --> D3[预测并填充缺失值]
    end

关键步骤详解:

  1. 分析与诊断:使用上述方法了解缺失情况。
  2. 删除决策:对缺失率过高(如>50%)且不重要的特征,考虑直接删除。
  3. 选择填充方法
    • 数据量小,缺失少:简单统计填充。
    • 数据有一定规模,特征间有关联强烈推荐从KNN填充或迭代插补开始尝试
    • 对精度要求高:尝试多种方法,通过后续模型效果来评估。
  4. 实施填充重要! 必须使用训练集的统计量(均值、中位数)或模型来填充训练集的缺失值,然后用同样的转换器去填充测试集,绝不能使用测试集的信息来填充训练集,这是严重的数据泄漏。
  5. 创建缺失指示器:对于MNAR或重要的MAR情况,可以创建一个布尔特征Income_Missing),表示该值是否曾被填充,这有时能为模型提供额外信息。
  6. 评估影响:比较填充前后,模型性能或数据分布的变化。

工具与代码示例(Python)

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer, KNNImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
print("缺失情况:")
print(df.isnull().sum())
# 1. 简单填充 - 中位数
imputer_simple = SimpleImputer(strategy='median')
df_filled_simple = pd.DataFrame(imputer_simple.fit_transform(df), columns=df.columns)
# 2. KNN填充
imputer_knn = KNNImputer(n_neighbors=5)
df_filled_knn = pd.DataFrame(imputer_knn.fit_transform(df), columns=df.columns)
# 3. 迭代插补(以贝叶斯回归为估计器)
imputer_iterative = IterativeImputer(max_iter=10, random_state=0)
df_filled_iterative = pd.DataFrame(imputer_iterative.fit_transform(df), columns=df.columns)

核心要点总结

  • 没有“一招鲜”:最佳方法取决于数据、缺失机制和分析目标。
  • 先分析,后处理:理解为什么缺失比选择填充技术更重要。
  • 从简单开始:先尝试中位数/众数填充,建立基线。
  • 迭代插补是强大工具:对于复杂的数值型数据,通常是不错的默认选择。
  • 警惕数据泄漏:始终使用训练集的信息来填充训练集和测试集。
  • 评估!评估!评估! 最终评判标准是填充后对下游任务(如预测准确率)的影响。

希望这份基础指南能帮助你系统地开启缺失值处理工作!在实际项目中,你可以从简单方法开始,逐步尝试更复杂的方法,并通过交叉验证来比较效果。

标签: df DataFrame

抱歉,评论功能暂时关闭!

微信咨询Xboxun188
QQ:1320815949
在线时间
10:00 ~ 2:00