缺失值处理

2024-05-01 17:08

1. 缺失值处理

 缺失数据 
  
 1 缺失值的统计和删除 
  
 1.1 缺失信息的统计
  
 缺失数据可以使用 isna 或 isnull (两个函数没有区别)来查看每个单元格是否缺失,通过和 sum 的组合可以计算出每列缺失值的比例。
  
 如果想要查看某一列缺失或者非缺失的行,可以利用 Series 上的 isna 或者 notna 进行布尔索引。例如,查看身高缺失的行:
  
 如果想要同时对几个列,检索出全部为缺失或者至少有一个缺失或者没有缺失的行,可以使用 isna, notna 和any, all 的组合。例如,对身高、体重和转系情况这 3 列分别进行这三种情况的检索
  
 1.2 缺失信息的删除
  
 数据处理中经常需要根据缺失值的大小、比例或其他特征来进行行样本或列特征的删除,pandas 中提供了dropna 函数来进行操作。
  
 dropna 的主要参数为轴方向 axis (默认为 0,即删除行)、删除方式 how 、删除的非缺失值个数阈值 thresh(非缺失值没有达到这个数量的相应维度会被删除)、备选的删除子集 subset ,其中 how 主要有 any 和 all两种参数可以选择。
  
 2 缺失值的填充和插值 
  
 2.1 利用 fillna 进行填充 
  
 在 fillna 中有三个参数是常用的:value, method, limit 。其中,value 为填充值,可以是标量,也可以是索引到元素的字典映射;method 为填充方法,有用前面的元素填充 ffill 和用后面的元素填充 bfill 两种类型,limit 参数表示连续缺失值的最大填充次数。
  
 2.2 插值函数 
  
 在关于 interpolate 函数的 文档 描述中,列举了许多插值法,包括了大量 Scipy 中的方法。由于很多插值方法涉及到比较复杂的数学知识,因此这里只讨论比较常用且简单的三类情况,即线性插值、最近邻插值和索引插值。
  
 对于 interpolate 而言,除了插值方法(默认为 linear 线性插值)之外,有与 fillna 类似的两个常用参数,一个是控制方向的 limit_direction ,另一个是控制最大连续缺失值插值个数的 limit 。其中,限制插值的方向默认为 forward ,这与 fillna 的 method 中的 ffill 是类似的,若想要后向限制插值或者双向限制插值可以指定为 backward 或 both
  
 关于 polynomial 和 spline 插值的注意事项
  
 在 interpolate 中 如 果 选 用 polynomial 的 插 值 方 法, 它 内 部 调 用 的 是scipy.interpolate.interp1d(*,*,kind=order) , 这 个 函 数 内 部 调 用 的 是 make_interp_spline方法,因此其实是样条插值而不是类似于 numpy 中的 polyfit 多项式拟合插值;而当选用 spline方法时,pandas 调用的是 scipy.interpolate.UnivariateSpline 而不是普通的样条插值。这一部分的文档描述比较混乱,而且这种参数的设计也是不合理的,当使用这两类插值方法时,用户一定要小心谨慎地根据自己的实际需求选取恰当的插值方法。
  
 3 Nullable 类型
  
 3.1 缺失记号及其缺陷
  
 在 python 中的缺失值用 None 表示,该元素除了等于自己本身之外,与其他任何元素不相等:
  
 在 numpy 中利用 np.nan 来表示缺失值,该元素除了不和其他任何元素相等之外,和自身的比较结果也返回False
  
 值得注意的是,虽然在对缺失序列或表格的元素进行比较操作的时候,np.nan 的对应位置会返回 False ,但是在使用 equals 函数进行两张表或两个序列的相同性检验时,会自动跳过两侧表都是缺失值的位置,直接返回 True :
  
 在时间序列的对象中,pandas 利用 pd.NaT 来指代缺失值,它的作用和 np.nan 是一致的
  
 那么为什么要引入 pd.NaT 来表示时间对象中的缺失呢?仍然以 np.nan 的形式存放会有什么问题?在 pandas中可以看到 object 类型的对象,而 object 是一种混杂对象类型,如果出现了多个类型的元素同时存储在 Series中,它的类型就会变成 object
  
 NaT 问题的根源来自于 np.nan 的本身是一种浮点类型,而如果浮点和时间类型混合存储,如果不设计新的内置缺失类型来处理,就会变成含糊不清的 object 类型,这显然是不希望看到的。
  
 同时,由于 np.nan 的浮点性质,如果在一个整数的 Series 中出现缺失,那么其类型会转变为 float64 ;而如果在一个布尔类型的序列中出现缺失,那么其类型就会转为 object 而不是 bool
  
 因此,在进入 1.0.0 版本后,pandas 尝试设计了一种新的缺失类型 pd.NA 以及三种 Nullable 序列类型来应对这些缺陷,它们分别是 Int, boolean 和 string 。
  
 3.2 Nullable 类型的性质
  
 从字面意义上看 Nullable 就是可空的,言下之意就是序列类型不受缺失值的影响。例如,在上述三个 Nullable类型中存储缺失值,都会转为 pandas 内置的 pd.NA
  
 在 Int 的序列中,返回的结果会尽可能地成为 Nullable 的类型
  
 对于 boolean 类型的序列而言,其和 bool 序列的行为主要有两点区别:
  
 第一点是带有缺失的布尔列表无法进行索引器中的选择,而 boolean 会把缺失值看作 False
  
 第二点是在进行逻辑运算时,bool 类型在缺失处返回的永远是 False ,而 boolean 会根据逻辑运算是否能确定唯一结果来返回相应的值。那什么叫能否确定唯一结果呢?举个简单例子:True | pd.NA 中无论缺失值为什么值,必然返回 True ;False | pd.NA 中的结果会根据缺失值取值的不同而变化,此时返回 pd.NA ;False& pd.NA 中无论缺失值为什么值,必然返回 False 。
  
 3.3 缺失数据的计算和分组
  
 当调用函数 sum, prob 使用加法和乘法的时候,缺失数据等价于被分别视作 0 和 1,即不改变原来的计算结果
  
 当使用累计函数时,会自动跳过缺失值所处的位置:
  
 当进行单个标量运算的时候,除了 np.nan ** 0 和 1 ** np.nan 这两种情况为确定的值之外,所有运算结果全为缺失(pd.NA 的行为与此一致),并且 np.nan 在比较操作时一定返回 False ,而 pd.NA 返回 pd.NA
  
 另外需要注意的是,diff, pct_change 这两个函数虽然功能相似,但是对于缺失的处理不同,前者凡是参与缺失计算的部分全部设为了缺失值,而后者缺失值位置会被设为 0% 的变化率
  
 对于一些函数而言,缺失可以作为一个类别处理,例如在 groupby, get_dummies 中可以设置相应的参数来进行增加缺失类别:
  
 4 练习 
  
 4.1 Ex1:缺失值与类别的相关性检验
  
 .4.2 Ex2:用回归模型解决分类问题

