精华内容
下载资源
问答
  • 常见的处理缺失值的方法有
    万次阅读
    2019-06-29 19:05:41

    缺失值补充 造成属性值缺失的原因有很多,比如信息暂时无法获取,信息被遗漏(有机械原因也有人为原因),有些对象的某个或者某些属性是不可用的,有些信息被认为是不重要的,获取这些信息的代价太大,系统实时性能要求较高;此外对缺失值的处理一定要具体问题具体分析,因为缺失值并不意味着数据缺失,缺失本身也是包含信息的,所以需要根据不同的场景下的缺失值进行合理填充。 目前缺失值的类型,含有缺失值的变量被称为不完全变量,而不含有缺失值的变量被称为完全变量,从缺失的分布来说又分为完 全随机缺失,随机缺失和完全非随机缺失:

    • 完全随机缺失:指的是数据的缺失是完全随机的;
    • 随机缺失:指的是数据的缺失不是完全随机的,和完全变量关;
    • 完全不随机缺失:指的是数据的缺失与不完全变量自身的取值相关; 缺失值会使得系统丢失了大量的有用信息,系统所表现出来的不确定性更加显著,系统中蕴含的确定性成分更难把握,包含空值的不完全变量会使得挖掘过程陷入混乱。

    下面来先讲一下缺失值的处理:

    • 1.1 删除法,主要有简单删除法
    • 1.1.1 简单删除法适合于缺失值样本比较少的情况下,如果有过多的缺失值,则不适合使用该方法,因为该方法是用减少历史数据的方法来换取数据的完备性,这样会造成资源的极大浪费,因为其丢弃了大量隐藏在这些对象上的信息,在样本数量本来就很少的数据集中删除少量对象将严重影响数据集的客观性和结果的正确性;
    • 1.2 数据补齐,主要有人工填写、特殊值填充、平均值填充、热卡填充、K-means填充,使用所有可能的值填充、组合完整化方法,回归法,期望值最大化方法,多重填补以及C4.5方法;
    • 1.2.1 人工填写,用户自己对数据最为了解,因此这个方法产生的偏差是最小的,但是如果有大规模的缺失值时,这个方法是非常耗时耗力的;
    • 1.2.2 特殊值填充,将空值作为一种特殊值来处理,但是有可能造成严重的数据偏离,一般不推荐使用;
    • 1.2.3 平均值填充,如果是数值型特征,则是使用平均值来填充,如果是类别型特征,则是使用众数来填充,另一种相似的方法是条件平均值填充,这个并不是直接使用所有对象来计算平均值或者众数,而是使用与该样本具有相同决策属性的对象中去求解平均值或者众数;
    • 1.2.4 热卡填充,或者说就叫做近补齐,对于一个包含空值的对象,热卡填充法在完整数据集中找到一个与它最相似的对象,用这个值来填充;
    • 1.2.5 k-means利用欧式距离或者相关性分析来确定距离最近的K个样本,将这K个值的加权平均值来估计该样本的缺失数据;
    • 1.2.6 组合完整化方法,用空缺属性值的所有可能的属性取值来试,并从最终属性的约间结果中选择一个最好的属性值;
    • 1.2.7 使用所有可能的值填充,使用所有可能的属性值来填充,能够得到很好的效果;
    • 1.2.8 回归,基于完整的数据集,建立回归方程。对于包含空值的对象,将已知数据集带入回归方程来估计预测值,并以此预测值来进行填充,但是当变量不是线性相关时则会导致偏差的估计;
    • 1.2.9 期望值最大化方法,在不完全数据情况下计算极大似然估计和后验分布的迭代算法;
    • 1.2.10 多重填补
    • 1.2.11 C4.5
    • 1.3 不处理,直接在包含空值的数据集上进行处理比如贝叶斯网络和人工神经网络
    更多相关内容
  • pandas如何处理缺失值

    2020-12-31 04:35:53
    在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值常见的缺失值处理方式,过滤、填充。 一、缺失值的判断 pandas使用浮点值NaN(Not a Number)表示浮点数和非...
  • 缺失值处理方法

    千次阅读 2021-07-07 08:35:57
    缺失值处理介绍一、造成数据缺失的原因二、数据缺失机制三、空值语义四、空值处理的重要性和复杂性五、空值处理方法的分析比较5.1 删除元组5.2 数据补齐5.2.1 人工填写(filling manually)5.2.2 特殊值填充...

    介绍

    对于数据挖掘和分析人员来说,数据准备(Data Preparation,包括数据的抽取、清洗、转换和集成)常常占据了70%左右的工作量。而在数据准备的过程中,数据质量差又是最常见而且令人头痛的问题。本文针对缺失值和特殊值这种数据质量问题,进行了初步介绍并推荐了一些处理方法。

    值得注意的是,这里所说的缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表示数值不存在)。如果我们仅有数据库的数据模型,而缺乏相关说明,常常需要花费更多的精力来发现这些数值的特殊含义。而如果我们漠视这些数值的特殊性,直接拿来进行挖掘,那么很可能会得到错误的结论。

    还有一种数值缺失的情况,是因为我们要求统计的时间窗口并非对所有数据都适合。例如,我们希望计算出“客户在以前六个月内的最大存款余额”,对于那些建立账户尚不满六个月的客户来说,统计出来的数值与我们想要得到的就可能存在差距。

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

    一、造成数据缺失的原因

    在各种实用的数据库中,属性值缺失的情况经常发全甚至是不可避免的。因此,在大多数情况下,信息系统是不完备的,或者说存在某种程度的不完备。缺失值的产生的原因多种多样,主要分为机械原因和人为原因。

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

    造成数据缺失的原因是多方面的,主要可能有以下几种:

    • 有些信息暂时无法获取。例如在医疗数据库中,并非所有病人的所有临床检验结果都能在给定的时间内得到,就致使一部分属性值空缺出来。又如在申请表数据中,对某些问题的反映依赖于对其他问题的回答。

    • 有些信息是被遗漏的。可能是因为输入时认为不重要、忘记填写了或对数据理解错误而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人为因素等原因而丢失了。

    • 有些对象的某个或某些属性是不可用的。也就是说,对于这个对象来说,该属性值是不存在的,如一个未婚者的配偶姓名、一个儿童的固定收入状况等。

    • 有些信息(被认为)是不重要的。如一个属性的取值与给定语境是无关的,或训练数据库的设计者并不在乎某个属性的取值(称为dont-care value)。

    获取这些信息的代价太大。统计分析实时性能要求较高,即要求得到这些信息前迅速做出判断或决策。

    二、数据缺失机制

    在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。

    • 完全变量:将数据集中不含缺失值的变量(属性)称为完全变量,
    • 不完全变量:数据集中含有缺失值的变量称为不完全变量。

    Little 和 Rubin定义了以下三种不同的数据缺失机制:

    1. 完全随机缺失(Missing Completely at Random,MCAR)
      数据的缺失与不完全变量以及完全变量都是无关的。即:数据的缺失不依赖于自身或者其他变量,完全是随机的。比如你在街头请路人填问卷采集数据,路人很可能由于某种原因(肚子疼,或者他妈喊他回家吃饭等等)中途撤走,那么你的数据就不完整了。再比如你的质谱在采集数据过程中,不小心受到某种程度的扰动(鬼知道仪器经历了什么…),导致你的数据受到影响,最后在搜库匹配时,无法给出对应的定量信息。这种情况指不清道不明,完全随机,所以它对你整个数据的影响没有任何的偏好性,呈现均一分布。

    2. 随机缺失(Missing at Random,MAR)
      数据的缺失仅仅依赖于完全变量。即:数据的缺失不是完全随机的,该类数据的缺失依赖于其他观测变量,但与该变量本身的数值不相关。比如时间梯度越长的采集越可能有缺失值的出现。这个时候,若是我们将时间变量进行控制,那么数据的缺失也就变成了完全随机的了。所以也有人认为MCAR和MAR二者没啥区别,或者认为MCAR是MAR的一个特例。

    3. 非随机、不可忽略缺失(Not Missing at Random,NMAR,or nonignorable)
      不完全变量中数据的缺失依赖于不完全变量本身,这种缺失是不可忽略的。即:数据的缺失依赖于观测变量自身。比如在质谱检测的过程中,某些肽段的含量在仪器的检测限以下,这些肽段的定量信息就很有可能丢失,但是你又不能说这些肽段真的不存在,所以这种情况是比较纠结的,这就是所谓的左删失数据(left-censored data)。

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

    三、空值语义

    对于某个对象的属性值未知的情况,我们称它在该属性的取值为空值(null value)。空值的来源有许多种,因此现实世界中的空值语义也比较复杂。总的说来,可以把空值分成以下三类:

    1. 不存在型空值。即无法填入的值,或称对象在该属性上无法取值,如一个未婚者的配偶姓名等。

    2. 存在型空值。即对象在该属性上取值是存在的,但暂时无法知道。一旦对象在该属性上的实际值被确知以后,人们就可以用相应的实际值来取代原来的空值,使信息趋于完全。存在型空值是不确定性的一种表征,该类空值的实际值在当前是未知的。但它有确定性的一面,诸如它的实际值确实存在,总是落在一个人们可以确定的区间内。一般情况下,空值是指存在型空值。

    3. 占位型空值。即无法确定是不存在型空值还是存在型空值,这要随着时间的推移才能够清楚,是最不确定的一类。这种空值除填充空位外,并不代表任何其他信息。

    四、空值处理的重要性和复杂性

    数据缺失在许多研究领域都是一个复杂的问题。对数据挖掘来说,空值的存在,造成了以下影响:

    • 第一,系统丢失了大量的有用信息;
    • 第二,系统中所表现出的不确定性更加显著,系统中蕴涵的确定性成分更难把握;
    • 第三,包含空值的数据会使挖掘过程陷入混乱,导致不可靠的输出。

    数据挖掘算法本身更致力于避免数据过分适合所建的模型,这一特性使得它难以通过自身的算法去很好地处理不完整数据。因此,空缺的数据需要通过专门的方法进行推导、填充等,以减少数据挖掘算法与实际应用之间的差距。

    五、空值处理方法的分析比较

    处理不完备数据集的方法主要有以下三大类:

    5.1 删除元组

    也就是将存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表。

    • 优点:简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与信息表中的数据量相比非常小的情况下是非常有效的,类标号(假设是分类任务)缺少时通常使用。
    • 缺点:它是以减少历史数据来换取信息的完备,会造成资源的大量浪费,丢弃了大量隐藏在这些对象中的信息。在信息表中本来包含的对象很少的情况下,删除少量对象就足以严重影响到信息表信息的客观性和结果的正确性;当每个属性空值的百分比变化很大时,它的性能非常差。因此,当遗漏数据所占比例较大,特别当遗漏数据非随机分布时,这种方法可能导致数据发生偏离,从而引出错误的结论。
      python中统计缺失值的方法如下:
    import numpy as np
    import pandas as pd
    data = pd.read_csv('data.csv',encoding='GBK')
    # 将空值形式的缺失值转换成可识别的类型
    data = data.replace(' ', np.NaN)
    print(data.columns)#['id', 'label', 'a', 'b', 'c', 'd']
    #将每列中缺失值的个数统计出来
    null_all = data.isnull().sum()
    #id       0
    #label    0
    #a        7
    #b        3
    #c        3
    #d        8
    #查看a列有缺失值的数据
    a_null = data[pd.isnull(data['a'])]
    #a列缺失占比
    a_ratio = len(data[pd.isnull(data['a'])])/len(data) #0.0007
    #丢弃缺失值,将存在缺失值的行丢失
    new_drop = data.dropna(axis=0)
    print(new_drop.shape)#(9981,6)
    
    #丢弃某几列有缺失值的行
    new_drop2 = data.dropna(axis=0, subset=['a','b'])
    print(new_drop2.shape)#(9990,6)
    

    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代码实现:

    library(impute)
    impute.kmm(data,k=10,rowmax=0.5,colmax=0.8)
    这里面我们用impute包的imput.knn函数,其中data就是要导入的数据,一般是矩阵的形式;k就是我们预先设定的近邻数,默认为10,根据经验一般取值是10到20之间;rowmax和colmax是控制的导入数据中行或者列含有缺失值的比例,比如rowmax=0.5是指当某行的数据缺失值占的比例超过了50%,那么这些缺失值就会用整个样本的均值去填充,而不是我们上面提到的根据K个邻居来填充了;colmax=0.8是指任何一列的数据中当缺失值的比例超过了80%,那么计算就会停止并会报出错误。

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

    library(mice)
    data(sleep,package=“VIM”)
    imp<-mice(sleep,m=5,defaultMethod=“pmm”,seed=1234)

    fit<-with(imp,lm(dream~span+Gest))
    pooled<-pool(fit)
    summary(pooled)
    其中是以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和使用所有可能的值填充方法也有较好的补齐效果,人工填写和特殊值填充则是一般不推荐使用的。

    补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。

    5.3 不处理

    直接在包含空值的数据上进行数据挖掘。这类方法包括贝叶斯网络和人工神经网络等。

    1. 贝叶斯网络是用来表示变量间连接概率的图形模式,它提供了一种自然的表示因果信息的方法,用来发现数据间的潜在关系。在这个网络中,用节点表示变量,有向边表示变量间的依赖关系。贝叶斯网络仅适合于对领域知识具有一定了解的情况,至少对变量间的依赖关系较清楚的情况。否则直接从数据中学习贝叶斯网的结构不但复杂性较高(随着变量的增加,指数级增加),网络维护代价昂贵,而且它的估计参数较多,为系统带来了高方差,影响了它的预测精度。当在任何一个对象中的缺失值数量很大时,存在指数爆炸的危险。

    2. 人工神经网络可以有效的对付空值,但人工神经网络在这方面的研究还有待进一步深入展开。人工神经网络方法在数据挖掘应用中有局限性。

    总结

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

    代码参考:https://blog.csdn.net/weixin_42902413/article/details/87856623

    展开全文
  • 机器学习中处理缺失值的9种方法

    千次阅读 2020-10-31 11:01:04
    数据科学就是关于数据...在这个文章中,我将分享处理数据缺失的9种方法,但首先让我们看看为什么会出现数据缺失以及多少类型的数据缺失。 不同类型的缺失值 缺失的值主要三种类型。 完全随机缺失(MCAR):当数据为.

    在这里插入图片描述

    数据科学就是关于数据的。它是任何数据科学或机器学习项目的关键。在大多数情况下,当我们从不同的资源收集数据或从某处下载数据时,几乎有95%的可能性我们的数据中包含缺失的值。我们不能对包含缺失值的数据进行分析或训练机器学习模型。这就是为什么我们90%的时间都花在数据预处理上的主要原因。我们可以使用许多技术来处理丢失的数据。在这个文章中,我将分享处理数据缺失的9种方法,但首先让我们看看为什么会出现数据缺失以及有多少类型的数据缺失。

    不同类型的缺失值

    缺失的值主要有三种类型。

    • 完全随机缺失(MCAR):当数据为MCAR时,如果所有观测的缺失概率都相同,则一个变量完全随机缺失,这意味着数据缺失与数据集中任何其他观察到的或缺失的值完全没有关系。换句话说,那些缺失的数据点是数据集的一个随机子集。
    • 丢失数据不是随机的(MNAR):顾名思义,丢失的数据和数据集中的任何其他值之间存在某种关系。
    • 随机丢失(MAR):这意味着数据点丢失的倾向与丢失的数据无关,但与数据集中其他观察到的数据有关。

    数据集中缺少值的原因有很多。例如,在数据集的身高和年龄,会有更多年龄列中缺失值,因为女孩通常隐藏他们的年龄相同的如果我们准备工资的数据和经验,我们将有更多的薪水中的遗漏值因为大多数男人不喜欢分享他们的薪水。在更大的情况下,比如为人口、疾病、事故死亡者准备数据,纳税人记录通常人们会犹豫是否记下信息,并隐藏真实的数字。即使您从第三方资源下载数据,仍然有可能由于下载时文件损坏而丢失值。无论原因是什么,我们的数据集中丢失了值,我们需要处理它们。让我们看看处理缺失值的9种方法。

    这里使用的也是经典的泰坦尼克的数据集

    让我们从加载数据集并导入所有库开始。

    import pandas as pd
    df=pd.read_csv("data/titanic.csv",usecols=['Age','Cabin','Survived'])
    df.isnull().mean()
    df.dtypes
    

    运行上述代码块后,您将看到Age、Cabin和装载装载包含空值。Age包含所有整数值,而Cabin包含所有分类值。

    1、均值、中值、众数替换

    在这种技术中,我们将null值替换为列中所有值的均值/中值或众数。

    平均值(mean):所有值的平均值

    def impute_nan(df,column,mean):
        df[column+'_mean']=df[column].fillna(mean) ##NaN -> mean
        
    impute_nan(df,'Age',df.Age.mean()) ##mean of Age(29.69)
    

    中值(median):所有值的中心值

    def impute_nan(df,column,median):
        df[column+'_mean']=df[column].fillna(median)
    impute_nan(df,'Age',df.Age.median()) ##median of Age(28.0)
    

    众数(mode):最常见的值

    def impute_nan(df,column,mode):
        df[column+'_mean']=df[column].fillna(mode)
    impute_nan(df,'Age',df.Age.mode()) ##mode of Age(24.0)
    

    优点

    • 易于实现(对异常值健壮)
    • 获得完整数据集的更快方法

    缺点

    • 原始方差的变化或失真
    • 影响相关性
    • 对于分类变量,我们需要众数。平均值和中位数都不行。

    2、随机样本估算

    在这种技术中,我们用dataframe中的随机样本替换所有nan值。它被用来输入数值数据。我们使用sample()对数据进行采样。在这里,我们首先取一个数据样本来填充NaN值。然后更改索引,并将其替换为与NaN值相同的索引,最后将所有NaN值替换为一个随机样本。

    优点

    • 容易实现
    • 方差失真更小

    缺点

    • 我们不能把它应用于每一种情况

    用随机样本注入替换年龄列NaN值

    def impute_nan(df,variable):
        df[variable+"_random"]=df[variable]
        ##It will have the random sample to fill the na
        random_sample=df[variable].dropna().sample(df[variable].isnull().sum(),random_state=0)
        ##pandas need to have same index in order to merge the dataset
        random_sample.index=df[df[variable].isnull()].index #replace random_sample index with NaN values index
        #replace where NaN are there
        df.loc[df[variable].isnull(),variable+'_random']=random_sample
        col=variable+"_random"
        df = df.drop(col,axis=1)
    
    impute_nan(df,"Age")
    

    3、用新特性获取NAN值

    这种技术在数据不是完全随机丢失的情况下最有效。在这里,我们在数据集中添加一个新列,并将所有NaN值替换为1。

    优点

    • 容易实现
    • 获取了了NaN值的重要性

    缺点

    • 创建额外的特性(维度诅咒)
    import numpy as np
    df['age_nan']=np.where(df['Age'].isnull(),1,0)
    ## It will create one new column that contains value 1 in the rows where Age value is NaN, otherwise 0. 
    

    4、End of Distribution

    在这种技术中,我们用第3个标准偏差值(3rd standard deviation)替换NaN值。它还用于从数据集中删除所有异常值。首先,我们使用std()计算第3个标准偏差,然后用该值代替NaN。
    优点

    • 容易实现。
    • 抓住了缺失值的重要性,如果有的话。

    缺点

    • 使变量的原始分布失真。
    • 如果NAN的数量很大。它将掩盖分布中真正的异常值。
    • 如果NAN的数量较小,则替换后的NAN可以被认为是一个离群值,并在后续的特征工程中进行预处理。
    def impute_nan(df,variable,median,extreme):
        df[variable+"_end_distribution"]=df[variable].fillna(extreme)
        
    extreme=df.Age.mean()+3*df.Age.std() ##73.27--> 3rd std deviation 
    impute_nan(df,'Age',df.Age.median(),extreme)
    

    5、任意值替换

    在这种技术中,我们将NaN值替换为任意值。任意值不应该更频繁地出现在数据集中。通常,我们选择最小离群值或最后离群值作为任意值。

    优点

    • 容易实现
    • 获取了缺失值的重要性,如果有的话

    缺点

    • 必须手动确定值。
    def impute_nan(df,var):
        df[var+'_zero']=df[var].fillna(0) #Filling with 0(least outlier)
        df[var+'_hundred']=df[var].fillna(100) #Filling with 100(last)
    
    impute_nan(df,'Age')
    

    6、频繁类别归责

    该技术用于填充分类数据中的缺失值。在这里,我们用最常见的标签替换NaN值。首先,我们找到最常见的标签,然后用它替换NaN。

    优点

    • 容易实现

    缺点

    • 由于我们使用的是更频繁的标签,所以如果有很多NaN值,它可能会以一种过度表示的方式使用它们。
    • 它扭曲了最常见的标签之间的关系。
    def impute_nan(df,variable):
        most_frequent_category=df[variable].mode()[0] ##Most Frequent
        df[variable].fillna(most_frequent_category,inplace=True)
        
    for feature in ['Cabin']:           ##List of Categorical Features
        impute_nan(df,feature)
    


    7、nan值视为一个新的分类

    在这种技术中,我们只需用一个新的类别(如Missing)替换所有NaN值。

    df['Cabin']=df['Cabin'].fillna('Missing') ##NaN -> Missing
    

    8、使用KNN填充

    在这项技术中,我们使用sklearn创建一个KNN imputer模型,然后我们将该模型与我们的数据进行拟合,并预测NaN值。它被用来计算数值。这是一个5步的过程。

    • 创建列列表(整数、浮点)
    • 输入估算值,确定邻居。
    • 根据数据拟合估算。
    • 转换的数据
    • 使用转换后的数据创建一个新的数据框架。

    优点

    • 容易实现
    • 结果一般情况下会最好

    缺点

    • 只适用于数值数据

    我们在上篇文章中已经有过详细的介绍,这里就不细说了
    在python中使用KNN算法处理缺失的数据

    9、删除所有NaN值

    它是最容易使用和实现的技术之一。只有当NaN值小于10%时,我们才应该使用这种技术。

    优点:

    1. 容易实现
    2. 快速处理

    缺点:

    1. 造成大量的数据丢失
    df.dropna(inplace=True) ##Drop all the rows that contains NaN
    

    总结

    还有更多处理丢失值的其他技术。我们的目标是找到最适合我们的问题的技术,然后实施它。处理丢失的值总是一个更好的主意,但有时我们不得不删除所有的值。它基本上取决于数据的类型和数量。

    最有,所有的代码在这里都能找到:https://github.com/Abhayparashar31/feature-engineering

    作者:Abhay Parashar

    deephub翻译组

    展开全文
  • 缺失值处理方法大总结

    千次阅读 2019-10-16 14:16:45
    缺失值处理方法1. 删除dropna()缺点2.填补替换缺失值均值填充热卡填补K均值拟合缺失值回归预测极大似然估计多重插补随即森林虚拟变量3.不处理四.总结五.参考资料 一.缺失的原因 缺失值是指粗糙数据中由于缺少信息...

    一.缺失的原因

    缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。缺失值的产生的原因多种多样,主要分这几个原因:

    • 无意的:信息被遗漏,比如由于工作人员的疏忽,忘记而缺失;或者由于数据采集 器等故障等原因造成的缺失,比如系统实时性要求较高的时候,机器来不及判断和决策而造成缺失;
    • 有意的:有些数据集在特征描述中会规定将缺失值也作为一种特征值,这时候缺失值就可以看作是一种特殊的特征值;
    • 不存在:有些特征属性根本就是不存在的,比如一个未婚者的配偶名字就没法填写,再如一个孩子的收入状况也无法填写;

    二.数据缺失的类型

    在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量称为完全变量,数据集中含有缺失值的变量称为不完全变量。而从缺失的分布来将缺失可以分为完全随机缺失,随机缺失和完全非随机缺失。

    • 完全随机缺失(missing completely at random,MCAR):指的是数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失;
    • 随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关;
    • 非随机缺失(missing not at random,MNAR):指的是数据的缺失与不完全变量自身的取值有关,如高收入人群不原意提供家庭收入;

    对于随机缺失和非随机缺失,直接删除记录是不合适的,原因上面已经给出。随机缺失可以通过已知变量对缺失值进行估计,而非随机缺失的非随机性还没有很好的解决办法。

    三.缺失值的处理方法

    缺失值的一般处理方法有三种:删除,填补,不处理。

    1. 删除

    此方法将存在缺失值的数据条目(对象,元组,记录)进行删除。

    dropna()

    可以利用pandas的dropna()函数进行删除。
    举个栗子:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]])
    df1 = df.dropna()
    print(df)
    print('-------')
    print(df1)
    

    结果:

         0    1  2
    0  1.0  NaN  2
    1  2.0  3.0  5
    2  NaN  4.0  6
    -------
         0    1  2
    1  2.0  3.0  5
    

    需要注意的是,dropna() 在默认情况下会剔除任何包含缺失值的整数据。可以设置按不同的坐标轴剔除缺失值,比如 axis=1(或 axis=‘columns’)会剔除任何包含缺失值的整列数据:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]])
    df1 = df.dropna(axis=1)
    print(df)
    print('-------')
    print(df1)
    

    结果:

         0    1  2
    0  1.0  NaN  2
    1  2.0  3.0  5
    2  NaN  4.0  6
    -------
       2
    0  2
    1  5
    2  6
    

    按照上述做法会把非缺失值一并剔除,而有时候只需要剔除全部是缺失值的行或列,或者绝大多数是缺失值的行或列。这些需求可以通过设置 how 或 thresh 参数来满足, 它们可以设置剔除行或列缺失值的数量阈值。

    默认设置是 how=‘any’,也就是说只要有缺失值就剔除整行或整列(通过 axis 设置坐标轴)。你还可以设置 how=‘all’,这样就只会剔除全部是缺失值的行或列了:

    df[3] = np.nan
    df1 = df.dropna(axis=1, how='all')
    print(df)
    print('-------')
    print(df1)
    

    结果:

         0    1  2   3
    0  1.0  NaN  2 NaN
    1  2.0  3.0  5 NaN
    2  NaN  4.0  6 NaN
    -------
         0    1  2
    0  1.0  NaN  2
    1  2.0  3.0  5
    2  NaN  4.0  6
    

    还可以通过 thresh 参数设置行或列中非缺失值的最小数量,从而实现更加个性化的配置:

    通过axis=0, thresh=3,实现删除非缺失值不为3个的行。

    df = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]])
    df1 = df.dropna(axis=0, thresh=3)
    print(df)
    print('-------')
    print(df1)
    

    结果:

         0    1  2
    0  1.0  NaN  2
    1  2.0  3.0  5
    2  NaN  4.0  6
    -------
         0    1  2
    1  2.0  3.0  5
    

    缺点

    直接删除会有一些缺点:

    • 牺牲了大量的数据,通过减少历史数据换取完整的信息,这样可能丢失了很多隐藏的重要信息;
    • 当缺失数据比例较大时,特别是缺失数据非随机分布时,直接删除可能会导致数据发生偏离,比如原本的正态分布变为非正太;

    2.填补

    对缺失值的填补大体可分为三种:替换缺失值,拟合缺失值,虚拟变量。替换是通过数据中非缺失数据的相似性来填补,其核心思想是发现相同群体的共同特征,拟合是通过其他特征建模来填补,虚拟变量是衍生的新变量代替缺失值。

    替换缺失值

    均值填充

    对于数值型数据:使用 众数(mode)填补,比如一个学校的男生和女生的数量,男生500人,女生50人,那么对于其余的缺失值我们会用人数较多的男生来填补。

    对于非数值型数据:使用平均数(mean)或中位数(median)填补,比如一个班级学生的身高特征,对于一些同学缺失的身高值就可以使用全班同学身高的平均值或中位数来填补。一般如果特征分布为正太分布时,使用平均值效果比较好,而当分布由于异常值存在而不是正太分布的情况下,使用中位数效果比较好。

    用pandas的fillna()可以进行填充:
    举个栗子,中均值填充:

    df = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]])
    df.iloc[:, 0] = df.iloc[:, 0].fillna(df.iloc[:, 0].mean())
    print(df)
    

    结果:

         0    1  2
    0  1.0  NaN  2
    1  2.0  3.0  5
    2  1.5  4.0  6
    

    也可以用众数填充:

    df = pd.DataFrame([[1, np.nan, 2], [1, 3, 5], [np.nan, 4, 6]])
    df.iloc[:, 0] = df.iloc[:, 0].fillna(df.iloc[:, 0].median())
    print(df)
    

    结果:

         0    1  2
    0  1.0  NaN  2
    1  1.0  3.0  5
    2  1.0  4.0  6
    

    或者用众数:

    df = pd.DataFrame([[1, np.nan, 2], [1, 3, 5], [np.nan, 4, 6]])
    df.iloc[:, 0] = df.iloc[:, 0].fillna(df.iloc[:, 0].mode()[0])
    print(df)
    

    结果:

         0    1  2
    0  1.0  NaN  2
    1  1.0  3.0  5
    2  1.0  4.0  6
    

    热卡填补

    热卡填充法是在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。通常会找到超出一个的相似对象,在所有匹配对象中没有最好的,而是从中随机的挑选一个作为填充值。这个问题关键是不同的问题可能会选用不同的标准来对相似进行判定,以及如何制定这个判定标准。该方法概念上很简单,且利用了数据间的关系来进行空值估计,但缺点在于难以定义相似标准,主观因素较多。

    K均值

    利用无监督机器学习的聚类方法,通过K均值的聚类方法将所有样本进行聚类划分,然后再通过划分的种类的均值对各自类中的缺失值进行填补。归其本质还是通过找相似来填补缺失值。一般先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。

    拟合缺失值

    拟合就是利用其它变量做模型的输入进行缺失变量的预测,与我们正常建模的方法一样,只是目标变量变为了缺失值。

    注意如果其它特征变量与缺失变量无关,则预测的结果毫无意义。如果预测结果相当准确,则又说明这个变量完全没有必要进行预测,因为这必然是与特征变量间存在重复信息。一般情况下,会介于两者之间效果为最好,若强行填补缺失值之后引入了自相关,这会给后续分析造成障碍。

    利用模型预测缺失变量的方法有很多,这里仅简单介绍几种。

    回归预测

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

    极大似然估计

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

    多重插补

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

    我们看到,以上提出的拟合和替换方法都是单一的插补方法,而多重插补弥补了单一插补的缺陷,它并没有试图去通过模拟值去估计每个缺失值,而是提出缺失数据值的一个随即样本(这些样本可以是不同的模型拟合结果的组合)。这种程序的实施恰当地反映了由于缺失值引起的不确定性,使得统计有效。多重插补可以分为以下3个步骤:

    • 为每个缺失值产生一套可能的插补值,这些值反映了无响应模型的不确定性;
    • 每个插补数据集合都用针对完整数据集的统计方法进行统计分析;
    • 对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值;

    根据数据缺失机制、模式以及变量类型,可分别采用回归、预测均数匹配( predictive mean matching, PMM )、趋势得分( propensity score, PS )、Logistic回归、判别分析以及马尔可夫链蒙特卡罗( Markov Chain Monte Carlo, MCMC) 等不同的方法进行填补。

    假设一组数据,包括三个变量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),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。

    注:使用多重插补要求数据缺失值为随机性缺失,一般重复次数20-50次精准度很高,但是计算也很复杂,需要大量计算。

    随即森林

    另一种比较常用的拟合方法就是随机森林,
    举个栗子,在kaggle题目Titanic生存预测的缺失值处理时,用随机森林来填充缺失的Age。

    from sklearn.ensemble import RandomForestRegressor
    
    #choose training data to predict age
    age_df = train_data[['Age','Survived','Fare', 'Parch', 'SibSp', 'Pclass']]
    age_df_notnull = age_df.loc[(train_data['Age'].notnull())]
    age_df_isnull = age_df.loc[(train_data['Age'].isnull())]
    X = age_df_notnull.values[:,1:]
    Y = age_df_notnull.values[:,0]
    # use RandomForestRegression to train data
    RFR = RandomForestRegressor(n_estimators=1000, n_jobs=-1)
    RFR.fit(X,Y)
    predictAges = RFR.predict(age_df_isnull.values[:,1:])
    train_data.loc[train_data['Age'].isnull(), ['Age']]= predictAges
    

    虚拟变量

    虚拟变量其实就是缺失值的一种衍生变量。具体做法是通过判断特征值是否有缺失值来定义一个新的二分类变量。比如,特征为A含有缺失值,我们衍生出一个新的特征B,如果A中特征值有缺失,那么相应的B中的值为1,如果A中特征值没有缺失,那么相应的B中的值为0。

    3.不处理

    补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。

    在实际应用中,一些模型无法应对具有缺失值的数据,因此要对缺失值进行处理。然而还有一些模型本身就可以应对具有缺失值的数据,此时无需对数据进行处理,比如Xgboost,rfr等高级模型。

    四.总结

    总而言之,大部分数据挖掘的预处理都会使用比较方便的方法来处理缺失值,比如均值法,但是效果上并一定好,因此还是需要根据不同的需要选择合适的方法,并没有一个解决所有问题的万能方法。具体的方法采用还需要考虑多个方面的:

    • 数据缺失的原因;
    • 数据缺失值类型;
    • 样本的数据量;
    • 数据缺失值随机性等;

    五.参考资料

    机器学习缺失值处理方法汇总
    Pandas高级:你真的会删除缺失值吗?
    【Python数据分析基础】: 数据缺失值处理

    展开全文
  • 数据缺失常见处理方法

    千次阅读 2022-04-12 17:50:44
    2.人工填写缺失值:当数据集很大时,该方法比较耗时。 3.使用属性的中心度量(如,平均值,中位数)进行填充:如使用非缺失值的平均值,填充(22+24)/2=23,进行填充 4.使用与给定元组属与同一类的所有样本属性均值...
  • 缺失值处理是一件艺术活,最高的境界应该是缺而不失。pandas中提供了非常丰富的工具来对缺失值进行处理。这里主要是对常用方法的简要介绍。注:不同地区和软件对缺失值的表示方法不同,在用pandas读取文件时可指定...
  • 缺失值处理方法

    万次阅读 多人点赞 2017-08-24 13:38:44
    文章将常见的自己能理解的一些缺失值处理方法以及方法的优缺点做了简单介绍。其中,多重插补、EM算法对缺失值处理尚未掌握,因此并未放上来。 一、数值缺失机制 1.完全随机缺失(MCAR):缺失数据与该变量的真实...
  • 数据预处理——4种缺失值处理方法

    万次阅读 2020-07-28 17:52:15
    简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。当缺失值的类型为非完全随机缺失的时候,可以通过对完整...
  • 1,Pandas的缺失值Pandas选用标签方法表示缺失值,包括两种python原有的缺失值:浮点数据类型的NaN值,以及python的None对象。1.1 None:python对象类型的缺失值Pandas可以使用的第一种缺失值标签是None,它是一个...
  • 今天我们来看看数据预处理中一个有趣的问题:数据清理中,如何处理缺失值。在我们探讨问题之前,我们一起回顾一些基本术语,帮助我们了解为什么需要关注缺失值。目录数据清洗简介填补缺失值的重要性缺失值导致的问题...
  • 数据清洗:缺失值识别和处理方法

    千次阅读 2022-04-25 23:27:18
    缺失值识别 数据缺失分为两种:一是行记录的缺失,这种情况也定义为数据记录丢失;二是数据列值的缺失,指由于各种原因导致的数据记录中某些列的值空缺,不同的数据存储和环境中对于缺失值的表示结果不同,例如...
  • 不论是自己爬虫获取的还是从公开数据源上获取的数据集,都不能保证数据集是完全准确的,难免会一些缺失值。而以这样数据集为基础进行建模或者数据分析时,缺失值会对结果产生一定的影响,所以提前处...
  • 缺失值处理的三种方法

    万次阅读 2019-03-12 20:48:23
    缺失值处理的三种方法:直接使用含有缺失值的特征;删除含有缺失值的特征(该方法在包含缺失值的属性含有大量缺失值而仅仅包含极少量有效值时是有效的);缺失值补全。 常见缺失值补全方法:均值插补、同类均值...
  • 机器学习中处理缺失值的7种方法

    千次阅读 2020-12-03 15:19:41
    机器学习中处理缺失值的7种方法 转载 |https://cloud.tencent.com/developer/article/1680427 作者 | Satyam Kumar 编译 | VK 来源 | Towards Data Science 现实世界中的数据往往很多缺失值。丢失值的原因...
  • 缺失值填补方法

    千次阅读 2020-12-21 16:42:12
    处理缺失数据的流程大致是:确认数据缺失机制——选择缺失数据的处理方法。1.确认数据缺失机制处理缺失数据前,首先应该了解数据缺失的机制。缺失值的机制并非造成缺失值的原因,而是描述缺失值与观测变量间可能的...
  • 在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值常见的缺失值处理方式,过滤、填充。 缺失值的判断 pandas使用浮点值NaN(Not a Number)表示浮点数和非浮点...
  • python缺失的处理一般情况下三种方法:(1)删掉缺失值数据删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。...
  • 导读:如何抹掉机器学习的那点空白?作者:木羊同学来源:大数据DT(ID:hzdashuju)01 机器学习的幕后英雄今天聊一本机器学习方面的有趣的书,书名叫《基于机器学习数据缺失值填补》...
  • 缺失值处理----缺失值填充方法总结

    千次阅读 2020-10-01 16:44:24
    对于特征值缺失的一种常见方法就是可以用固定值来填充,例如0,9999, -9999, 例如下面对灰度分这个特征缺失值全部填充为-99 data['灰度分'] = data['灰度分'].fillna('-99') 2. 用均值填充 对于数值型的特征,其...
  • 常见的能够自动处理缺失值的模型包括:KNN、决策树和随机森 林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带噪声的空间聚 类)等。这些模型对于缺失值的处理思路是: ·忽略,缺失值不参与距离计算,例如KNN。 ·...
  • 缺失值的插补方法

    千次阅读 2022-01-12 13:44:56
    本文翻译自:6.4. Imputation of missing values — scikit-learn 1.0.2 documentation 因为各种原因,许多真实数据集包含缺失值,经常被编码成空格...更好的策略是插补缺失值,即从数据的已知部分推断缺失值。有关插
  • Pandas中缺失值的相关概念与处理方法总结摘要:本篇总结了Pandas中缺失值的相关概念、原理及处理方法,旨在帮助学习者快速搭建知识框架、更好地理解各类缺失值的含义,因而对于一些具体操作并未详细演示。...
  • 今天我们来看看数据预处理中一个有趣的问题:数据清理中,如何处理缺失值。在我们探讨问题之前,我们一起回顾一些基本术语,帮助我们了解为什么需要关注缺失值。目录数据清洗简介填补缺失值的重要性缺失...
  • 【机器学习】缺失值处理总结

    千次阅读 2020-12-31 10:26:22
    处理缺失值的意义 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一。当缺失比例很小时,可直接对缺失记录进行舍弃或进行手工处理。但在实际数据中,往往缺失数据占有相当...
  • 缺失值填充的几种方法

    万次阅读 多人点赞 2018-09-12 22:59:51
    常见缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。 1. 数据集介绍 数据...
  • 前言 在对数据进行预处理中,我们经常会遇到缺失值和异常值的情况,下面我们对这两种情况的常用技术...我习惯先处理异常值,再处理缺失值。 异常值的识别方法 异常值,指的是样本中的一些数值明显偏离其余数值的.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,138
精华内容 14,855
热门标签
关键字:

常见的处理缺失值的方法有