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