缺失值处理

2. 缺失值处理

  样本数据量十分大且缺失值不多 的情况下非常有效,但如果样本量本身不大且缺失也不少,那么不建议使用。
   补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,一些模型无法应对具有缺失值的数据,因此要对缺失值进行处理。然而还有一些模型本身就可以应对具有缺失值的数据,此时无需对数据进行处理,比如 Xgboos等树模型 。
   虚拟变量其实就是缺失值的一种衍生变量。具体做法是通过判断特征值是否有缺失值来定义一个新的二分类变量。比如,特征为A含有缺失值,我们 衍生出一个新的特征B,如果A中特征值有缺失,那么相应的B中的值为1,如果A中特征值没有缺失,那么相应的B中的值为0。 
    data_train[['Cabin','CabinCat']].head(10) 
    对于定类数据:使用 众数(mode)填补 ,比如一个学校的男生和女生的数量,男生500人,女生50人,那么对于其余的缺失值我们会用人数较多的男生来填补。    对于定量(定比)数据:使用平均数(mean)或中位数(median)填补 ,比如一个班级学生的身高特征,对于一些同学缺失的身高值就可以使用全班同学身高的平均值或中位数来填补。一般如果特征分布为正太分布时,使用平均值效果比较好,而当分布由于异常值存在而不是正太分布的情况下,使用中位数效果比较好。
   注:此方法虽然简单,但是不够精准,可能会引入噪声,或者会改变特征原有的分布。 如果缺失值是随机性的,那么用平均值比较适合保证无偏,否则会改变原分布。 
   利用其它变量做模型的输入进行缺失变量的预测,与我们正常建模的方法一样,只是目标变量变为了缺失值。如果其它特征变量与缺失变量无关,则预测的结果毫无意义。如果预测结果相当准确,则又说明这个变量完全没有必要进行预测,因为这必然是与特征变量间存在重复信息。

