从经典到深度学习的数据补全

数据补全方法

  • 数据分析
  • 一般方法
  • 随机森林
  • GAIN
    • 背景说明
    • 数据处理
    • 生成器
    • 暗示矩阵
    • 判别器
    • 优化目标
    • 算法过程
  • 其他GAN补全数据相关文章

实际中运用机器学习方法完成各种任务时,常常遇到数据缺失的问题 ,如果某特征缺失的样本占总数极大,我们可能就直接舍弃了;因为如果作为特征加入的话,可能反倒带入噪音,影响最后的结果,但是一般情况下我们会去寻找各种数据补全的方法来完善数据,提高模型效果。

数据分析

拿到数据的第一手肯定要看看具体情况,发现缺失再决定要去填充,那么我们拿到一个数据要怎么去看它的状况呢。首先可以用pandas自带的一些方法去看
比如用df.describe()就可以看到一些平均值、方差基础数学属性。
从经典到深度学习的数据补全_第1张图片
然后我们是要关注数据缺失与否的状况,data.isnull()可以判断为不为空,所以加上一个求每列空值综合再排序就可以得到特征缺失情况。(默认的排序是从小到大
从经典到深度学习的数据补全_第2张图片
然后我们可以依次把这些这些缺失特征当作标签去进行填充啦。(记得把没有缺失的特征去掉)
但是我们不局限于这种简陋的分析,给大家安利一个特别好用的工具包 pandas-profiling.只需要几行简单的调用就可以生成一个分析报告展示。

from pandas_profiling import ProfileReport
profile = ProfileReport(df, title="Pandas Profiling Report")
profile.to_file("your_report.html")

内容十分丰富,不仅可以看到一个属性值的最大最小,平均等多种信息。
从经典到深度学习的数据补全_第3张图片
还可以看到特征之间各种相关性评估
从经典到深度学习的数据补全_第4张图片

一般方法

一般缺失值处理方法就比较鲁棒了

  • 用特殊值填充,比如说都用-1之类(用之前看看数据本身有没有这个取值),取值不要太极端,涉及到线性运算的模型会受到影响。
  • 有些模型可以处理缺失值,比如一些树模型,把缺失的样本往最优划分子节点里面分。
  • 用统计出的平均值或者中位数填充。

随机森林

因为特征矩阵和标签之前存在着某种关系,那么特征和标签是可以相互转化的,比如说用地区,环境,附近学校数量预测房价的问题,我们既可以用地区,环境,附近学校数量的数据来预测房价,也可以反过来,用环境,附近学校数量和房价来预测地区,所以可以用建立一个回归分析模型的方法来填补缺失值。
我们每次填补一个特征,所以每次都要根据待填补特征的缺失情况生成单独的训练集和测试集。

 for i in miss_list:
        #依次将待填充特征称为新的标签,缺失越大的放在越后面
        new_label = data.iloc[:,i]
        #根据缺失情况划分训练集和测试集
        y_train = new_label[new_label.notnull()]
        y_test = new_label[new_label.isnull()]
        x_train = data.iloc[y_train.index]
        x_test = data.iloc[y_test.index]
        #其他特征的缺失部分仍要填充一个值,具体数值像上面所说,要考虑是否出现过
        x_train = x_train.fillna(0)
        x_test = x_test.fillna(0)
        #训练RF回归模型,预测缺失特征的取值
        rfr=RandomForestRegressor(random_state=0,n_estimators=1000,n_jobs=-1)
        rfr= rfr.fit(x_train, y_train)
        Ypredict = rfr.predict(x_test)
        #预测值回填到原始数据中
        data.iloc[y_test.index,i] = Ypredict

执行完之后就大功告成了,想要更细化一点的话就是对每个缺失特征涉及一套不同的RF参数单独训练,最后就是说填充不一定能起到更好的泛化效果,一切用结果说话。

GAIN

深度学习现在正是一片火热,什么方向研究领域不沾上一点神经网络模型都不好意思说话,所以数据补全自然也出现了基于神经网络架构的方放。
本文介绍一下ICML2018的一篇基于GAN来完成数据补全的文章。GAIN: Missing Data Imputation using Generative Adversarial Nets.

背景说明

作者的关注领域主要是医疗数据,和我实际运用的背景场合相同,此外也提出了数据填充算法同样也可以用在其他的方面,比如图像含混、数据压缩等等。

在GAIN中,生成器的任务是填补缺失的数据,而判别器的任务是分辨数据是填补的还是真实的,相当于对数据矩阵每个元素做一个分类判断,判断是原生的数据还是后来填充出的数据。所以判别器要最小化分类误差率,而生成器要最大化判别器的分类误差率,这样就处在了一个生成对抗过程中。同时为了使这个对抗过程得到更加理想的结果,还为判别器提供了关于数据的部分信息的hints,逼迫生成器生成的样本接近于真实的数据分布。
先把文章的模型架构贴出来,然后分部分做一下解释。
从经典到深度学习的数据补全_第5张图片

数据处理

首先注意到原始的数据会变成3个同等大小的矩阵。
1.数据矩阵,基本上就是原始的数据输入,缺失部分仍然是缺失的,除了作为生成器输入,也用来计算填充后数据与原始数据的差异(最左的实线MSE)。
2.随机矩阵,在原数据的缺失值位置随机生成一个值填充,相当于一个初始化。
3.掩码矩阵,用0/1标记数据中对应位置缺失与否,后续用了融合1和2中两个矩阵以及作为target计算判别器的损失(最右的交叉熵实线)。

生成器

原文实现代码里面是把数据矩阵和随机矩阵融合成一个矩阵,然后横向结合掩码矩阵变成一个m行2n列的矩阵经过3个全连接层和一个sigmod层之后得到一个输出,再点乘掩码矩阵(只剩下原始数据的缺失值部分)后插入到原始数据中形成imputed data。

暗示矩阵

也就是图中由掩码矩阵变化而来的hint矩阵,用来给判别器提示,在我看到的具体实现里面好像没什么好的做法,但是像上面一样随机生成一个然后像上面的掩码再生成里一样和imputed data横向结合送到判别器。

判别器

同生成器一样的网络架构,3个全连接层和一个sigmod层之后得到一个输出。但是这个和原始数据格式大小相等的输出的值意味着预测的imputed data矩阵对应位置元素是原始数据的概率。

优化目标

1.判别器的目标是识别原始数据和后来生成的数据,所以损失函数就是一般分类用的交叉熵。
2.生成器的目标是生成以假乱真的数据,既希望判别器判断错误,同时希望生成的值不是那么贴近原值所以还要加上上面说的MSE值相当于一个正则,所以生成器的损失就是两者的混合(加设一个超参混合)。
MSE真正来说应该代表重建误差,用来评估真实观察值经过G的输出与真实值的差距。它的值越小,说明重构后的值越接近真实值。文章对连续和类别值做出了区分。
在这里插入图片描述

算法过程

其实上面已经说的够多了,这里就附上论文里的伪代码,大致就是GAN通常的生成对抗过程。
从经典到深度学习的数据补全_第6张图片

其他GAN补全数据相关文章

后续补充

你可能感兴趣的:(数据竞赛,机器学习)