从缺失的产生说起

缺失值的产生的原因多种多样,主要分为机械原因人为原因

  • 机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。
  • 人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据。

缺失值类型

缺失值从缺失的分布来讲可以分为完全随机缺失随机缺失完全非随机缺失

  • 完全随机缺失(missing completely at random,MCAR)指的是数据的缺失是随机的,数据的缺失不依赖于任何不完全变量或完全变量。
  • 随机缺失(missing at random,MAR)指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量。
  • 完全非随机缺失(missing not at random,MNAR)指的是数据的缺失依赖于不完全变量自身。

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

  • 如果所有的缺失值都是同一属性,那么这种缺失成为单值缺失
  • 如果缺失值属于不同的属性,称为任意缺失
  • 另外对于时间序列类的数据,可能存在随着时间的缺失,这种缺失称为单调缺失

处理方法

当缺失比例很小时,可直接对缺失记录进行舍弃或进行手工处理。但在实际数据中,往往缺失数据占有相当的比重。这时如果手工处理非常低效,如果舍弃缺失记录,则会丢失大量信息,使不完全观测数据与完全观测数据间产生系统差异,对这样的数据进行分析,你很可能会得出错误的结论。有时数据颇有价值,数据集中某个条目缺失,导致一个特征无效时,扔掉和重新获取数据集都是不可取的,所以必须采用一些方法来解决这个问题。
从总体上来说分为删除存在缺失值的个案缺失值插补。对于主观数据,人将影响数据的真实性,存在缺失值的样本的其他属性的真实值不能保证,那么依赖于这些属性值的插补也是不可靠的,所以对于主观数据一般不推荐插补的方法。插补主要是针对客观数据,它的可靠性有保证。


简单列举几点处理方法:
(1)使用可用特征的 均值 来填补缺失值;
(2)使用 特征值 来填补缺失值,如-1;
(3) 忽略 有缺失值的样本;
(4)使用 相似样本的均值 填补缺少值;
(5)使用另外的 机器学习算法预测 缺失值。


详细如下:
1.删除含有缺失值的个案

主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。这个方法有很大的局限性。它以减少历史数据来换取信息的完备,会丢弃大量隐藏在这些对象中的信息。在初始数据集包含的对象很少的情况下,删除少量对象足以严重影响信息的客观性和结果的正确性;因此,当缺失数据所占比例较大,特别当遗漏数据非随机分布时,这种方法可能导致数据发生偏离,从而引出错误的结论。
当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。

2.可能值插补缺失值

它的思想来源是以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。在数据挖掘中,面对的通常是大型的数据库,它的属性有几十个甚至几百个,因为一个属性值的缺失而放弃大量的其他属性值,这种删除是对信息的极大浪费,所以产生了以可能值对缺失值进行插补的思想与方法。常用的有如下几种方法。

(1)均值插补
数据的属性分为定距型和非定距型。如果缺失值是定距型的,就以该属性存在值的平均值来插补缺失的值;如果缺失值是非定距型的,就根据统计学中的众数原理,用该属性的众数(即出现频率最高的值)来补齐缺失的值。

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

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

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

以上四种插补方法,对于缺失值的类型为随机缺失的插补有很好的效果。两种均值插补方法是最容易实现的,也是以前人们经常使用的,但是它对样本存在极大的干扰,尤其是当插补后的值作为解释变量进行回归时,参数的估计值与真实值的偏差很大。相比较而言,极大似然估计和多重插补是两种比较好的插补方法,与多重插补对比,极大似然缺少不确定成分,所以越来越多的人倾向于使用多值插补方法。

插补处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实。以上的分析都是理论分析,对于缺失值由于它本身无法观测,也就不可能知道它的缺失所属类型,也就无从估计一个插补方法的插补效果。另外这些方法通用于各个领域,具有了普遍性,那么针对一个领域的专业的插补效果就不会很理想,正是因为这个原因,很多专业数据挖掘人员通过他们对行业的理解,手动对缺失值进行插补的效果反而可能比这些方法更好。缺失值的插补是在数据挖掘过程中为了不放弃大量的信息,而采用的人为干涉缺失值的情况,无论是那种处理方法都会影响变量间的相互关系,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的数据的信息系统,对以后的分析存在潜在的影响,所以对缺失值的处理一定要慎重。

也有一些特殊的处理方法需要说明:

  • 人工填写
    由于最了解数据的还是用户或业务员,因此这个方法产生数据偏离小,可能是填充效果最好的一种。就一般而言,这种方法很费时,当数据规模很大、空值很多的时候,该方法是不可行的。
  • 特殊值填充
    将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。这样将形成另一个有趣的概念,可能导致严重的数据偏离,一般不推荐使用。
  • 热卡填充(就近补齐)
    对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。这个方法的缺点在于难以定义相似标准,主观因素较多。
  • 使用所有可能的值填充
    用空缺属性值的所有可能的属性取值来填充,能够得到较好的补齐效果。但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大,可能的测试方案很多。

