在诸多数据问题中,我们不可避免会碰到数据出现缺失的情况,可能是因为记录数据时候的失误,也有可能是数据本身就没有(例如一些资料用户没有填充,或者股票停牌了,那么那天的交易记录就是为空的)。对于这些缺失值的处理对于模型最终的预测可能起到至关重要的作用,因为缺失的数据会导致:

  • 数据集失真:大量缺失的数据可能导致变量分布失真,可能增加或减少数据集中特定类别的值。

  • 影响最终模型的训练预测:缺失的数据会导致数据集中出现偏差,并可能导致模型训练和预测有偏差。

本文我们介绍竞赛中常见的缺失值填充技巧。喜欢记得收藏、关注、点赞。

注:文末提供技术交流群

01 CCA(Complete Case Analysis)

Complete Case Analysis(CCA)是一种非常简单的处理缺失数据的方法,它直接删除包含缺失数据的行,即我们只考虑包含完整数据的行。

这种策略较为直接,很容易实现,当然也会使我们损失非常多的数据信息。在预测存在缺失值的时候也会出现偏差。一般建议当我们的数据量足够大的时候,即缺失的数据占比非常小,而且有存在随机的情况。

data_cca = df.dropna(axis=0)

02 随机数填充

这是缺失值中填充的一项重要技术,它可以处理数值变量和分类变量。一般我们会对缺失值分组到一列中,并分配一个特殊的值,例如99999999或-999999等。这样我们保留了缺失值的特殊含义,在一些特殊的情况下,可以带来非常好的效果,但是缺点也很明显,我们这种填充策略对于目前的一些模型,例如NN等,进行预处理和训练预测带来一些挑战。

03 类别特征的频率填充类别特征的频率填充

用出现频率最高的变量值替换缺失的值,用该特征列的众数作为替换值。该方法实现简单,也较为常用,但是当数据缺失较大的时候,这样的填充会使得数据出现较大的偏差,使得预测结果较差。

04 统计值填充

使用统计值进行填充,例如均值,中位数等。有的时候我们也可以使用正态分布的策略进行填充:

  • 使用与平均值相差2个标准差以内的值。在(平均值-2 std)&(平均值+2 std)之间生成随机数来填充缺失值。

05 使用线性回归

通过两个变量的强相关性来进行线性拟合填充。注意线性回归时需要注意异常值的影响。

06 XGBoost迭代填充

迭代填充就是将每个特征建模为其他特征的函数,例如预测缺失值的回归问题。这个可以认为是上面线性回归的扩展版本。该方法也在诸多的数据竞赛中获得过非常好的效果。

# loading modules
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
import xgboost

data=df.copy()

#setting up the imputer

imp = IterativeImputer(
    estimator=xgboost.XGBRegressor(
        n_estimators=5,
        random_state=1,
        tree_method='gpu_hist',
    ),
    missing_values=np.nan,
    max_iter=5,
    initial_strategy='mean',
    imputation_order='ascending',
    verbose=2,
    random_state=1
)

data[:] = imp.fit_transform(data)

07 最近邻填充

顾名思义,就是采用最近邻的策略进行填充,大家常用的策略是KNNImputer。默认情况下,我们用缺失值的欧几里德距离度量来查找最近的点。每个缺失的特征都是使用最近N个样本的非缺失的特征值进行填充。

from sklearn.impute import KNNImputer
nan = np.nan
X = [[1, 2, nan], [3, 4, 3], [nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2, weights="uniform")
imputed_x=imputer.fit_transform(X) 

08 缺失值标记

该方法也是最为常见的,就是将数据集中特征转换为相应的二进制矩阵,以标识该数据集中是否存在缺失值。

from sklearn.impute import MissingIndicator
X = np.array([[-1, -1, 1, 3],
              [4, -1, 0, -1],
              [8, -1, 1, 0]])
indicator = MissingIndicator(missing_values=-1)
mask_missing_values_only = indicator.fit_transform(X)

参考文献

  1. Defining, Analysing, and Implementing Imputation Techniques

  2. The Ultimate Guide to Data Cleaning

  3. Intro to Imputation 🔍 Different Techniques

推荐文章

技术交流

欢迎转载、收藏、有所收获点赞支持一下!数据、代码可以找我获取

在这里插入图片描述

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

长按关注

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