3. 处理缺失值的四种方法

处理缺失值的四种方法如下:
1、简单删除法适合于缺失值样本比较少的情况下,如果有过多的缺失值,则不适合使用该方法,因为该方法是用减少历史数据的方法来换取数据的完备性,这样会造成资源的极大浪费,因为其丢弃了大量隐藏在这些对象上的信息,在样本数量本来就很少的数据集中删除少量对象将严重影响数据集的客观性和结果的正确性。

2、数据补齐,主要有特殊值填充、热卡填充、K-means填充,使用所有可能的值填充、组合完整化方法,回归法,期望值最大化方法,多重填补以及C4.5方法。
3、人工填写,用户自己对数据最为了解,因此这个方法产生的偏差是最小的,但是如果有大规模的缺失值时,这个方法是非常耗时耗力的。

4、平均值填充,如果是数值型特征,则是使用平均值来填充,如果是类别型特征,则是使用众数来填充,另一种相似的方法是条件平均值填充,这个并不是直接使用所有对象来计算平均值或者众数,而是使用与该样本具有相同决策属性的对象中去求解平均值或者众数。

处理缺失值的四种方法

4. 处理缺失值的四种方法

处理缺失值的四种方法:
1、删除含有缺失值的个案

主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。
把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。
对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。


2、可能值插补缺失值

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

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

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

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

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

