数据处理笔记6:缺失值填充

参考:

http://118.31.76.100:100/math/statics_topic/deal-na/

缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表示数值不存在)。漠视这些数值的特殊性,直接拿来进行挖掘,那么很可能会得到错误的结论。

常数来填充常常不是一个好方法。最好建立一些模型,根据数据的分布来填充一个更恰当的数值。(例如根据其它变量对记录进行数据分箱,然后选择该记录所在分箱的相应变量的均值或中位数,来填充缺失值,效果会更好一些)

参考:

https://zhuanlan.zhihu.com/p/348005303

简单填充

数值型变量用平均值或中位数填充,分类型变量用众数填充

热卡填充:也叫就近补齐,在完整数据中找一个与含有缺失值的记录最相似的记录进行填充,不过相似的标准很难界定

聚类填充:聚类后,对一类中的缺失值,使用该类中的样本均值进行填充。

拟合方法

回归预测:对于包含空值的对象,将已知数据集带入回归方程来估计预测值,并以此预测值来进行填充,但是当变量不是线性相关时则会导致偏差的估计;

期望值最大化方法预测:在不完全数据情况下计算极大似然估计或者后验分布的迭代算法,该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。

多重插补预测:为每一个缺失值都产生一套可能的插补值,这些值反应了缺失值的不确定性,然后对插补集合根据评分函数进行选择,产生最终的插补值

虚拟变量:衍生出一个取值为0,1的变量,来标记某一变量是否缺失

常数值/拉格朗日插值填充代码示例:

https://www.cnblogs.com/yanshw/p/10701919.html

根据数据情况处理, 参考:

https://zhuanlan.zhihu.com/p/137175585

数据处理笔记6:缺失值填充_第1张图片

sklearn用KNN代码示例

https://www.zhihu.com/question/268540071/answer/338879847

填充流程(代码示例), 条件(同label)均值:

https://www.zhihu.com/question/268540071/answer/338879847

参考kaggle处理缺失值教程:

https://www.kaggle.com/dansbecker/handling-missing-values

from sklearn.impute import SimpleImputer

my_imputer = SimpleImputer()

data_with_imputed_values = my_imputer.fit_transform(original_data)

#需要转换ndarray

data_with_imputed_values = pd.DataFrame(my_imputer.fit_transform(original_data))

#但是,这意味着您将丢失列标题。由于列的顺序在插补后不会更改,因此您可以按如下方式重新添加标题:

data_with_imputed_values.columns = original_data.columns

# Make new columns indicating what will be imputed

for col in cols_with_missing:

    X_train_plus[col + '_was_missing'] = X_train_plus[col].isnull()

    X_valid_plus[col + '_was_missing'] = X_valid_plus[col].isnull()

# Imputation

my_imputer = SimpleImputer()

imputed_X_train_plus = pd.DataFrame(my_imputer.fit_transform(X_train_plus))

imputed_X_valid_plus = pd.DataFrame(my_imputer.transform(X_valid_plus))

# Imputation removed column names; put them back

imputed_X_train_plus.columns = X_train_plus.columns

imputed_X_valid_plus.columns = X_valid_plus.columns

干货教程:

https://www.kaggle.com/rtatman/data-cleaning-challenge-handling-missing-values

用同一列中紧随其后的任何值替换缺失值。

(这对于观测值具有某种逻辑顺序的数据集很有意义。)

# replace all NA's the value that comes directly after it in the same column,

# then replace all the reamining na's with 0

subset_nfl_data.fillna(method = 'bfill', axis=0).fillna(0)

参考:

https://www.kaggle.com/parulpandey/a-guide-to-handling-missing-values-in-python

线性插值利用相邻数据点的线性关系

# Interpolate using the linear method

city_day1.interpolate(limit_direction="both",inplace=True)

city_day1['Xylene'][50:65]

from sklearn.impute import KNNImputer

train_knn = train.copy(deep=True)

knn_imputer = KNNImputer(n_neighbors=2, weights="uniform")

train_knn['Age'] = knn_imputer.fit_transform(train_knn[['Age']])

多元特征插补 - 通过链式方程 (MICE) 进行多元插补

一种通过以循环方式将缺失值建模为其他特征的函数来估算缺失值的策略。

它对数据的随机样本执行多重回归,然后取多重回归值的平均值并使用该值来估算缺失值。

from sklearn.experimental import enable_iterative_imputer

from sklearn.impute import IterativeImputer

train_mice = train.copy(deep=True)

mice_imputer = IterativeImputer()

