作者:阿萨姆
普华永道 | 数据科学家
量子位 已获授权编辑发布
转载请联系原作者
有些小伙伴在实际使用中发现xgboost可以自动处理缺失值,而有些模型不可以。我想先从两个角度解答这个困惑:
回答中也会介绍树模型,如随机森林(Random Forest)和xgboost如何处理缺失值。文章最后总结了在有缺失值时选择模型的小建议。
1. 机器学习工具库开发的“哲学”
首先你有这个困惑是因为你直接调用了工具库,比如Python的sklearn和xgboost等,所以你认为算法A可以自动处理缺失值而B不可以。
但真实情况是…
开发者在封装工具库的时候就已经考虑到了使用者可能导入了含有缺失值的数据,所以加了一个缺失值处理的函数
。处理缺失值的不是算法A,而是开发者额外写的函数。
但是,模型/算法本身不应该处理缺失值,处理缺失值的应该是用户
。然而在现实情况下,如果用户不处理/不知道怎么处理,我们也必须提供一个默认的缺失值处理方法。但是这种自动处理的缺失值,效果往往不好,因为数据的精髓只有用户自己明白。
工具包提供
自动数据清理
的功能的
好处
:
-
防止用户导入的数据不符合模型要求而导致失败
-
节省用户的时间,提供一站式服务
工具包提供
自动数据清理
的功能的
风险
:
在软件工程领域,我们有一个比较经典的哲学思想叫做“
让它出错”(let it fail)
”。指的是如果程序在运行中出现了错误,应该抛出异常(raise exception)而不是默默地装作没看到继续运行。放在机器学习工具包的场景下,如果发现数据有缺失,或者格式不对(比如不是数字型变量),应该报错而不是替用户处理。这也是为什么sklearn会报错,而不是替你处理。
恰好最近在开发一个机器学习开源工具包,相关的问题也想了很多。是否替使用者做了本该他自己做的事情,这需要在易用性和准确性中间找平衡。
我开发的机器学习开源工具包地址:
https://zhuanlan.zhihu.com/p/29868365
2. 决策树模型怎么处理异常值?
看到这里,我希望你理解了为什么不是每个工具包都会自动处理缺失值。那我们分析一个具体个案 - 随机森林(Random Forests)。随机森林是已故统计学家Leo Breiman提出的,和gradient boosted tree一样,它的基模型是决策树。在介绍RF时,Breiman就提出两种解决缺失值的方法(Random forests - classification description):
注:公式仅做参考,未仔细检查。
Breiman说明了第二种方法的效果更好,但需要的时间更长。这也是为什么工具包中一般不提供数据补全的功能,因为会影响到工具包的效率。
3. xgboost怎么处理缺失值?
xgboost处理缺失值的方法和其他树模型不同。根据作者Tianqi Chen在论文[1]中章节3.4的介绍,xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。具体的介绍可以参考[2,3]。
这样的处理方法固然巧妙,但也有风险:即我们假设了训练数据和预测数据的分布相同,比如缺失值的分布也相同,不过直觉上应该影响不是很大:)
4. 什么样的模型对缺失值更敏感?
主流的机器学习模型千千万,很难一概而论。但有一些经验法则(rule of thumb)供参考: