建议:不同场景下的数据缺失机制不同,这需要工程师基于对业务选择合适的填充方法。
如何判断缺失值类型? 缺失值的分类按照数据缺失机制可分为: 可忽略的缺失
不可忽略的缺失
平常工作中遇到的缺失值大部分情况下是随机的(缺失变量和其他变量有关)
这个就可以用estimator来做了,选其中一个变量(y),然后用其他变量作为X,随便选个值填充X的缺失部分,用X train一个estimator,再预测y的缺失部分(大致思路)
此外有些数据是符合某种分布的,利用这个分布呢也可以填充缺失的数据,如(EM算法)
处理缺失数据的三个标准: 1. 非偏置的参数估计 不管你估计means, regressions或者是odds ratios,都希望参数估计可以准确代表真实的总体参数。在统计项中,这意味着估计需要是无偏的。有缺失值可能会影响无偏估计,所以需要处理。 2. 有效的能力: 删除缺失数据会降低采样的大小,因此会降低power。如果说问题是无偏的,那么得到的结果会是显著的,那么会有足够的能力来检验这个效力(have adequate power to detect your effects)。反之,整个检测可能失效。 3. 准确的标准差(影响p值和置信区间): 不仅需要参数估计无偏,还需要标准差估计准确,在统计推断中才会有效。
缺失值处理的方法大致分为这几类:1、删除法;2、基于插补的方法;3、基于模型的方法; 4、不处理; 5、映射高维
有些处理方法是基于完全随机缺失假设(MCAR),一般来说,当数据不是 MCAR 而 是随机缺失(MAR)时,这些方法是不适用的;而有些方法(如似然估计法)在 MAR 的假设下是适用的,因此,在进行缺失数据处理时,首先需要认真分析缺失数 据产生的原因,然后采取有针对性的补救措施,这样才能够获得无偏或弱偏估计。
此处关于使用多重插补来处理非随机缺失(MNAR)的问题,它其实效果不一定,也可能出现效果倒退的情况,总的说多重更适合MAR
注:此处一元与多元指的是仅有一个特征有缺失值与多个特征有缺失值
对于不同类别的缺失值的处理方法如上图。
以下展开介绍各个方法:
注: k-means插补 与KNN插补很相似,区别在于k-means是利用无缺失值的特征来寻找最近的N个点,然后用这N个点的我们所需的缺失的特征平均值来填充,而KNN则是先用均值填充缺失值再找最近的N个点。
类似的还有 随机回归插补 :也优于纯回归插补
其他单一插补法:
与单一插补方法相比较,多重插补方法充分地考虑了数据的不确定性。多重插补的主要分为三个步骤,综合起来即为:插补、分析、合并。插补步是为每个缺失值都构造出 m 个可能的插补值,缺失模型具有不确定性,这些插补值能体现出模型的这个性质,利用这些可能插补值对缺失值进行插补就得到了 m 个完整数据集。分析步是对插补后的 m 个完整数据集使用一样的统计数据分析方法进行分析,同时得到 m 个统计结果。综合步就是把得到的这 m 个统计结果综合起来得到的分析结果,把这个分析结果作为缺失值的替代值。多重插补构造多个插补值主要是通过模拟的方式对估计量的分布进行推测,然后采用不同的模型对缺失值进行插补,这种插补是随机抽取的方式,这样以来能提高估计的有效性和可靠性。 多重插补-python手册
多重插补法主要有以下几种:
(使用回归、贝叶斯、随机森林、决策树等模型对缺失数据进行预测。)
基于已有的其他字段,将缺失字段作为目标变量进行预测,从而得到较为可能的补全值。如果带有缺失值的列是数值变量,采用回归模型补全;如果是分类变量,则采用分类模型补全。
常见能够自动处理缺失值模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)等。
处理思路: 自动插补 :例如XGBoost会通过training loss reduction来学习并找到最佳插补值。 忽略 :缺失值不参与距离计算,例如:KNN,LightGBM 将缺失值作为分布的一种状态 :并参与到建模过程,例如:决策树以及变体。 不基于距离做计算 :因此基于值得距离计算本身的影响就消除了,例如:DBSCAN。
ID3、、cart、rf到底是如何处理缺失值的?
最精确的做法,把变量映射到高维空间。 比如性别,有男、女缺失三种情况,则映射成3个变量:是否男、否女、是否缺失。连续型变量也可以这样处理。比如Google、 百度的CTR预估模型,预处理时会把所有变量都这样处理,达到几亿维。又或者可根据每个值的频数,将频数较小的值归为一类'other',降低维度。此做法可最大化保留变量的信息。
前推法 (LOCF,Last Observation Carried Forward,将每个缺失值替换为缺失之前的最后一次观测值)与 后推法 (NOCB,Next Observation Carried Backward,与LOCF方向相反——使用缺失值后面的观测值进行填补)
这是分析可能缺少后续观测值的纵向重复测量数据的常用方法。纵向数据在不同时间点跟踪同一样本。当数据具有明显的趋势时,这两种方法都可能在分析中引入偏差,表现不佳。
线性插值 。此方法适用于具有某些趋势但并非季节性数据的时间序列。
季节性调整+线性插值 。此方法适用于具有趋势与季节性的数据。
总而言之,大部分数据挖掘的预处理都会使用比较方便的方法来处理缺失值,比如均值法,但是效果上并不一定好,因此还是需要根据不同的需要选择合适的方法,并没有一个解决所有问题的万能方法。
具体的方法采用还需要考虑多个方面的:
在做数据预处理时,要多尝试几种填充方法,选择表现最佳的即可。
总结来说,没有一个最完美的策略,每个策略都会更适用于某些数据集和数据类型,但再另一些数据集上表现很差。虽然有一些规则能帮助你决定选用哪一种策略,但除此之外,你还应该尝试不同的方法,来找到最适用于你的数据集的插补策略。
当前最流行的方法应该是 删除法、KNN、多重插补法 。
参考文献: 庞新生. 缺失数据处理方法的比较[J]. 统计与决策, 2010(24):152-155.