train_mice['Age'] = mice_imputer.fit_transform(train_mice[['Age']])

数据缺失机制

1. 完全随机缺失(Missing Completely at Random,MCAR)

数据的缺失与不完全变量以及完全变量都是无关的。

对整个数据的影响没有任何的偏好性,呈现均一分布。

2. 随机缺失(Missing at Random,MAR)。

数据的缺失仅仅依赖于完全变量。

不是完全随机的,该类数据的缺失依赖于其他观测变量。比如时间梯度越长的采集越可能有缺失值的出现

将时间变量进行控制,那么数据的缺失也就变成了完全随机的了。所以也有人认为MCAR和MAR二者没啥区别,或者认为MCAR是MAR的一个特例(doi:10.1186⁄1471-2105-13-S16-S5)。

3.非随机、不可忽略缺失(Not Missing at Random,NMAR,or nonignorable)。

不完全变量中数据的缺失依赖于不完全变量本身,这种缺失是不可忽略的。

如某些肽段的含量在仪器的检测限以下,这些肽段的定量信息就很有可能丢失,但是你又不能说这些肽段真的不存在,所以这种情况是比较纠结的,这就是所谓的左删失数据(left-censored data)。

从缺失值的所属属性上讲,

如果所有的缺失值都是同一属性,那么这种缺失成为单值缺失

如果缺失值属于不同的属性,称为任意缺失。

另外对于时间序列类的数据,可能存在随着时间的缺失,这种缺失称为单调缺失

常用方法

删除或补齐

5.2 数据补齐

这类方法是用一定的值去填充空值,从而使信息表完备化。通常基于统计学原理,根据决策表中其余对象取值的分布情况来对一个空值进行填充,譬如用其余属性的平均值来进行补充等。数据挖掘中常用的有以下几种补齐方法:

5.2.1 人工填写(filling manually)

由于最了解数据的还是用户自己,因此这个方法产生数据偏离最小,可能是填充效果最好的一种。然而一般来说,该方法很费时,当数据规模很大、空值很多的时候,该方法是不可行的。

5.2.2 特殊值填充(Treating Missing Attribute values as Special values)

将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。这样将形成另一个有趣的概念,可能导致严重的数据偏离,一般不推荐使用。

5.2.3 平均值填充(Mean/Mode Completer)

将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。另外有一种与其相似的方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,缺失属性值的补齐同样是靠该属性在其他对象中的取值求平均得到,但不同的是用于求平均的值并不是从信息表所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。

5.2.4 热卡填充(Hot deck imputation,或就近补齐)

对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。这个方法的缺点在于难以定义相似标准,主观因素较多。

5.2.5 K最近距离邻法(K-means clustering)

先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。

同均值插补的方法都属于单值插补,不同的是,它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。如果在以后统计分析中还需以引入的解释变量和Y做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。

该方法主要是通过预先设定的K个邻居(其它肽段或者蛋白质的表达量),根据这些邻居的信息推算出缺失值的大小。一般的数据处理流程是先计算目标对象(含有缺失值的肽段或者蛋白质)与其他对象之间的距离(一般默认计算的是欧氏距离),计算完成后,选择K个(K值是我们预先设定的)距离最近的对象,然后将对应位置的数值进行平均或者加权,其得到的数值用来表征该缺失值的大小。R代码实现:

5.2.6 使用所有可能的值填充(Assigning All Possible values of the Attribute)

这种方法是用空缺属性值的所有可能的属性取值来填充,能够得到较好的补齐效果。但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大,可能的测试方案很多。另有一种方法,填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试,这样能够在一定程度上减小原方法的代价。

5.2.7 组合完整化方法(Combinatorial Completer)

这种方法是用空缺属性值的所有可能的属性取值来试,并从最终属性的约简结果中选择最好的一个作为填补的属性值。这是以约简为目的的数据补齐方法,能够得到好的约简结果;但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大。另一种称为条件组合完整化方法(Conditional Combinatorial Complete),填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试。条件组合完整化方法能够在一定程度上减小组合完整化方法的代价。在信息表包含不完整数据较多的情况下,可能的测试方案将巨增。

5.2.8 回归(Regression)

基于完整的数据集,建立回归方程(模型)。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关或预测变量高度相关时会导致有偏差的估计。

5.2.9 期望值最大化方法(Expectation maximization,EM)

在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。