它们合适于处理无监督学习的问题,而对有监督学习来说,情况就不尽相同了。譬如,你可以删除包含空值的对象用完整的数据集来进行训练,但预测时你却不能忽略包含空值的对象。

不处理

补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。
不处理缺失值,直接在包含空值的数据上进行数据挖掘的方法包括贝叶斯网络和人工神经网络等。
贝叶斯网络提供了一种自然的表示变量间因果信息的方法,用来发现数据间的潜在关系。在这个网络中,用节点表示变量,有向边表示变量间的依赖关系。贝叶斯网络仅适合于对领域知识具有一定了解的情况,至少对变量间的依赖关系较清楚的情况。否则直接从数据中学习贝叶斯网的结构不但复杂性较高(随着变量的增加,指数级增加),网络维护代价昂贵,而且它的估计参数较多,为系统带来了高方差,影响了它的预测精度。当在任何一个数据中的缺失值数量很大时,存在指数爆炸的危险。
人工神经网络可以有效的对付缺失值,但人工神经网络在这方面的研究还有待进一步深入展开。

知乎上的一种方案:
把变量映射到高维空间。比如性别,有男、女、缺失三种情况,则映射成3个变量:是否男、是否女、是否缺失。连续型变量也可以这样处理。比如Google、百度的CTR预估模型,预处理时会把所有变量都这样处理,达到几亿维。这样做的好处是完整保留了原始数据的全部信息、不用考虑缺失值、不用考虑线性不可分之类的问题。缺点是计算量大大提升。
而且只有在样本量非常大的时候效果才好,否则会因为过于稀疏,效果很差。

小结

大多数数据挖掘系统都是在数据挖掘之前的数据预处理阶段采用第一、第二类方法来对空缺数据进行处理。并不存在一种处理空值的方法可以适合于任何问题。无论哪种方式填充,都无法避免主观因素对原系统的影响,并且在空值过多的情形下将系统完备化是不可行的。从理论上来说,贝叶斯考虑了一切,但是只有当数据集较小或满足某些条件(如多元正态分布)时完全贝叶斯分析才是可行的。而现阶段人工神经网络方法在数据挖掘中的应用仍很有限。值得一提的是,采用不精确信息处理数据的不完备性已得到了广泛的研究。不完备数据的表达方法所依据的理论主要有可信度理论、概率论、模糊集合论、可能性理论,D-S的证据理论等。

处理技巧

pandas库处理

统计每列数据缺失值的分布情况
通过指定参数axis=1来实现对每行数据的缺失值进行统计,默认是axis=0表示列。

df.isnull().sum(axis=0)

删除包含缺失值的行,产生新的dataframe对象,原对象不变

df.dropna(axis=0)

【注】:在使用dropna方法的时候,我们可以通过设置inplace=True直接修改df的值,默认是是Flase 。

删除全为空值的行

df.dropna(how="all")

删除行的缺失值个数大于指定阈值的行
例:删除缺失值个数大于2的行

df.dropna(thresh=2)

删除指定列包含缺失值的行
例:删除C列包含缺失值的行

df.dropna(subset=["C"])
numpy中的缺失值

判断缺失值

np.isnan()

条件判断处理
满足条件(condition),输出x,不满足输出y。

 np.where(condition,x,y)
sklearn库处理

单变量
sklearn提供了单变量插补的工具类SimpleImputer(版本0.20之前,请使用Imputer 类)
类初始化:

def __init__(self, missing_values=np.nan, strategy="mean",fill_value=None, verbose=0, copy=True, add_indicator=False):

参数说明:

  • missing_values :指定何种占位符表示缺失值,可选 number ,string ,np.nan(default) ,None
  • strategy :插补策略,字符串,默认"mean"
    - “mean” :使用每列的平均值替换缺失值,只能与数字数据一起使用
    - “median”:则使用每列的中位数替换缺失值,只能与数字数据一起使用
    - “most_frequent” :则使用每列中最常用的值替换缺失值,可以与字符串或数字数据一起使用
    - “constant” :则用 fill_value 替换缺失值。可以与字符串或数字数据一起使用
  • fill_value :字符串或数值,默认"None",当strategy
    ==“constant”时,fill_value用于替换所有出现的missing_values。如果保留默认值,则在输入数字数据时fill_value将为0,对于字符串或对象数据类型则为“missing_value”。
  • verbose :整数,默认为0,可选的参数,控制imputer的详细程度
  • add_indicator :可选,布尔值类型,默认为False。如果为True,则 MissingIndicator
    变换将堆叠到imputer的变换的输出上。这允许预测估计器尽管插补而解释缺失。如果某个要素在拟合/训练时没有缺失值,即使在变换/测试时缺少值,该要素也不会出现在缺失的指示符上。
    属性说明
  • statistics_ :每一个样本的插补值
  • indicator_ :指示用于为缺失值添加二进制指标
    多变量
    IterativeImputer类,将每个缺失值的特征建模为其他特征的函数,并使用该估计值进行估算。它以循环迭代方式实现:在每个步骤中,将特征目标列指定为输出y,将其他列视为输入X。使用一个回归器来在已知(未缺失)y的样本上对(X,y)进行拟合。然后使用这个回归器来预测缺失的y值。这是以迭代的方式对每个特征进行的,然后重复max_iter轮。最后一轮的计算结果被返回。
    类初始化:
