在机器学习中建模的时候,往往面临两个困难,一是选择哪个模型,二是怎样处理数据。处于数据包括数据获取、数据清洗和数据分析。其实对于不同的场景和不同的数据,选择的模型也是不一样的,本文简单聊一聊在数据缺失的时候该怎样选择合适的模型。
一、缺失数据处理及建模方法
数据缺失时,处理数据的方式有如下三种:
(1) 若数据的特点已经知道,可以根据已知数据比较准确的得到未知数据时,可以使用预测的方式,先填补未知数据,再根据数据和场景的特点,以不存在数据缺失的方式选择合适的模型。
(2) 若数据量远远超出要研究问题的规模,而存在缺失的数据条目比较少,去掉存在缺失数据的记录对要研究的问题不存在影响,则可以把存在缺失值的记录去掉,然后以不存在数据缺失的方式选择合适的模型。
(3) 使用可以处理有缺失数据的工具包或者算法对存在缺失数据的数据集进行建模。
方式(1)和(2)是把存在缺失数据的数据集转换成不具有缺失值的方式进行建模,然而对于(1),预测的值并不是真实值,这还是会导致数据的不确定性,所以这种方式要慎用。对于(2),在机器学习中,数据是最宝贵的财富,所以要说数据太多了是假话,所以这种方式只是在最无奈的时候才选择。接下来详细讲解使用工具包或者特殊算法对存在缺失值的数据集进行建模方法。
使用工具包或者特殊的算法对存在缺失数据的数据集进行建模
首先,要明确一点,工具包和特殊的算法也许是可以对存在缺失值的数据集进行建模的。但是工具包进行了封装,内部的结构和实现过程是不透明的。实际上,工具包之所以可以处理有缺失值的数据集,是因为加了缺失值处理函数。要明白,工具/算法本身是不应该处理缺失值的,应该处理缺失值的是用户。工具或者某些特殊的算法为了方便用户的使用,提供了默认的缺失值处理函数,如果用户没有提供自己的缺失值处理函数,就使用工具或者算法默认的缺失值处理函数。
常用的处理具有缺失数据的工具或者算法有两种:(1)决策树;(2)xgboost。
(1) 决策树处理缺失数据
在决策树中,以随机森林为例简单说明。在随机森林中,处理缺失值的方式如下:
方法一(快速简单但效果差):把数值型变量中的缺失值用对应类别中的中位数替换;把非数值型数据的缺失值使用出现次数最多的数据替换。这种处理方式快速、简单,但是效果较差。以数值型变量为例:
方法二(耗时费力但效果好):虽然依然是使用中位数和出现次数最多的数来进行替换,方法2引入了权重。即对需要替换的数据先和其他数据做相似度测量(proximity measurement)也就是下面公式中的Weight( W),在补全缺失点是相似的点的数据会有更好的权重W。以数值型变量为例:
(2) Xgboost处理缺失数据
Xgboost把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。
这样的处理方法固然巧妙,但也有风险:即我们假设了训练数据和预测数据的分布相同,比如缺失值的分布也相同。
使用工具处理缺失数据的优缺点
优点:
1、可以节省用户的时间,快速建模;
2、防止因用户导入的数据集存在缺失值导致模型训练失败。
缺点:
1、工具提供的缺失值处理方法也许并不适用所有的数据,可能使模型训练时间延长;
2、工具提供的方法要应对的是所有可能的情况,对特殊的情形并不事最佳的选择方案;
3、简单粗暴的处理模式会影响模型的结果,自动化的数据清理不可靠;
4、用户应该提供符合模型要求的数据,这不是算法工具库的责任。算法工具包的默认要求就是用户提供适合的数据,因为用户对数据有更深刻的理解;
5、可能会大幅度增加模型的运算时间。
二、模型选择
主流的机器学习模型千千万,很难一概而论。但有一些经验法则(rule of thumb)供参考:
- 树模型对于缺失值的敏感度较低,大部分时候可以在数据有缺失时使用。
- 涉及到距离度量(distance measurement)时,如计算两个点之间的距离,缺失数据就变得比较重要。因为涉及到“距离”这个概念,那么缺失值处理不当就会导致效果很差,如K近邻算法(KNN)和支持向量机(SVM)。
- 线性模型的代价函数(loss function)往往涉及到距离(distance)的计算,计算预测值和真实值之间的差别,这容易导致对缺失值敏感。
- 神经网络的鲁棒性强,对于缺失数据不是非常敏感,但一般没有那么多数据可供使用。
- 贝叶斯模型对于缺失数据也比较稳定,数据量很小的时候首推贝叶斯模型。
总结来看,对于有缺失值的数据在经过缺失值处理后:
- 数据量很小,用朴素贝叶斯
- 数据量适中或者较大,用树模型,优先 xgboost
- 数据量较大,也可以用神经网络
- 避免使用距离度量相关的模型,如KNN和SVM
参考: