数据科学必备技能:填补缺失值(Imputing Missing Values)
在数据分析和机器学习项目中,缺失值(Missing Values) 是非常常见的问题。缺失的数据如果处理不当,会严重影响模型的训练效果,甚至导致模型性能大幅下降。因此,掌握缺失值填补的方法,是数据科学工作中非常重要的一步。
本文将基于一张图,详细介绍几种常见且实用的缺失值填补方法,并结合实际例子进行讲解。
1. 定量分析:用平均值填补
如果缺失的是定量变量(Quantitative Variable),如数值型数据:年龄、身高、收入等,常用均值(mean)进行填补。
原理:均值可以代表数据的整体水平,用均值填补可以尽量减少数据波动带来的影响。
示例:
假设你有一组数据:
年龄 |
---|
25 |
27 |
NaN |
29 |
31 |
缺失了一个年龄值,可以先计算现有数据的平均值:
然后将缺失值填补为28。
代码示例(Python + Pandas):
import pandas as pd
df = pd.DataFrame({'Age': [25, 27, None, 29, 31]})
df['Age'].fillna(df['Age'].mean(), inplace=True)
print(df)
2. 定性分析:用众数填补
如果缺失的是定性变量(Categorical Variable),如性别、城市类别、颜色等,常用众数(mode)进行填补。
原理:众数是出现次数最多的类别,使用众数可以最大限度保持数据分布的一致性。
示例:
假设你的数据如下:
城市 |
---|
北京 |
上海 |
NaN |
北京 |
广州 |
北京出现次数最多,因此缺失值可以填补为“北京”。
代码示例(Python + Pandas):
import pandas as pd
df = pd.DataFrame({'City': ['北京', '上海', None, '北京', '广州']})
df['City'].fillna(df['City'].mode()[0], inplace=True)
print(df)
3. 使用模型预测填补缺失值
对于缺失值较多、或者缺失值和其他特征有明显相关性的情况,可以使用预测模型来填补缺失值。例如,使用 K近邻(KNN)、决策树、线性回归等算法。
3.1 K近邻(KNN)填补
KNN可以根据数据中与缺失值样本最相似的其他样本的特征,预测其可能的取值。
原理简述:
找到与缺失样本最接近的K个完整样本;
取这K个样本中对应特征的均值(定量)或众数(定性)作为填补值。
代码示例(Python + sklearn):
import numpy as np
import pandas as pd
from sklearn.impute import KNNImputer
df = pd.DataFrame({
'Height': [1.7, 1.8, np.nan, 1.6, 1.75],
'Weight': [65, 80, 70, 60, 75]
})
imputer = KNNImputer(n_neighbors=2)
df_filled = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
print(df_filled)
拓展内容:其他常用填补策略
除了以上三种常见方法,还有一些高级处理方法:
插值法(Interpolation):适用于时间序列数据,比如线性插值、样条插值等。
基于多重插补(MICE):多次预测缺失值,减少单次预测误差。
直接删除缺失行/列:如果缺失比例非常高,可以考虑删除相关样本或特征。
添加缺失值指示变量:为缺失的位置添加0/1标记,作为额外特征喂给模型。
选择哪种方法,需要根据数据特点、业务需求、模型要求综合判断。
总结
场景 | 填补方法 |
---|---|
定量分析(数值型) | 平均值填补 |
定性分析(类别型) | 众数填补 |
缺失复杂、相关性强 | 建模预测填补 |
掌握缺失值处理的正确姿势,可以有效提升数据质量,保证后续分析和建模的准确性。在实际工作中,建议结合探索性数据分析(EDA)对缺失情况进行全面了解后,制定最适合的填补策略。
如果你觉得本文有帮助,欢迎点赞、收藏或留言交流~