def __init__(self, estimator=None, missing_values=np.nan, sample_posterior=False, max_iter=10, tol=1e-3, n_nearest_features=None, initial_strategy="mean", imputation_order='ascending', min_value=None, max_value=None, verbose=0, random_state=None, add_indicator=False):

参数说明

  • estimator :estimator对象,默认=
    BayesianRidge()。循环法插补的每一步使用的估算器。如果sample_posterior为True,则估算器必须支持
    return_std其predict方法。
  • missing_values :指定何种占位符表示缺失值,可选 number ,string ,np.nan(default) ,None
  • sample_posterior
    :布尔值,默认为False,是否从每个插补的拟合估计的(高斯)预测后验进行采样。如果设置为True,Estimator
    必须支持return_std 其predict 方法。True如果IterativeImputer用于多个插补,则设置为 。
  • max_iter :输入为int型数据,默认值是10。在返回最后一轮计算的估算值之前要执行的最大插补轮次数。
  • tol :容忍停止条件
  • n_nearest_features
    :用于估计每个要素列的缺失值的其他要素数。使用每个特征对之间的绝对相关系数(在初始插补之后)测量特征之间的接近度。为了确保在整个插补过程中覆盖特征,邻居特征不一定是最接近的,而是以与每个插补目标特征的相关性成比例的概率绘制。当功能数量巨大时,可以提供显着的加速。如果None,将使用所有功能。
  • initial_strategy :使用哪种策略初始化缺失值。与 SimpleImputer 中的strategy参数相同
  • imputation_order :排序规则
    - ascending :从缺失值最少的功能到最多
    - descending :从具有最多缺失值的功能到最少
    - roman :左到右
    - arabic :右到左
    - random :随机顺序
  • min_value :最小可能的估算值。默认值None将最小值设置为负无穷大。
  • max_value :最大可能的估算值。默认值None将最大值设置为正无穷大。
  • verbose :详细程度标志控制在评估函数时发出的调试消息。越高越详细。可以是0,1或2。
  • random_state :伪随机数生成器的种子使用。如果 n_nearest_features不是None,
  • imputation_order则随机选择估计器特征, if random和后验if的采样sample_posterior为True。
  • add_indicator:如果为True,则MissingIndicator变换将堆叠到imputer的变换的输出上。这允许预测估计器尽管插补而解释缺失。如果某个要素在拟合/训练时没有缺失值,即使在变换/测试时缺少值,该要素也不会出现在缺失的指示符上。
    标记缺失值
    MissingIndicator 转换器用于将数据集转换为相应的二进制矩阵,以指示数据集中缺失值的存在。这个变换与归算结合起来是有用的。当使用插补时,保存关于哪些值丢失的信息可以提供有用的信息。
def __init__(self, missing_values=np.nan, features="missing-only",sparse="auto", error_on_new=True):

参数说明

  • missing_values :指定何种占位符表示缺失值,可选 number ,string ,np.nan(default) ,None
  • features :植入掩模是否应代表全部或部分特征。
    - “missing-only” (default):在fit时返回包含缺失值的特征的输入掩码
    - “all”:回所有特征,无论它们是否包含缺失的值
  • sparse :返回的标记矩阵是否是稀疏
    - auto:则imputer mask将与输入类型相同
    - True:则imputer mask将是稀疏
    - False:则imputer mask将是一个numpy数组
  • error_on_new :布尔值,如果为True(默认值),当变换中不含有缺少缺少值的要- 素时,transform将引发错误。这仅适用于features=“missing-only”。

