面对数据缺失,如何选择合适的机器学习模型?

有些小伙伴在实际使用中发现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):

  • 方法1(快速简单但效果差):把数值型变量(numerical variables)中的缺失值用其所对应的类别中(class)的中位数(median)替换。把描述型变量(categorical variables)缺失的部分用所对应类别中出现最多的数值替代(most frequent non-missing value)。以数值型变量为例:
image
  • 方法2(耗时费力但效果好):虽然依然是使用中位数和出现次数最多的数来进行替换,方法2引入了权重。即对需要替换的数据先和其他数据做相似度测量(proximity measurement)也就是下面公式中的Weight( W),在补全缺失点是相似的点的数据会有更好的权重W。以数值型变量为例:
image

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

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

3. xgboost怎么处理缺失值?

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

image

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

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

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

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

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

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

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

5. 写在最后 - 如何优雅的调包?

不少答案中我都提到过“支持大家调包”,也就是调用现成的机器学习工具包。但“调包”最大的风险就是不知道自己用的到底是什么,常常一知半解。

这并不可怕,可怕的是当你感到迷惑的时候却没有追根溯源,搞清楚到底发生了什么。随着工具包的封装程度越来越高,调包的成本会越来越低。

但想要优雅的调包,最好还是知道包里装了些什么 ʕ•ᴥ•ʔ

参考资料

[1] A Scalable Tree Boosting System

https://arxiv.org/abs/1603.02754

[2] What are the ways of treatng missing values in XGboost? · Issue #21 · dmlc/xgboost

https://github.com/dmlc/xgboost/issues/21

[3] Frequently Asked Questions

http://xgboost.readthedocs.io/en/latest/faq.html#how-to-deal-with-missing-value

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容