数据挖掘:数据清洗——缺失值处理
一、什么是缺失值
缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。
而在数据处理的过程中,缺失值不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表示数值不存在)。
说明:
-
None是一个python特殊的数据类型。不同于空列表和空字符串,是一种单独的格式。
-
NaN是numpy\pandas下的,不是Python原生的,Not a Number的简称。数据类型是float。
- 对整体的series或Dataframe判断是否未空,用isnull()
- 对单独的某个值判断,可以用 np.isnan()
-
Null在Python中没有这个NULL,NULL主要是在C语言中,在Python中对应的就是None,空字符,数据类型是字符串。
-
NaT非时间空值,Not a Time.该值可以存储在 datetime 数组中以指示未知或缺失的 datetime 值。NaT 返回一个 (NaT) datetime 非时间标量值。
空值语义
对于某个对象的属性值未知的情况,我们称它在该属性的取值为空值(null value)。空值的来源有许多种,因此现实世界中的空值语义也比较复杂。总的说来,可以把空值分成以下三类:
-
不存在型空值。即无法填入的值,或称对象在该属性上无法取值,如一个未婚者的配偶姓名等。
-
存在型空值。即对象在该属性上取值是存在的,但暂时无法知道。如一个已婚者的配偶姓名等。一般情况下,空值是指存在型空值。
-
占位型空值。即无法确定是不存在型空值还是存在型空值,这要随着时间的推移才能够清楚,是最不确定的一类。这种空值除填充空位外,并不代表任何其他信息。
二、缺失值产生的原因
- 机械原因:是由于机械原因导致的数据收集或保存的失败造成的数据缺失。比如数据存储出现问题,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。
- 人为原因:是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据。
现实世界中的数据异常杂乱,属性值缺失的情况经常发全甚至是不可避免的。造成数据缺失的原因是多方面的:
3. 信息暂时无法获取。例如在医疗数据库中,并非所有病人的所有临床检验结果都能在给定的时间内得到,就致使一部分属性值空缺出来。
4. 信息被遗漏。可能是因为输入时认为不重要、忘记填写了或对数据理解错误而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人为因素等原因而丢失。
5. 有些对象的某个或某些属性是不可用的。如一个未婚者的配偶姓名、一个儿童的固定收入状况等。
6. 有些信息(被认为)是不重要的。如一个属性的取值与给定语境是无关。
7. 获取这些信息的代价太大。
8. 系统实时性能要求较高。即要求得到这些信息前迅速做出判断或决策。
三、数据缺失机制
在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量称为完全变量,数据集中含有缺失值的变量称为不完全变量。从缺失的分布来将缺失可以分为完全随机缺失,随机缺失和完全非随机缺失。
-
完全随机缺失(missing completely at random,MCAR):指的是数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性。如家庭地址缺失,与其他变量无关。
-
随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量。例如财务数据缺失情况与企业的大小有关,两个变量间存在关系。
-
非随机缺失(missing not at random,MNAR):指的是数据的缺失与不完全变量自身的取值有关。如高收入人群的不原意提供家庭收入,人为不可控因素造成的。
对于随机缺失和非随机缺失,删除记录是不合适的,随机缺失可以通过已知变量对缺失值进行估计;而非随机缺失还没有很好的解决办法。
说明:对于分类问题,可以分析缺失的样本中,类别之间的比例和整体数据集中,类别的比例。
四、缺失值处理的重要性
当缺失比例很小时,可直接对缺失记录进行舍弃或进行手工处理。但在实际数据中,往往缺失数据占有相当的比重。这时如果手工处理非常低效,如果舍弃缺失记录,则会丢失大量信息,使不完全观测数据与完全观测数据间产生系统差异,对这样的数据进行分析,很可能会得出错误的结论。
数据缺失在许多研究领域都是一个复杂的问题。对数据挖掘来说,缺省值的存在,造成了以下影响:
- 系统丢失了大量的有用信息;
- 系统中所表现出的不确定性更加显著,系统中蕴涵的确定性成分更难把握,;
- 包含空值的数据会使挖掘过程陷入混乱,直接拿来进行分析挖掘,那么很可能会得到错误的结论。
数据挖掘算法本身更致力于避免数据过分拟合所建的模型,这一特性使得它难以通过自身的算法去很好地处理不完整数据。因此,缺省值需要通过专门的方法进行推导、填充等,以减少数据挖掘算法与实际应用之间的差距。
五、缺失值处理的要素
个人认为关于缺失值的处理,主要包含以下两个因素:
- 尽可能防止数据信息的缺失。仅因为数据某一特征的缺失,就删除整行数据,那么其他特征的数据信息也会丢失,这对数据挖掘(充分利用数据给定的信息,从中挖掘出能解决目标问题的信息)是极其不利的。
- 缺失值填充的合理性。这个一方面与数据本身的数值有关,采用一些算法或图形对填充的合理性进行检验。如填充后的数据与之前的直方图上是否有太大的变化。另一方面与数据的特定场景有关,需要按照不同的方法对缺失值进行填充,如
- “年收入”:商品推荐场景下填充平均值,借贷额度场景下填充最小值;
- “行为时间点”:填充众数;
- “价格”:商品推荐场景下填充最小值,商品匹配场景下填充平均值;
- “人体寿命”:保险费用估计场景下填充最大值,人口估计场景下填充平均值;
- “驾龄”:没有填写这一项的用户可能是没有车,为它填充为0较为合理;
- ”本科毕业时间”:没有填写这一项的用户可能是没有上大学,为它填充正无穷比较合理;
- “婚姻状态”:没有填写这一项的用户可能对自己的隐私比较敏感,应单独设为一个分类,如已婚1、未婚0、未填-1。
六、缺失值处理方法的分析与比较
处理不完整数据集的方法主要有三大类:删除元组、数据补齐、不处理。
6.1删除元祖
也就是将存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表。这种方法简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与初始数据集的数据量相比非常小的情况下非常有效,类标号缺失时通常使用该方法。
然而,这种方法却有很大的局限性。
- 它以减少历史数据来换取信息的完备,会丢弃大量隐藏在这些对象中的信息。
- 当缺失数据比例较大时,特别是缺失数据非随机分布时,直接删除可能会导致数据发生偏离,比如原本的正态分布变为非正太。
说明:这种方法在样本数据量十分大且缺失值不多的情况下非常有效,但如果样本量本身不大且缺失也不少,那么不建议使用。但若数据量缺失值的过大75%,则无法获取有用的信息,甚至对后续的工作产生不利影响,建议直接删除该特征。
6.2数据补齐
这类方法是用一定的值去填充空值,从而使信息表完备化。通常基于统计学原理,根据初始数据集中其余对象取值的分布情况来对一个缺失值进行填充。数据挖掘中常用的有以下几种补齐方法:
替换缺失值
6.2.1 人工填写(filling manually)
由于最了解数据的还是用户自己,因此这个方法产生数据偏离最小,可能是填充效果最好的一种。然而一般来说,该方法很费时,当数据规模很大、空值很多的时候,该方法是不可行的。
6.2.2 特殊值填充(Treating Missing Attribute values as Special values)
将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。这样将形成另一个有趣的概念,可能导致严重的数据偏离,一般不推荐使用。
6.2.3 平均值填充(Mean/Mode Completer)
将初始数据集中的属性分为数值属性和非数值属性来分别进行处理。
如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值、中位数来填充该缺失的属性值;
如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。与其相似的另一种方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,用于求平均的值并不是从数据集的所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。
这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。
说明:
对于数值型数据,若数据存在有偏的情况,则推荐用中位数来填充,平均数会受到极值的影响,导致无法更好地体现数据的集中趋势。还可以按照类别,首先将样本进行分类,然后以该类中样本的均值来插补缺失值
注:此方法虽然简单,但是不够精准,可能会引入噪声,或者会改变特征原有的分布。
下图左为填补前的特征分布,图右为填补后的分布,明显发生了畸变。因此,如果缺失值是随机性的,那么用平均值比较适合保证无偏,否则会改变原分布。
6.2.4 热卡填充(Hot deck imputation,或就近补齐)
对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象(特征),然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。这个方法的缺点在于难以定义相似标准,主观因素较多,人为选择。
6.2.5 K最近距离邻法(K-means clustering)
先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。
利用无监督机器学习的聚类方法。通过K均值的聚类方法将所有样本进行聚类划分,然后再通过划分的种类的均值对各自类中的缺失值进行填补。归其本质还是通过找相似来填补缺失值。
注:缺失值填补的准确性就要看聚类结果的好坏了,而聚类结果的可变性很大,通常与初始选择点有关,并且在下图中可看到单独的每一类中特征值也有很大的差别,因此使用时要慎重。
说明:
利用了样本之间关联性,而非单个特征数据进行自我填充。