数据清洗----缺失值处理相关推荐

  1. 机器学习之数据预处理——数据清洗(缺失值、异常值和重复值的处理)

    机器学习之数据预处理--数据清洗缺失值.异常值和重复值的处理 基础知识 技术点总结 数据列缺失的处理方法 1.丢弃(缺失值处理) 1.生成一份随机数据 2.查看哪些值缺失 3.获得含有NA的列 4.获 ...

  2. 数据清洗 - 缺失值,异常值,重复值处理

    数据清洗 数据清洗的对象就是缺失值,重复值,异常值 一 重复值的处理一般用删除法,但是在业务上有意义的重复值不能删除import numpy as np import pandas as pd imp ...

  3. 竞赛数据清洗缺失值_Kaggle 数据清洗挑战 Day 1 - 手把手教你五步处理缺失值

    前些天报名参加了 Kaggle 的 Data Cleaning 5天挑战,5天的任务如下: Day 1: Handling missing values Day 2: Data scaling and ...

  4. R语言-数据清洗-缺失值处理

    缺失值处理包括两个步骤,即缺失数据的识别和缺失值处理.在R语言总缺失值以NA表示,可以使用函数is.na()判断缺失值是否存在,函数complete.cases()可识别样本数据是否完整从而判断缺失情 ...

  5. Python中数据清洗缺失值,重复值和异常值的处理

    1 缺失值的处理 1.1 常规缺失值的处理 np.nan,NaN,None,NaT(时间数据类型的缺失值)等 df.isnull() 1.判断每一个df中的数据是否为缺失值,是则返回True,否则返回 ...

  6. Pandas数据分析17——pandas数据清洗(缺失值、重复值处理)

    参考书目:<深入浅出Pandas:利用Python进行数据处理与分析> pandas对大数据有很多便捷的清洗用法,尤其针对缺失值和重复值.缺失值就不用说了,会影响计算,重复值有时候可能并未 ...

  7. 【金融申请评分卡】数据准备 - 缺失值数据清洗

    今天我们来聊聊数据准备中的数据清洗. 其实数据清洗这四个字对于常常做数据分析建模的同学们一定不陌生,不管在实际工作中有没有真正做清洗,我们都会先把这个口号喊出来,数据清洗这块其实我也一直不太愿意拿出来 ...

  8. python绘制正态分布函数_Python数据清洗(三):异常值识别与处理

    作者 | 刘顺祥 来源 | 数据分析1480 原文 |Python数据清洗--缺失值识别与处理 在<Python数据清洗(一):类型转换和冗余数据删除>和<Python数据清洗(二) ...

  9. python数据异常值处理_Python数据清洗(三):异常值识别与处理

    作者 | 刘顺祥 来源 | 数据分析1480 原文 |Python数据清洗--缺失值识别与处理 在<Python数据清洗(一):类型转换和冗余数据删除>和<Python数据清洗(二) ...

  10. python箱线图异常值_Python数据清洗--异常值识别与处理01

    前言 在<Python数据清洗--类型转换和冗余数据删除>和<Python数据清洗--缺失值识别与处理>文中已经讲解了有关数据中重复观测和缺失值的识别与处理,在本节中将分享异常 ...

最新文章

  1. SpringBoot学习(一)
  2. python教程书籍-初学者最好的Python书籍列表
  3. opencv求两张图像光流_OpenCV单应性矩阵发现参数估算方法详解
  4. java文本框背景_用Java编写小程序(包含组合框下拉和文本框)变换背景颜色
  5. vSphere vsan 6.5部署之一VCSA6.5安装
  6. OpenZeppelin集成Truffle编写健壮安全的合约
  7. Dockerfile怎么创建镜像
  8. 图像处理学习--银行卡号码识别(1)
  9. DPDK——IP分片和重组库
  10. Ollydbg使用方法和技巧
  11. 安卓逆向——某宝app爬虫抓取
  12. python数据写入csv、csv转excel、用Pandas把数据写入excel简单总结
  13. css样式写一个公告通知
  14. 现代设计在中国丨包豪斯城市会客厅无锡站圆满结束!
  15. 那些有趣的网站(二)
  16. unity 3d slider机械臂转动
  17. 已知总线长度为1km,信号在总线上的传播速度为2×10^8m/s,数据传输速率为10Mbit/s。请问CSMA/CD算法成立的最短帧长度是多少?写出计算过程。
  18. 基于仿真的优化 matlab ansys,桁架结构优化的MATLAB和ANSYS联合仿真
  19. python二维码生成识别代码_Python3+qrcode+zxing生成和识别二维码教程
  20. mysql 更改密码 alter_MySQL修改账号密码方法大全

热门文章

  1. Web 前端常用插件
  2. oracle数据库sqlloader,Oracle SQL Loader(sqlldr)
  3. 记一次 ORA-600 [12700] 故障案例
  4. Ruijie SSL V P N 垂直越权漏洞
  5. linux服务器怎么连接
  6. U盘启动盘,启动时报错Failed to load ldlinux.c32的解决办法
  7. h5页面预览pdf文件_H5怎么实现在线预览PDF
  8. CCNA学习笔记-1 基础知识回顾
  9. 局域网限速软件_网络发包软件-割包合同适用于任何游戏?
  10. 口令破解(概述、暴力破解、字典破解、Hydra)