数据预处理
一.检测和处理缺失值与重复值
1.概念与机理
(1)完全变量与不完全变量
数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量
(2)缺失值产生的原因
缺失值的产生的原因分为机械原因和人为原因。
- 前者是由于机器原因导致的数据收集或保存的失败造成的数据缺失。例如:数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集。
- 后者由于人的主观失误、历史局限或有意隐瞒造成的数据缺失。例如:在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据。
(3)缺失值产生的三种机制
以教育程度(自变量/特征)和收入水平(因变量/结果)关系的调查数据为例,考察收入水平字段的缺失情况:
- 完全随机缺失(Missing Completely At Random,MCAR):缺失的数据与自身和其它任何变量都没有关系
- 与自身无关:不管收入高的人还是收入低的人,都有同样的缺失率或缺失可能性;而不是:收入高的人有更多的理由或原因缺失数据,或者反之
- 与其它变量无关:不管教育程度高还是低,收入水平字段都有同等的缺失率。而不是:教育程度高的人有更大的可能性缺失收入水平数据,或者反之
- 对于完全随机缺失值,可以把含有缺失数据的样本直接删除,不会影响结果估计的准确性,只会影响精确性。例如,在不缺失情况下,估计的回归系数为0.6,那么删除缺失值后,系数估计值应该仍在0.6附近,只是由于样本数变少,标准误会增大,从而置信区间变宽
- 完全随机缺失是一种最理想的情况,然而实际中往往很难保证这一假定
- 随机缺失(Missing At Random,MAR):缺失变量与自身无关,但与其它变量有关
- 例如:如果收入字段的缺失与教育程度有关系(如教育程度高的人比教育程度低的人缺失的更多),但是与收入本身无关(高收入和低收入的人的缺失人数差不多),这种情况就是随机缺失
- 当数据有缺失的时候,可以检查自变量相对于缺失的因变量的分布情况。例如年龄、性别等自变量的取值,与收入字段的缺失值之间的统计关系
- 非随机缺失(missing not at random,MNAR):缺失与变量自身有关
- 例如:如果发现收入高的人更倾向于不填数据,而收入低的人一般都不缺失,说明收入的缺失是与自身变量有关的
- 这种情况比较棘手,相当于样本选择有偏(偏向于收入低的人),很可能对结果的可靠性造成不良影响
2.流程与方法
(1)缺失值的处理方法-删除法
- 将缺失值所在的行删除,或者删除缺失值对应变量字段(如果该变量含有缺失值比例过大)
- 可能产生的问题
- 丢失被删除的样本或字段中隐藏的重要信息
- 产生数据偏移,例如原本的正态分布变为非正态分布
- 适用范围:样本数据量大且缺失值不多
(2)缺失值的处理方法-单变量插补
- 仅仅在缺失字段内部进行某些统计计算,将计算结果作为缺失值。这种方式不考虑其它字段对本缺失字段的影响。
- 填补方法
- 平均值填补:计算该字段的平均值作为缺失值的默认值。适合正态分布的数值型变量
- 中位数填补:计算该字段的中位数作为缺失值的默认值,适合偏态分布的数值型变量
- 众数填补:统计该字段中出现次数最多的取值,作为缺失值的默认值,适合文本型变量
- 临近值填补:使用样本的前一个或后一个样本所对应字段值作为该样本的默认值
- 可能产生的问题:
- 扭曲目标变量的分布,可能错误判断了变量与变量之间的关系
(3)缺失值的处理方法-多变量插补
- 以缺失字段为结果(因变量),以其它字段为特征(自变量),建立机器学习模型,预测缺失字段的值
- 填补方法:
- K-近邻算法填补:对于需要填补缺失字段的样本,先利用欧氏距离找到其邻近的 K K K个样本(计算距离时不计入缺失字段),再将这 K K K个邻近的值进行加权平均进行填补
- 随机森林填补:以待填补的缺失字段为目标,基于其它字段训练随机森林模型,用模型预测缺失字段的值
- 迭代插补:
- 如果有多个字段存在缺失值,则先选择其中1个字段作为结果 y y y,其它字段作为特征 X X X
- 使用一个回归器来在不含缺失y值的样本上对 ( X , y ) (X, y) (X,y)进行拟合,然后使用这个回归器来预测缺失样本的y值
- 该字段预测完成后,换到下一个缺失字段作为结果 y y y,其它字段作为特征 X X X,继续进行回归
- 以迭代的方式对每个特征依次进行,重复若干轮,最后一轮的计算结果作为最终的填充结果
(4)缺失值的处理方法-多重插补(Multiple Imputation)
- 多重填补方法分为三个步骤:
- 插补:将不完整数据集缺失的观测行估算填充 M M M次,这将生成 M M M个完整的数据集。估算方法可以采用前述单变量插补或多变量插补,但更好的方法是采用马尔科夫链蒙特卡洛模拟(MCMC,Markov Chain Monte Carlo Simulation)
- 分析:针对 M M M个数据集分别使用统计方法(例如线性或广义线性模型)进行统计分析
- 合并:对来自各个插补数据集的统计分析结果,根据评分函数进行选择,产生最终的插补值
- R语言的mice包提供了经典的多重插补实现,Python提供了miceforest包进行处理。本演练不包括多重插补的内容
(5)重复值判断和处理的方法
- 判断两个样本是否重复,一般应先指定其中的若干个字段,如果对应字段的值都相同,则视为重复样本
- 对于重复样本,一般来说是仅保留1条。但具体是保留哪一条,则可能需要根据其它字段的取值,或者样本的顺序来确定
4.技术与实现
(1)判断和检测缺失值
- pandas.DateFrame.isnull()
(2)直接删除缺失值
- pandas:DateFrame.dropna
(3)缺失值填充
- 单变量插补:pandas.DataFrame.fillna、sklearn.impute.SimpleImputer
- 多变量插补:sklearn.impute.IterativeImputer、sklearn.impute.KNNImputer、sklearn.ensemble.RandomForestRegressor
二.离散化和分箱处理
离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。它是把连续的数据进行分组,使其变成离散化的区间的过程
- 分箱:把一段连续的值切分成若干段,每一段的值看成一个分类。分箱是离散化的重要手段之一。
- 离散化的优点
- 离散化特征的增加和减少都很容易,有利于模型的快速迭代
- 可以减少过拟合的风险
- 增加稀疏数据的概率,减少计算量
- 有效避免一些异常数据的干扰,降低数据波动影响,抗噪声能力提高
- 分类树、朴素贝叶斯方法等是基于离散数据展开的
- 方便特征衍生,因为数据离散化后就可以把特征直接相互做内积提升特征维度
离散化处理方法
- 等宽法
- 根据属性的值域来划分,使每个区间的宽度相等
- 例如数组[4,18,19,22,14,8,9,13,10 ]划分为三组,区间分别是[4,10],(10,16],(16,22] 分组结果是[4,8,9,10],[13,14],[18,19,22]
- 等频法
- 等频分组也叫分位数分组,即分组后,每个分组的元素个数是一样的
- 例如数组[1, 7, 12, 12, 22, 30, 34, 38, 46],需要分成三组,分组后的结果:[1, 7, 12],[12, 22, 30], [34, 38, 46]
- 卡方分箱
- 卡方分箱是基于合并的数据离散方法,它依赖于卡方检验。
- 原理:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开
- 本演练不涉及卡方分箱
- K-Means聚类算法
- 将n个样本点划分为 K K K个簇,使得相似的样本尽量被分到同一个聚簇
- 二值化处理
- 这是一种比较极端的处理方式,通过指定一个阈值,大于阈值的数据划分为一个区间,其余数据划分到另一个区间
(1)二值化处理
- sklearn.preprocessing.Binarizer
(2)分箱处理
- numpy.digitize
- sklearn.preprocessing.KBinsDiscretizer
- pandas.cut
(3)聚类
- sklearn.cluster.KMeans