数据预处理之缺失值处理
缺失机制
在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量,Little 和 Rubin定义了以下三种不同的数据缺失机制:
-
完全随机缺失(Missing Completely at Random,MCAR)。数据的缺失与不完全变量以及完全变量都是无关的。
-
随机缺失(Missing at Random,MAR)。数据的缺失仅仅依赖于完全变量。
-
非随机、不可忽略缺失(Not Missing at Random,NMAR,or nonignorable)。不完全变量中数据的缺失依赖于不完全变量本身,这种缺失是不可忽略的。
从缺失值的所属属性上讲,如果所有的缺失值都是同一属性,那么这种缺失成为单值缺失,如果缺失值属于不同的属性,称为任意缺失。另外对于时间序列类的数据,可能存在随着时间的缺失,这种缺失称为单调缺失。
空值语义
对于某个对象的属性值未知的情况,我们称它在该属性的取值为空值(null value)。空值的来源有许多种,因此现实世界中的空值语义也比较复杂。总的说来,可以把空值分成以下三类:
- 不存在型空值。即无法填入的值,或称对象在该属性上无法取值,如一个未婚者的配偶姓名等。
- 存在型空值。即对象在该属性上取值是存在的,但暂时无法知道。一旦对象在该属性上的实际值被确知以后,人们就可以用相应的实际值来取代原来的空值,使信息趋于完全。存在型空值是不确定性的一种表征,该类空值的实际值在当前是未知的。但它有确定性的一面,诸如它的实际值确实存在,总是落在一个人们可以确定的区间内。一般情况下,空值是指存在型空值。
- 占位型空值。即无法确定是不存在型空值还是存在型空值,这要随着时间的推移才能够清楚,是最不确定的一类。这种空值除填充空位外,并不代表任何其他信息。
判断缺失值的重要性
对于包含有缺失值处理的算法,比如XGB或者LGB,我们可以简单的直接把训练数据扔到模型中训练,查看feature_importance。(由于XGB等属于树模型,不需要太多的数据预处理过程,比如归一化等,也能取得较好的效果,且模型参数对特征的重要性程度影响不是很大,我们只需要知道大概的结果,哪些重要,哪些不重要即可)
沿着这个思路,是不是也可以做一些相关性分析,相关性强的两个特征就可以删除丢失多的那个特征,用丢失少的替代?
处理方法:
丢弃:
- 一般如果某特征的缺失量过大,会直接将该特征舍弃掉,否则反而可能会带入较大的Noise,对结果造成不良影响
增加类别:
- 增加类别:如果样本缺值适中,可以考虑把NaN作为一个新类别(连续值可以考虑离散化后做同样处理)
- 映射到高维空间:比如有A,B,C和缺失四种情况,就映射成四个变量:是否A,是否B,是否C,是否缺失(其实和增加类别后稀疏化一个意思)。这个在样本量大的时候效果才好,不然会因为过于稀疏效果很差
补全:
- 使用中值、分位数、众数、均值、上下数据、随机数填充,但极大概率人为增加噪声,
- 使用其他特征利用其他算法拟合出该缺失特征值,比如K-means聚类,根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据
- 组合完整化方法:用空缺属性值的所有可能的属性取值来试,并从最终属性的约简结果中选择最好的一个作为填补的属性值。这是以约简为目的的数据补齐方法,能够得到好的约简结果;但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大。
- 期望最大化方法(EM)没太明白具体该怎么做:EM算法是一种在不完全数据情况下计算极大似然估计或者后验分布的迭代算法。在每一迭代循环过程中交替执行两个步骤:E步(Excepctaion step,期望步),在给定完全数据和前一次迭代所得到的参数估计的情况下计算完全数据对应的对数似然函数的条件期望;M步(Maximzation step,极大化步),用极大化对数似然函数以确定参数的值,并用于下步的迭代。算法在E步和M步之间不断迭代直至收敛,即两次迭代之间的参数变化小于一个预先给定的阈值时结束。该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
不处理:
- 使用贝叶斯网络或者人工神经网络
用别人的轮子:
比如这些?(没仔细调研):
https://github.com/arsandov/PyMissingData
https://github.com/ajdawson/gridfill
总结
数据的缺失情况: LBS 0.000007 kw2 0.033988 topic2 0.035976 topic1 0.085249 interest1 0.090738 kw1 0.100306 interest5 0.251271 interest2 0.336639 house 0.819141 topic3 0.954129 kw3 0.954255 interest3 0.973562 appIdInstall 0.979739 interest4 0.984889 appIdAciton 1.000000 (表格难打不打了)
appIdAction到topic3感觉可以直接弃用了?
house缺了81%,但是感觉应该是个比较重要的特征?
其余的除了LBS是实数值,其他的都是特征组,8%-33%这部分感觉可以考虑使用增加类别,LBS可以简单填数补全,kw2,topic2聚类然后组合完整化方法?
参考资料:
https://www.zhihu.com/question/26639110
http://www.wangxianfeng.name/2010/07/handling-missing-value/
https://tianle.me/2018/01/22/missing-value/

浙公网安备 33010602011771号