机器学习中缺失值的处理

1、怎么理解决策树、xgboost能处理缺失值?而有的模型(svm)对缺失值比较敏感呢?

首先从两个角度解释你的困惑:

  1. 工具包自动处理数据缺失不代表具体的算法可以处理缺失项
  2. 对于有缺失的数据:以决策树为原型的模型优于依赖距离度量的模型

回答中也会介绍树模型,如随机森林(Random Forest)和xgboost如何处理缺失值。文章最后总结了在有缺失值时选择模型的小建议。

1. 机器学习工具库开发的“哲学”

首先你有这个困惑是因为你直接调用了工具库,比如Python的sklearn和xgboost等,所以你认为算法A可以自动处理缺失值而B不可以。但真实情况是...开发者在封装工具库的时候就已经考虑到了使用者可能导入了含有缺失值的数据,所以加了一个缺失值处理的函数。处理缺失值的不是算法A,而是开发者额外写的函数。

但是,模型/算法本身不应该处理缺失值,处理缺失值的应该是用户。然而在现实情况下,如果用户不处理/不知道怎么处理,我们也必须提供一个默认的缺失值处理方法。但是这种自动处理的缺失值,效果往往不好,因为数据的精髓只有用户自己明白。

工具包提供自动数据清理的功能的好处:

  • 防止用户导入的数据不符合模型要求而导致失败
  • 节省用户的时间,提供一站式服务

工具包提供自动数据清理的功能的风险:

  • 简单粗暴的处理模式会影响模型的结果,自动化的数据清理不可靠
  • 用户应该提供符合模型要求的数据,这不是算法工具库的责任。算法工具包的默认要求就是用户提供适合的数据,因为用户对数据有更深刻的理解
  • 可能会大幅度增加模型的运算时间

在软件工程领域,我们有一个比较经典的哲学思想叫做“让它出错”(let it fail)。指的是如果程序在运行中出现了错误,应该抛出异常(raise exception)而不是默默地装作没看到继续运行。放在机器学习工具包的场景下,如果发现数据有缺失,或者格式不对(比如不是数字型变量),应该报错而不是替用户处理。这也是为什么sklearn会报错,而不是替你处理。

恰好最近在开发一个机器学习开源工具包,相关的问题也想了很多。是否替使用者做了本该他自己做的事情,这需要在易用性和准确性中间找平衡。

2. 决策树模型怎么处理异常值?

看到这里,我希望你理解了为什么不是每个工具包都会自动处理缺失值。那我们分析一个具体个案 - 随机森林(Random Forests)。随机森林是已故统计学家Leo Breiman提出的,和gradient boosted tree一样,它的基模型是决策树。在介绍RF时,Breiman就提出两种解决缺失值的方法(Random forests - classification description):

  • 方法1(快速简单但效果差):把数值型变量(numerical variables)中的缺失值用其所对应的类别中(class)的中位数(median)替换。把描述型变量(categorical variables)缺失的部分用所对应类别中出现最多的数值替代(most frequent non-missing value)。以数值型变量为例: X_{i,j} = Median(\forall X_{k,j}) \quad where \, k=1,2,3...n \; and \; X_{k,j} \,is\, present

  • 方法2(耗时费力但效果好):虽然依然是使用中位数出现次数最多的数来进行替换,方法2引入了权重。即对需要替换的数据先和其他数据做相似度测量(proximity measurement)也就是下面公式中的Weight( W ),在补全缺失点是相似的点的数据会有更高的权重W。以数值型变量为例: X_{k,j} =\frac{1}{n}\sum_{i=1,\ne k}^{n}W_{i,k} X_{i,j} \quad where \, k=1,2,3...n \; and \; X_{i,j} \,is\, present

注:公式仅做参考,未仔细检查。

Breiman说明了第二种方法的效果更好,但需要的时间更长。这也是为什么工具包中一般不提供数据补全的功能,因为会影响到工具包的效率。

3. xgboost怎么处理缺失值?

xgboost处理缺失值的方法和其他树模型不同。根据作者Tianqi Chen在论文[1]中章节3.4的介绍,xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。具体的介绍可以参考[2,3]。

这样的处理方法固然巧妙,但也有风险:即我们假设了训练数据和预测数据的分布相同,比如缺失值的分布也相同,不过直觉上应该影响不是很大:)

4. 什么样的模型对缺失值更敏感?

主流的机器学习模型千千万,很难一概而论。但有一些经验法则(rule of thumb)供参考:

  1. 树模型对于缺失值的敏感度较低,大部分时候可以在数据有缺失时使用。
  2. 涉及到距离度量(distance measurement)时,如计算两个点之间的距离,缺失数据就变得比较重要。因为涉及到“距离”这个概念,那么缺失值处理不当就会导致效果很差,如K近邻算法(KNN)和支持向量机(SVM)。
  3. 线性模型的代价函数(loss function)往往涉及到距离(distance)的计算,计算预测值和真实值之间的差别,这容易导致对缺失值敏感。
  4. 神经网络的鲁棒性强,对于缺失数据不是非常敏感,但一般没有那么多数据可供使用。
  5. 贝叶斯模型对于缺失数据也比较稳定,数据量很小的时候首推贝叶斯模型。

总结来看,对于有缺失值的数据在经过缺失值处理后:

  • 数据量很小,用朴素贝叶斯
  • 数据量适中或者较大,用树模型,优先 xgboost
  • 数据量较大,也可以用神经网络
  • 避免使用距离度量相关的模型,如KNN和SVM

当然,这只是我的经验之谈,请谨慎参考。缺失值补全(missing value imputation)是一个非常大的方向,答案中只能简单带过,推荐深入了解。

5、缺失值是否要处理?

当缺失比例很小时,可直接对缺失记录进行舍弃或进行手工处理。但在实际数据中,往往缺失数据占有相当的比重。这时如果手工处理非常低效,如果舍弃缺失记录,则会丢失大量信息,使不完全观测数据与完全观测数据间产生系统差异,对这样的数据进行分析,你很可能会得出错误的结论。

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

“年收入”:商品推荐场景下填充平均值,借贷额度场景下填充最小值;

“行为时间点”:填充众数;

“价格”:商品推荐场景下填充最小值,商品匹配场景下填充平均值;

“人体寿命”:保险费用估计场景下填充最大值,人口估计场景下填充平均值;

“驾龄”:没有填写这一项的用户可能是没有车,为它填充为0较为合理;

”本科毕业时间”:没有填写这一项的用户可能是没有上大学,为它填充正无穷比较合理;

“婚姻状态”:没有填写这一项的用户可能对自己的隐私比较敏感,应单独设为一个分类,如已婚1、未婚0、未填-1。

6、缺失填充方法有哪些?

平均值填充(Mean/Mode Completer)

将初始数据集中的属性分为数值属性和非数值属性来分别进行处理。

如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;

如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。与其相似的另一种方法叫条件平均值填充法(Conditional
Mean Completer)。在该方法中,用于求平均的值并不是从数据集的所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。

这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。

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

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

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

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

用空缺属性值的所有可能的属性取值来填充,能够得到较好的补齐效果。但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大,可能的测试方案很多。

组合完整化方法(Combinatorial Completer)

用空缺属性值的所有可能的属性取值来试,并从最终属性的约简结果中选择最好的一个作为填补的属性值。这是以约简为目的的数据补齐方法,能够得到好的约简结果;但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大。

回归(Regression)

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

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

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

猜你喜欢

转载自blog.csdn.net/u011630575/article/details/81394704