https://www.zhihu.com/question/58230411?sort=created
https://blog.csdn.net/Forlogen/article/details/89534235
- 缺失的类型
(1)随机丢失(MAR,Missing at Random)(数据丢失的概率与丢失的数据本身无关,而依赖于其他完全变量(无缺失变量))
随机丢失意味着数据丢失的概率与丢失的数据本身无关,而仅与部分已观测到的数据有关。也就是说,数据的缺失不是完全随机的,该类数据的缺失依赖于其他完全变量。
(2)完全随机丢失(MCAR,Missing Completely at Random)(数据缺失完全随机事件,无依赖关系)
数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性。简单来说,就是数据丢失的概率与其假设值以及其他变量值都完全无关。
(3)非随机丢失(MNAR,Missing not at Random)
数据的缺失与不完全变量自身的取值有关。分为两种情况:缺失值取决于其假设值(例如,高收入人群通常不希望在调查中透露他们的收入);或者,缺失值取决于其他变量值(假设基础数据很正常,也无临床症状,医生可能就觉得无需进一步检查,所以会有数据缺失)。
在前两种情况下可以根据其出现情况删除缺失值的数据,同时,随机缺失可以通过已知变量对缺失值进行估计。
在第三种情况下,删除包含缺失值的数据可能会导致模型出现偏差,同时,对数据进行填充也需要格外谨慎。
如果一个病人的体温测量值是有时缺失的,其原因是医生觉得病得太重的病人不需要量体温,那这个缺失显然不是MAR或者MCAR的。对于离散型特征,如果将特征中的缺失值单独编码成一个独立的类别(比如missing),而这个missing类别训练出来后对response有预测作用,那么这个特征中的缺失行为基本不是MAR或者MCAR的。
- 填补算法也可以分为判别式和生成式两种:
(1)generative methods:这些方法主要依赖于EM算法和深度学习,如DAE、GAN等
(2)discriminative methods:如MICE、MissForest、matrix completion等
目前的生成式填补算法存在着一些缺点,它们是以一种基于对数据分布的先验假设的方法,当数据中含有混合类别和连续变量时,它的泛化能力就会很差。DAE在一定程度上解决了这个问题,但是它在训练的过程中需要完整的数据集,在很多情况下,缺失的数据部分在一定程度上反映了完整数据集的内在结构信息,所以获取到完整的数据集是不太可能的。DAE的另一种方法允许使用不完整的数据集进行训练,但是它只能根据观察到的部分来表示数据。而使用DCGANs来完成图像填补的算法,同样需要完整的数据集来训练判别器。
难点:如果其他变量和缺失变量无关,则预测的结果无意义。如果预测结果相当准确,则又说明这个变量是没必要加入建模的。一般情况下,介于两者之间。
怎么处理异常值?
方法 0(最简单粗暴):在构建模型时忽略异常值。如果缺失数据量少的话
方法1(快速简单但效果差):把数值型(连续型)变量中的缺失值用其所对应的类别中的中位数替换。把描述型(离散型)变量缺失的部分用所对应类别中出现最多的数值替代。
方法2(耗时费力但效果好):虽然依然是使用中位数和出现次数最多的数来进行替换,方法2引入了权重。即对需要替换的数据先和其他数据做相似度测量也就是下面公式中的Weight,在补全缺失点是相似的点的数据会有更高的权重W。
方法3 (类xgboost):把缺失值当做稀疏矩阵来对待,本身的在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。这样的处理方法固然巧妙,但也有风险:即我们假设了训练数据和预测数据的分布相同,比如缺失值的分布也相同,不过直觉上应该影响不是很大:)
方法4 (回归):基于完整的数据集,建立回归方程。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关时会导致有偏差的估计。
方法5 (Kmeans)先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。
方法6 (离散化)为缺失值定制一个特征值比如,男/女/缺失 分别对应[0/1,0/1,0/1]=>[0,0,1] 这种onehot编码,特征离散化后加入计算。
- 生成式填补:(输入缺失向量生成完整向量)
方法1(AutoEncoder系列):在训练的时候使用0作为缺失值,相当于不激活边,在输出的时候不论输出了什么都强行置为0,防止反向传播的时候影响到边的权重。
方法2 GAN(GAIN),目前的SOTA
- 判别式填补(输入上下文向量预测):
方法1(MissForest):对于一个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的n-1个特征和原本的标签组成新的特征矩阵。那对于T来说,它没有缺失的部分,就是我们的Y_test,这部分数据既有标签也有特征,而它缺失的部分,只有特征没有标签,就是我们需要预测的部分。
那如果数据中除了特征T之外,其他特征也有缺失值怎么办?答案是遍历所有的特征,从缺失最少的开始进行填补(因为填补缺失最少的特征所需要的准确信息最少)。
填补一个特征时,先将其他特征的缺失值若为连续型值可用中位数、平均数代替,离散可用众数代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。每一次填补完毕,有缺失值的特征会减少一个,所以每次循环后,需要用0来填补的特征就越来越少。当进行到最后一个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要用0来进行填补了,而我们已经使用回归为其他特征填补了大量有效信息,可以用来填补缺失最多的特征。
方法2(matrix factorization):矩阵分解
然后梯度下降一把梭
针对特定场景下的缺失数据有不同的填充方式:
“年收入”:商品推荐场景下填充平均值,借贷额度场景下填充最小值;
“行为时间点”:填充众数;
“价格”:商品推荐场景下填充最小值,商品匹配场景下填充平均值;
“人体寿命”:保险费用估计场景下填充最大值,人口估计场景下填充平均值;
“驾龄”:没有填写这一项的用户可能是没有车,为它填充为0较为合理;
”本科毕业时间”:没有填写这一项的用户可能是没有上大学,为它填充正无穷比较合理;
“婚姻状态”:没有填写这一项的用户可能对自己的隐私比较敏感,应单独设为一个分类,如已婚1、未婚0、未填-1。
什么样的模型对缺失值更敏感?
主流的机器学习模型千千万,很难一概而论。但有一些经验法则(rule of thumb)供参考:
1)树模型对于缺失值的敏感度较低,大部分时候可以在数据有缺失时使用。
2)涉及到距离度量(distance measurement)时,如计算两个点之间的距离,缺失数据就变得比较重要。因为涉及到“距离”这个概念,那么缺失值处理不当就会导致效果很差,如K近邻算法(KNN)和支持向量机(SVM)。
3)线性模型的代价函数(loss function)往往涉及到距离(distance)的计算,计算预测值和真实值之间的差别,这容易导致对缺失值敏感。
4)神经网络的鲁棒性强,对于缺失数据不是非常敏感,但一般没有那么多数据可供使用。
5)贝叶斯模型对于缺失数据也比较稳定,数据量很小的时候首推贝叶斯模型。
总结来看,对于有缺失值的数据在经过缺失值处理后:
- 数据量很小,用朴素贝叶斯
- 数据量适中或者较大,用树模型,优先xgboost
- 数据量较大,也可以用神经网络
- 避免使用距离度量相关的模型,如KNN和SVM