在进行数据挖掘的过程中,理解和清洗数据是最耗费时间的事情。你应该知道数据是如何产生的,哪些特征对业务有影响,只有这样你才能给出最好的数据结果。
在本文中,我们将介绍缺失值的产生原因和缺失值具体的处理方法。
问题1:为什么有缺失值?
现实世界中的数据在大多数情况下都有很多缺失的数据。每个值丢失的原因可能不同。可能有数据丢失或损坏,或者也可能有特定原因。
缺失值产生的原因
数据丢失背后的一些可能原因(产生过程、传输过程、存储过程):
- 人们不会在数据收集调查中提供有关某些问题的信息。
- 数据是从各种可用的过去记录中积累的,而不是直接积累的。
- 数据收集过程中的不准确也会导致数据丢失。
缺失值类型
数据丢失的原因多种多样,但整体可以将它们分为三个主要组:完全随机丢失、随机丢失、不随机丢失。
完全随机缺失 (MCAR)
现象:缺失的数据不遵循任何特定模式,它们只是随机的。
特点:不可能用其余的变量数据来预测这些值,数据的缺失与其余变量无关或独立。
案例:如在数据收集过程中,由于粗心大意丢失了特定样本
随机丢失 (MAR)
现象:数据在特定子集中丢失
特点:可以借助其他功能来预测数据是否存在/不存在,无法自己预测丢失的数据。
案例:如在数据收集过程中,有一些默认选项,可以不做填写
不随机丢失 (NMAR)
现象:确实的数据遵循某种模式,且与数据样本相关。
特点:删除行/列、插补等常用方法将不起作用,缺失的数据与字段相关。
案例:如在数据收集中,采集者根据字段来选择填写某些字段。
问题2:如何分析缺失值?
在Pandas中可以很方便的使用isnull函数来计算是否包含缺失值。
missing_values=train.isnull().sum()
同时也可以使用missingno库来查看缺失值的分布规律:
- bar:统计每列缺失值的次数
- matrix:统计缺失值和行数分布规律
- heatmap:统计列缺失值的相关性
- dendrogram:统计列确实的组合性
问题3:缺失值需要处理吗?
处理缺失值可以从两个角度考虑:
- 从数据角度:如果某列的缺失比例大于某一阈值(如大于90%),则可以考虑剔除列;类似的对行的角度也可以这样操作。
- 从模型角度:如果使用树模型则不用考虑处理,其他模型则需要进行填充或者剔除。
问题4:缺失值如何填充?
使用值填充
使用特殊值填充是最简单的填充方法,主要的优势是速度,可能会带来一定的噪音。
- 数值列:中位数、中位数、特殊值
- 类别列:众数、特殊值
最近邻样本填充
如果数据集的行按照日期维度进行组织,则可以考虑使用时序信息完成填充:
- 向前填充
- 向后填充
- 前后填充
如果数据集的行没有时序信息,使用KNN模型可以选择最近邻的样本,然后从样本的维度完成填充。
使用模型预测
数据样本各列之间存在联系,此时可以从列与列的关系完成缺失值填充。
- 使用回归/分类模型预测列:使用其他列作为特征,待填充列作为标签;
- 使用自编码器预测缺失值:使用缺失数据作为输入,完整数据作为标签,完成自监督训练。