在机器学习中建模的时候,往往面临两个困难,一是选择哪个模型,二是怎样处理数据。处于数据包括数据获取、数据清洗和数据分析。其实对于不同的场景和不同的数据,选择的模型也是不一样的,本文简单聊一聊在数据缺失的时候该怎样选择合适的模型。
看到这个标题,对于初学机器学习的人来说,也许会非常不解,难道在有数据缺失和没数据缺失的情况下,选择模型还会不一样?是的。
1、 在数据缺失时,如何选择合适的模型总述
(1) 数据的特点已经知道,可以根据已知数据比较准确的得到未知数据的时候,可以使用预测的方式,先填补未知数据,再根据数据和场景的特点,以不存在数据缺失的方式选择合适的模型。
(2) 数据量远远超出要研究问题的规模,而存在缺失的数据条目比较少,去掉存在缺失数据的记录对要研究的问题不存在影响。这时候可以把存在缺失值的记录去掉,然后以不存在数据缺失的方式选择合适的模型。
(3) 使用可以处理有缺失数据的工具包或者算法对存在缺失数据的数据集进行建模。
2、 把存在缺失数据的数据集转换成不具有缺失值的方式建模
这种方式对应1中的(1)和(2)。对于(1),预测的值并不是真实值,这还是导致了数据的不确定性,所以这种方式要慎用。对于(2),在机器学习中,数据是最宝贵的财富,所以要说数据太多了使假话,所以这种方式只是在最无奈的时候才选择。
3、 使用工具包或者特殊的算法对存在缺失数据的数据集进行建模
首先,要明确一点,工具包和特殊的算法也许是可以对存在缺失值的数据集进行建模的。但是工具包进行了封装,内部的结构和实现过程是不透明的。实际上,工具包之所以可以处理有缺失值的数据集,是因为加了缺失值处理函数。要明白,工具/算法本身是不应该处理缺失值的,应该处理缺失值的应该用户。工具或者某些特殊的算法为了方便用户的使用,提供了默认的缺失值处理函数,如果用户没有提供自己的缺失值处理函数,就使用工具或者算法默认的缺失值处理函数。
常用的处理具有缺失数据的工具或者算法有两种:(1)决策树:(2)xgboost。
(1) 决策树处理缺失数据
在决策树中,以随机森林为例简单说明。在随机森林中,处理缺失值的方式如下
方法一:把数值型变量中的缺失值用对应类别中的中位数替换;把非数值型数据的缺失值使用出现次数最多的数据替换。这种处理方式快速、简单,但是效果较差。
方法二:对要补全的数据记录先和其他记录做相似度度量,在补全缺失数据是相似的点的数据会有更好的权重。这种方式还是利用中位数和出现次数最多的数填充,可是选择数据的方式不一样了。
(2) Xgboost处理缺失数据
Xgboost处理缺失数据是把缺失值当做稀疏矩阵对待,在节点分裂的时候暂时不考虑数据缺失。缺失的数据会被分到左子树和右子树,分别计算损失,然后选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,默认分到右子树。
4、 使用工具处理缺失数据的优缺点
优点:(1)可以节省用户的时间,快速建模;(2)防止用户导入的数据集存在缺失值导致模型训练失败。
缺点:(1)工具提供的缺失值处理方法也许并不适用所有的数据,可能使模型训练时间延长;(2)工具提供的方法要应对的是所有可能的情况,对特殊的情形并不事最佳的选择方案。
5、 缺失数据时选择模型的方式小结
(1) 数据量较小:使用朴素贝叶斯
(2) 数据量较大:使用神经网络
(3) 数据量适中或者较大:用树模型,优先采用xgboost
(4) 树模型对缺失值的敏感度较低,大部分时候可以在数据有缺失的时候使用
(5) 如果要采用距离度量可以采用k近邻(kNN)或者支持向量机(SVM)
(6) 神经网络的鲁棒性强,对缺失数据不敏感,但一般没有那么多数据可以使用
(7) 线性模型在计算代价函数的时候,需要使用梯度下降法,这里需要计算距离,对缺失值敏感
(8) 贝叶斯模型对缺失数据比较稳定,数据量很小的时候首选贝叶斯模型
初学者,欢迎大家批评指正。