5. 对于缺失值的处理

 建议:不同场景下的数据缺失机制不同,这需要工程师基于对业务选择合适的填充方法。
    如何判断缺失值类型?    缺失值的分类按照数据缺失机制可分为:    可忽略的缺失 
    不可忽略的缺失 
   平常工作中遇到的缺失值大部分情况下是随机的(缺失变量和其他变量有关)
   这个就可以用estimator来做了,选其中一个变量(y),然后用其他变量作为X,随便选个值填充X的缺失部分,用X train一个estimator,再预测y的缺失部分(大致思路)
   此外有些数据是符合某种分布的,利用这个分布呢也可以填充缺失的数据,如(EM算法)
    处理缺失数据的三个标准:     1. 非偏置的参数估计    不管你估计means, regressions或者是odds ratios,都希望参数估计可以准确代表真实的总体参数。在统计项中,这意味着估计需要是无偏的。有缺失值可能会影响无偏估计,所以需要处理。    2. 有效的能力:    删除缺失数据会降低采样的大小,因此会降低power。如果说问题是无偏的,那么得到的结果会是显著的,那么会有足够的能力来检验这个效力(have adequate power to detect your effects)。反之,整个检测可能失效。    3. 准确的标准差(影响p值和置信区间):    不仅需要参数估计无偏,还需要标准差估计准确,在统计推断中才会有效。
   缺失值处理的方法大致分为这几类:1、删除法;2、基于插补的方法;3、基于模型的方法; 4、不处理; 5、映射高维
   有些处理方法是基于完全随机缺失假设(MCAR),一般来说,当数据不是 MCAR 而 是随机缺失(MAR)时,这些方法是不适用的;而有些方法(如似然估计法)在 MAR 的假设下是适用的,因此,在进行缺失数据处理时,首先需要认真分析缺失数 据产生的原因,然后采取有针对性的补救措施,这样才能够获得无偏或弱偏估计。
    此处关于使用多重插补来处理非随机缺失(MNAR)的问题,它其实效果不一定,也可能出现效果倒退的情况,总的说多重更适合MAR    
                                           
   注:此处一元与多元指的是仅有一个特征有缺失值与多个特征有缺失值
   对于不同类别的缺失值的处理方法如上图。
   以下展开介绍各个方法:
                                           注: k-means插补 与KNN插补很相似,区别在于k-means是利用无缺失值的特征来寻找最近的N个点,然后用这N个点的我们所需的缺失的特征平均值来填充,而KNN则是先用均值填充缺失值再找最近的N个点。
   类似的还有 随机回归插补  :也优于纯回归插补
    其他单一插补法: 
   与单一插补方法相比较,多重插补方法充分地考虑了数据的不确定性。多重插补的主要分为三个步骤,综合起来即为:插补、分析、合并。插补步是为每个缺失值都构造出 m 个可能的插补值,缺失模型具有不确定性,这些插补值能体现出模型的这个性质,利用这些可能插补值对缺失值进行插补就得到了 m 个完整数据集。分析步是对插补后的 m 个完整数据集使用一样的统计数据分析方法进行分析,同时得到 m 个统计结果。综合步就是把得到的这 m 个统计结果综合起来得到的分析结果,把这个分析结果作为缺失值的替代值。多重插补构造多个插补值主要是通过模拟的方式对估计量的分布进行推测,然后采用不同的模型对缺失值进行插补,这种插补是随机抽取的方式,这样以来能提高估计的有效性和可靠性。    多重插补-python手册 
   多重插补法主要有以下几种:
   (使用回归、贝叶斯、随机森林、决策树等模型对缺失数据进行预测。)
   基于已有的其他字段,将缺失字段作为目标变量进行预测,从而得到较为可能的补全值。如果带有缺失值的列是数值变量,采用回归模型补全;如果是分类变量,则采用分类模型补全。
   常见能够自动处理缺失值模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)等。
   处理思路:    自动插补 :例如XGBoost会通过training loss reduction来学习并找到最佳插补值。    忽略 :缺失值不参与距离计算,例如:KNN,LightGBM    将缺失值作为分布的一种状态 :并参与到建模过程,例如:决策树以及变体。    不基于距离做计算 :因此基于值得距离计算本身的影响就消除了,例如:DBSCAN。
    ID3、c4.5、cart、rf到底是如何处理缺失值的? 
   最精确的做法,把变量映射到高维空间。   比如性别,有男、女缺失三种情况,则映射成3个变量:是否男、否女、是否缺失。连续型变量也可以这样处理。比如Google、 百度的CTR预估模型,预处理时会把所有变量都这样处理,达到几亿维。又或者可根据每个值的频数,将频数较小的值归为一类'other',降低维度。此做法可最大化保留变量的信息。
    前推法 (LOCF,Last Observation Carried Forward,将每个缺失值替换为缺失之前的最后一次观测值)与 后推法 (NOCB,Next Observation Carried Backward,与LOCF方向相反——使用缺失值后面的观测值进行填补)
   这是分析可能缺少后续观测值的纵向重复测量数据的常用方法。纵向数据在不同时间点跟踪同一样本。当数据具有明显的趋势时,这两种方法都可能在分析中引入偏差,表现不佳。
    线性插值 。此方法适用于具有某些趋势但并非季节性数据的时间序列。
    季节性调整+线性插值 。此方法适用于具有趋势与季节性的数据。
   总而言之,大部分数据挖掘的预处理都会使用比较方便的方法来处理缺失值,比如均值法,但是效果上并不一定好,因此还是需要根据不同的需要选择合适的方法,并没有一个解决所有问题的万能方法。
   具体的方法采用还需要考虑多个方面的:
   在做数据预处理时,要多尝试几种填充方法,选择表现最佳的即可。
   总结来说,没有一个最完美的策略,每个策略都会更适用于某些数据集和数据类型,但再另一些数据集上表现很差。虽然有一些规则能帮助你决定选用哪一种策略,但除此之外,你还应该尝试不同的方法,来找到最适用于你的数据集的插补策略。
   当前最流行的方法应该是  删除法、KNN、多重插补法 。
   参考文献: 庞新生. 缺失数据处理方法的比较[J]. 统计与决策, 2010(24):152-155. 

对于缺失值的处理

6. 如何处理数据中的缺失值

一、常用方法 1. 删除
最简单的方法是删除,删除属性或者删除样本。如果大部分样本该属性都缺失,这个属性能提供的信息有限,可以选择放弃使用该维属性;如果一个样本大部分属性缺失,可以选择放弃该样本。虽然这种方法简单,但只适用于数据集中缺失较少的情况。

2. 统计填充
对于缺失值的属性,尤其是数值类型的属性,根据所有样本关于这维属性的统计值对其进行填充,如使用平均数、中位数、众数、最大值、最小值等,具体选择哪种统计值需要具体问题具体分析。另外,如果有可用类别信息,还可以进行类内统计,比如身高,男性和女性的统计填充应该是不同的。

3. 统一填充
对于含缺失值的属性,把所有缺失值统一填充为自定义值,如何选择自定义值也需要具体问题具体分析。当然,如果有可用类别信息,也可以为不同类别分别进行统一填充。常用的统一填充值有:“空”、“0”、“正无穷”、“负无穷”等。

4. 预测填充
我们可以通过预测模型利用不存在缺失值的属性来预测缺失值,也就是先用预测模型把数据填充后再做进一步的工作,如统计、学习等。虽然这种方法比较复杂,但是最后得到的结果比较好。

二、具体分析
上面两次提到具体问题具体分析,为什么要具体问题具体分析呢?因为属性缺失有时并不意味着数据缺失,缺失本身是包含信息的,所以需要根据不同应用场景下缺失值可能包含的信息进行合理填充。下面通过一些例子来说明如何具体问题具体分析,仁者见仁智者见智,仅供参考:

“年收入”:商品推荐场景下填充平均值,借贷额度场景下填充最小值; “行为时间点”:填充众数; “价格”:商品推荐场景下填充最小值,商品匹配场景下填充平均值; “人体寿命”:保险费用估计场景下填充最大值,人口估计场景下填充平均值; “驾龄”:没有填写这一项的用户可能是没有车,为它填充为0较为合理; ”本科毕业时间”:没有填写这一项的用户可能是没有上大学,为它填充正无穷比较合理; “婚姻状态”:没有填写这一项的用户可能对自己的隐私比较敏感,应单独设为一个分类,如已婚1、未婚0、未填-1。

7. 数据缺失值的4种处理方法

缺失值的处理方法
对于缺失值的处理,从总体上来说分为删除存在缺失值的个案和缺失值插补。对于主观数据,人将影响数据的真实性,存在缺失值的样本的其他属性的真实值不能保证,那么依赖于这些属性值的插补也是不可靠的,所以对于主观数据一般不推荐插补的方法。插补主要是针对客观数据,它的可靠性有保证。

1、删除含有缺失值的个案
主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。
2、可能值插补缺失值
它的思想来源是以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。在数据挖掘中,面对的通常是大型的数据库,它的属性有几十个甚至几百个,因为一个属性值的缺失而放弃大量的其他属性值,这种删除是对信息的极大浪费,所以产生了以可能值对缺失值进行插补的思想与方法。

数据缺失值的4种处理方法

8. 缺失值处理方法有哪些

缺失值的处理方法
对于缺失值的处理,从总体上来说分为删除存在缺失值的个案和缺失值插补。对于主观数据,人将影响数据的真实性,存在缺失值的样本的其他属性的真实值不能保证,那么依赖于这些属性值的插补也是不可靠的,所以对于主观数据一般不推荐插补的方法。插补主要是针对客观数据,它的可靠性有保证。

1、删除含有缺失值的个案
主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。
2、可能值插补缺失值
它的思想来源是以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。在数据挖掘中,面对的通常是大型的数据库,它的属性有几十个甚至几百个,因为一个属性值的缺失而放弃大量的其他属性值,这种删除是对信息的极大浪费,所以产生了以可能值对缺失值进行插补的思想与方法。
最新文章
热门文章
推荐阅读