EM算法是一种在不完全数据情况下计算极大似然估计或者后验分布的迭代算法。在每一迭代循环过程中交替执行两个步骤:E步(Excepctaion step,期望步),在给定完全数据和前一次迭代所得到的参数估计的情况下计算完全数据对应的对数似然函数的条件期望;M步(Maximzation step,极大化步),用极大化对数似然函数以确定参数的值,并用于下步的迭代。算法在E步和M步之间不断迭代直至收敛,即两次迭代之间的参数变化小于一个预先给定的阈值时结束。该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。

5.2.10 有序K近邻法(Sequential KNN)

方法是对上述KNN法的改进,它在缺失值占比稍微大些的数据中表现依然良好。实现流程是先根据数据中每个对象缺失值的比例进行排序(这里也就体现出“Sequential”的思想),从比例最小的那个对象开始计算,根据预先设定的K个近邻(注意这里是指没有缺失值的,KNN法里面并没有强调这一点)的值进行加权或者平均计算填充。此外当该对象填充完毕后,也会加入后续其他对象缺失值填充的计算当中。R代码实现:

>library(SeqKnn)

>SeqKNN(data,k=10)

这里我们用SeqKnn包的SeqKNN函数,其中data就是我们要导入的数据,一般是矩阵的形式;k就是我们预先设定的近邻数,根据经验一般取值是10到20之间。

5.2.10 多重填补(Multiple Imputation,MI)

多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。

多重填补方法分为三个步骤:;为每个空值产生一套可能的填补值,这些值反映了无响应模型的不确定性;每个值都被用来填补数据集中的缺失值,产生若干个完整数据集合。;每个填补数据集合都用针对完整数据集的统计方法进行统计分析。;对来自各个填补数据集的结果进行综合,产生最终的统计推断,这一推断考虑到了由于数据填补而产生的不确定性。该方法将空缺值视为随机样本,这样计算出来的统计推断可能受到空缺值的不确定性的影响。该方法的计算也很复杂。

多重插补方法分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。

假设一组数据,包括三个变量Y1,Y2,Y3,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失Y3,C组缺失Y1和Y2。在多值插补时,对A组将不进行任何处理,对B组产生Y3的一组估计值(作Y3关于Y1,Y2的回归),对C组作产生Y1和Y2的一组成对估计值(作Y1,Y2关于Y3的回归)。

当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测即,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组Y3的值,对C将利用 Y1,Y2,Y3它们的联合分布为正态分布这一前提,估计出一组(Y1,Y2)。

上例中假定了Y1,Y2,Y3的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。

多重插补和贝叶斯估计的思想是一致的,但是多重插补弥补了贝叶斯估计的几个不足。

(1)贝叶斯估计以极大似然的方法估计,极大似然的方法要求模型的形式必须准确,如果参数形式不正确,将得到错误得结论,即先验分布将影响后验分布的准确性。而多重插补所依据的是大样本渐近完整的数据的理论,在数据挖掘中的数据量都很大,先验分布将极小的影响结果,所以先验分布的对结果的影响不大。

(2)贝叶斯估计仅要求知道未知参数的先验分布,没有利用与参数的关系。而多重插补对参数的联合分布作出了估计,利用了参数间的相互关系。

其中是以sleep数据(VIM包中动物睡眠数据)为例展开的,mice()就是进行插补的函数,它里面m参数是指生成完整数据集的个数,defaultMethod参数是指选择填充缺失值的方法,seed参数是为了保证结果的重复性;with()就是我们进行标准方法流程对填充好的完整数据集进行分析,这里面我们选择的是线性模型来分析做梦(Dream)变量与另外两个变量(Span,寿命;Gest,妊娠期)之间的线性关系;pool()函数整合最终的结果。

5.2.11 C4.5方法

通过寻找属性间的关系来对遗失值填充。它寻找之间具有最大相关性的两个属性,其中没有遗失值的一个称为代理属性,另一个称为原始属性,用代理属性决定原始属性中的遗失值。这种基于规则归纳的方法只能处理基数较小的名词型属性。

就几种基于统计的方法而言,删除元组法和平均值法差于hot deck、EM和MI;回归是比较好的一种方法,但仍比不上hot deck和EM;EM缺少MI包含的不确定成分[46]。值得注意的是,这些方法直接处理的是模型参数的估计而不是空缺值预测本身。它们合适于处理无监督学习的问题,而对有监督学习来说,情况就不尽相同了。譬如,你可以删除包含空值的对象用完整的数据集来进行训练,但预测时你却不能忽略包含空值的对象。另外,C4.5和使用所有可能的值填充方法也有较好的补齐效果,人工填写和特殊值填充则是一般不推荐使用的。

你可能感兴趣的:(数据分析,数据挖掘,缺失值处理)