《GAIN Missing Data Imputation using Generative Adversarial Nets》探析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Forlogen/article/details/89534235

论文地址:https://arxiv.org/abs/1806.02920
论文GitHub:https://github.com/jsyoon0823/GAIN
收录:ICML2018


在这里插入图片描述


总览


这篇论文中作者提出了一种使用GAN填补缺失值的新框架GAIN,基本原理和标准的GAN相似,不同的在于根据具体问题所做的架构方面的改变。在GAIN中主要包括以下三个部分:

  • Generator,G:它用来观察真实数据的每一部分,然后根据观察的结果填补缺失数据的部分,输出一个填补后完整的向量
  • Discriminator,D:它接受一个完整的向量,来判别哪一部分数据是真实观察到的,哪一部分是被填补的
  • Hint Vector,hint:它揭示了原始数据中缺失部分的某些信息,让D更加关注它所提示的部分,同时也逼迫G生成更加接近真实的数据用来填补

当然实现的细节并不是这么简单,具体细节正文中会介绍。最后作者通过在多个数据集上进行实验,证明了GAIN的性能比之前各种填补算法都要好。


背景


在实际的问题中,数据的缺失是一个很普遍的现象,有时因为数据本身就很难获得,有时是因为各种原因而造成了数据的丢失。作者的关注领域主要是医疗数据,此外也提出了数据填充算法同样也可以用在其他的方面,比如图像含混、数据压缩等等。

缺失的数据可以分为以下的三大类:

  • MCAR:数据的缺失完全是随机的,它不依赖于任何的变量
  • MAR:数据的缺失不完全是随机的,仅依赖于可以观察到的变量
  • MNAR:数据的缺失不是随机的,它依赖于目前可以观察到的变量,同样也依赖于未观察的变量,我们无法通过可以观察到的变量来掌握数据的情况

本文作者主要是针对MCAR这种情况提出新的填补算法,并与在这种背景下的其他先进的填补算法进行了比较。

同时填补算法也可以分为判别式和生成式两种:

  • generative methods:这些方法主要依赖于EM算法和深度学习,如DAE、GAN等
  • discriminative methods:如MICE、MissForest、matrix completion等

但是目前的生成式填补算法存在着一些缺点,它们是以一种基于对数据分布的先验假设的方法,当数据中含有混合类别和连续变量时,它的泛化能力就会很差。DAE在一定程度上解决了这个问题,但是它在训练的过程中需要完成的数据集,在很多情况下,缺失的数据部分在一定程度上反映了完整数据集的内在结构信息,所以获取到完成的数据集是不太可能的。DAE的另一种方法允许使用不完整的数据集进行训练,但是它只能根据观察到的部分来表示数据。而使用DCGANs来完成图像填补的算法,同样需要完整的数据集来训练判别器。

本文作者提出的GAIN是GAN的一个泛化版本,它基本上采用了GAN的架构,在数据集不完整的情况下,它也可以很好的处理数据的填补。在GAIN中,生成器的目标是精确的填补缺失的数据,判别器的目标是准确的分辨数据是填补的还是真实的。所以判别器要最小化分类误差率,而生成器要最大化判别器的分类误差率,这样两者就处在了一种相互对抗的过程中。同时为了使这个对抗过程得到更加理想的结果,还为判别器提供了关于数据的部分信息的hints,逼迫生成器生成的样本接近于真实的数据分布。


问题的公式化表示


首先给出GAIN的架构图

扫描二维码关注公众号,回复: 6022750 查看本文章

在这里插入图片描述

为了方便公式的推导,先做以下的规定:

  • χ : χ = χ 1 × × χ d \chi :\chi=\chi_{1}\times…\times \chi_{d} ,表示一个d维的空间

  • X : X = X 1 × × X d X:X=X_{1}\times…\times X_{d} ,表示取自 χ \chi 空间中的一个随机变量,将其称为数据向量

  • P ( X ) : P(X): 表示X的数据分布

  • M : M = { M 1 M d } M:M=\{M_{1}…M{d}\} ,表示取值{0,1}的随机变量,将其称为掩模向量,,它反映了哪些变量是观察数据,哪些是填补的

  • χ i ~ : \tilde{\chi_{i}}: χ i ~ = χ i { } \tilde{\chi_{i}}=\chi_{i}∪\{\ast\} i = 1 , 2 , , d i=1,2,…,d χ i ~ \tilde{\chi_{i}} 表示对于每一维定义的新空间,其中 \ast 表示不在 χ \chi 任何一维空间 χ i \chi_{i} 中的数据

  • χ ~ \tilde{\chi} χ ~ = χ 1 ~ × × χ d ~ \tilde{\chi}=\tilde{\chi_{1}}\times…\times \tilde{\chi_{d}} ,表示新生成的d维空间

  • X ~ : X ~ = X 1 ~ × × X d ~ \tilde{X}:\tilde{X}=\tilde{X_{1}}\times…\times \tilde{X_{d}} ,表示取样自 χ ~ \tilde{\chi} 的一个随机变量,它的取值规定如下:
    X i ~ = { X i , if  M i  = 1 , otherwise \tilde{X_{i}} = \begin{cases} X_{i}, & \text{if $M_{i}$ = 1} \\ *, & \text{otherwise} \end{cases}

    可以从 X ~ \tilde{X} 复原 M M

  • x ~ i , i = 1 , 2 , . . . , n \tilde{x}^{i},i=1,2,...,n :表示 X ~ \tilde{X} 空间中的第 i i 个数据

  • m i , i = 1 , 2 , . . . , n m^{i},i=1,2,...,n :表示从 X ~ \tilde{X} 复原 M M 的元素

  • D D D = { x ~ i , m i } , i = 1 , 2 , . . . , n D=\{\tilde{x}^{i},m^{i}\},i=1,2,...,n ,表示要使用的数据集

我们的目标就是根据上面定义的内容填充 x ~ i \tilde{x}^{i} 缺失的部分,通常使用条件概率 P = ( X X ~ = x ~ i ) P=(X|\tilde{X}=\tilde{x}^{i}) 来填补D中缺失的值。这里是尝试找到数据分布模型,而不仅仅是求期望。通过多次的填补,我们就可以把握数据内在的不确定性。


GAIN


这部分通过由GANs驱动的模拟 P = ( X X ~ = x ~ i ) P=(X|\tilde{X}=\tilde{x}^{i}) 的方法来阐述GAIN的思路。

Generator

G将 X ~ \tilde{X} M M Z Z 做为输入,输出 X ˉ \bar{X} Z Z 是一个d维的噪声,独立于所有的变量。

定义两个随机变量:
X ˉ = G ( X ~ , M , ( 1 M ) Z ) X ^ = M X ~ + ( 1 M ) X ˉ \bar{X}=G(\tilde{X},M,(1-M)\odot Z) \\ \hat{X}=M \odot \tilde{X}+(1-M)\bar{X}

X ˉ \bar{X} :指的是填补值的向量,不含已观察到的数据部分,这里需要注意的是,G会为每一部分都输出一个值,即使有些部分不是缺失的。

X ^ \hat{X} :指的是填补后完整的数据向量,它观察 X ~ \tilde{X} 局部的信息,然后用 X ˉ \bar{X} 中的估算值代替对应位置的 \ast 得到。

使用 ( 1 M ) Z (1-M)\odot Z 代替 Z Z ,是为了使得让噪声数据的维度匹配目标分布,即告诉 Z Z X ~ \tilde{X} 中哪些部分是需要使用噪声进行填充的。


Discriminator

和标准的GAN一样,判别器被用来作为一个对抗者训练G。不同之处在于标准的GAN中,生成器生成结果要么全是真实的,要么全是假的,判别器给出的结果也只有真假两个选择。但是在GAIN中,生成器给出的结果有些部分是真实的,有些部分是生成的;判别器也不是识别整个向量的真假,而是试图判别哪些部分是真的,哪些是生成的。这就相当于预测 M M m m 的值。

D ( X ^ ) D(\hat{X}) 中的第 i i 个成分表示的是 X ^ \hat{X} 的第 i i 个成分是观察数据的概率

Hint

这是一种提示机制,强化了G和D的对抗过程。它是一个随机变量 H H ,从 H \mathcal {H} 中取值, H H H \mathcal {H} 都是用户自己定义的。 H H 中的元素 h h 依赖于分布 H M = m H|M=m ,将其输入到D中。基于条件 X ^ = x ^ \hat{X}=\hat{x} H = h H=h ,此时 D ( x ^ , h ) D(\hat{x},h) 中第 i i 个部分就反映了它是真实数据的概率。

H H 定义的不同,那么给D的提示信息就不同,从而可以训练出具有多个分布的G,根据D的结果来选择最优的那一个。

目标

通过最大化正确预测M的概率来训练D,通过最小化D能正确预测M的概率来训练G。所以类似于GAN,定义如下的评估函数:
V ( D , G ) = E X ^ , M , H [ M T l o g D ( X ^ , H ) + ( 1 M ) T l o g ( 1 D ( X ^ , H ) ) ] V(D,G)=\mathbb{E}_{\hat{X},M,H}[M^TlogD(\hat{X},H)+(1-M)^Tlog(1-D(\hat{X},H))]

因此GAIN的目标就是 min G max D V ( D , G ) \min \limits_{G} \max \limits_{D} V(D,G) ,然后使用交叉熵来定义损失函数,如下所示
L ( a , b ) = i = 1 d [ a i l o g ( b i ) + ( 1 a i ) l o g ( 1 b i ) ] \mathcal{L}(a,b)=\sum_{i=1}^d [a_{i}log(b_{i})+(1-a_{i})log(1-b_{i})]
其中 a i a_{i} 表示D预测结果矩阵中的元素, b i b_{i} 表示对应于 a i a_{i} M M 中的元素。

M ^ = D ( X ^ , H ) \hat{M}=D(\hat{X},H) ,则目标就转换成了D能否正确预测 M M 的函数
min G max D E [ L ( M , M ^ ) ] \min \limits_{G} \max \limits_{D} \mathbb{E}[\mathcal{L}(M,\hat{M})]


GAIN算法


首先给出算法描述的伪代码:


在这里插入图片描述

这里G和D都是全连接的神经网络,迭代的解决 min G max D V ( D , G ) \min \limits_{G} \max \limits_{D} V(D,G) 这个最大最小优化问题。

  • 判别器D的训练过程
    固定一个G和小批次的大小 k D k_{D} ,首先从数据集中抽样 k D k_{D} 个样本 ( x ~ ( j ) , m ( j ) ) (\tilde{x}(j),m(j)) ,从 Z Z B B 中抽样 k D k_{D} 个样本 z ( j ) z(j) b ( j ) b(j) ,然后根据公式计算 x ^ ( j ) \hat{x}(j) h ( j ) h(j) 。根据数学推理知道,当G固定时,D的唯一输出是对应于每个样本的 b i = 0 b_{i} = 0 的部分,因此我们只训练D来给出 b i = 0 b_{i}=0 部分的输出。

    定义关于D的损失函数:
    L D ( m , m ^ , b ) = i : b i = 0 [ m i l o g ( m i ^ ) + ( 1 m i ) l o g ( 1 m i ^ ) ] \mathcal{L}_{D}(m,\hat{m},b)=\sum_{i:b_{i}=0}[m_{i}log(\hat{m_{i}})+(1-m_{i})log(1-\hat{m_{i}})]

    D根据以下的准则来训练:
    min D j = 1 k D L D ( m ( j ) , m ^ ( j ) , b ( j ) ) \min \limits_{D} \sum_{j=1}^{k_{D}}L_{D}(m(j),\hat{m}(j),b(j))

  • 生成器G的训练过程
    使用最近更新过的D,以小批量 k G k_{G} 进行训练。G实际上输出的是一个包含所有数据的向量,因此在G的训练过程中,我们不仅要使缺失地方 ( m j = 0 ) (m_{j}=0) 填补的值成功的骗过D,还要保证真实被观察的数据( m j = 1 m_{j}=1 )的输出也要接近真实值。

    为此我们需要定义两个损失函数如下所示:
    L G ( m , m ^ , b ) = i : b i = 0 ( 1 m i l o g ( m i ^ ) ) \mathcal{L}_{G}(m,\hat{m},b)=-\sum_{i:b_{i}=0}(1-m_{i}log(\hat{m_{i}}))
    它用来评估填补的质量,它的值越小,表示 m i = 0 m_{i}=0 被D判别为 m i = 1 m_{i}=1 的概率越接近1。
    L M ( x , x ) = i = 1 d m i L M ( x i , x i ) \mathcal{L}_{M}(x,x')=\sum_{i=1}^dm_{i}L_{M}(x_{i},x_{i}')

    其中
    L M ( x , x ) = { ( x i x i ) 2 , if  x i  is continuous x i l o g ( x i ) , if  x i  is binary \mathcal{L}_{M}(x,x')= \begin{cases} (x_{i}'-x_{i})^2, & \text {if $x_{i}$ is continuous} \\ -x_{i}log(x_{i}'), & \text{if $x_{i}$ is binary} \end{cases}
    它表示重建误差,用来评估真实观察值经过G的输出与真实值的差距。它的值越小,说明重构后的值越接近真实值。

    因此我们可以使用一个完整的损失函数评估训练过程:
    min G j = 1 k G L G ( m ( j ) , m ^ ( j ) , b ( j ) ) + α L M ( x ~ ( j ) , x ^ ( j ) ) \min \limits_{G}\sum_{j=1}^{k_{G}}\mathcal{L}_{G}(m(j),\hat{m}(j),b(j))+\alpha \mathcal{L}_{M}(\tilde{x}(j),\hat{x}(j))

    α \alpha 这里是一个超参数。


实验评估


作者通过与其他的填补算法进行对比,比较它们的效果。每个实验做10次,同时使用5折交叉验证,使用RMSE(均方根误差RMSE是观测值与真值偏差的平方与观测次数n比值的平方根,值越小越好)和AUROC(ROC曲线下的面积,值越大表示效果越好)来评估结果的优劣。

数据的缺失标准是20%。

实验1

验证GAIN中每一部分对于整体的重要性,通过每次去掉 L G \mathcal{L}_{G} L M \mathcal{L}_{M} H H 中的一个来和完整的GAIN进行比较,在6个不同的数据集上进行实验,结果如下


在这里插入图片描述

从图中我们可以看出完整的GAIN相比于缺少某一部分的GAIN的效果在每一个数据集上都好的多。

实验2

通过在5个不同的数据集上实验,比较GAIN和其他5个填补算法的效果,结果如下:


在这里插入图片描述

GAIN效果明显好于其他算法。

实验3

通过调整数据的缺失率、样本的数量、特征的维度来对比GAIN和MissForest、Auto-encoder的效果,结果如下


在这里插入图片描述

从第一个图中可以看到,GAIN在各种缺失比例的条件下,效果都优于其他两种算法。在第二个图中可以看出,随着样本数的增加,GAIN的RMSE迅速下降,并小于其他的两种算法,并且当样本数很多时,它的RMSE也是最小的。从第三个图中看出,随着特征维度的变化,GAIN的效果好于其他两种算法,特别是当特征维度很小时,MissForest和Auto-encoder显得难以处理。

实验4

评估在计算后预测的准确性方面。为了达到这个目的,使用了AUROC作为性能指标。为了公平对待所有方法,我们在所有情况下使用相同的预测模型(逻辑回归)。结果如下

在这里插入图片描述

从中我们可以看出,在4个数据集上实验,GAIN和其他的算法相比并没有太大的提升,这可能是填补精度虽然提升了,但是对于预测精度的帮助不大,因为可以80%被观察的数据已有足够的信息来做预测。

而且在不同的缺失率的情况下,GAIN的效果更好,可能是因为当缺失的数据多时,填补的数据对于真实数据的反映对于预测起到了重要的作用。

在这里插入图片描述

实验5

填补模型的相似性在于它能够保持特征-标签关系的值。通过测量填补后对特征-标签关系的影响,可以评估填补模型的同质性。作者使用不同的填补算法,从完整的信用数据集中执行Logistic Regression,得到参数 w w ;再从不完整的同样的数据集上执行Logistic Regression,得到参数 w ^ \hat{w} ,比较 w w w ^ \hat{w}

作者使用了 w w ^ 1 ||w-\hat{w}||_{1} w w ^ 2 ||w-\hat{w}||_{2} 来做评估。这些量越小,说明该算法较好地考虑了特征与标签之间的关系。结果如下


在这里插入图片描述

从中可以看出GAIN的效果明显好于其他的算法。


总结


作何所提出的新的框架GAIN在缺失数据填补方面有很大的提高,同样也可以将其用在推荐系统、主动感知等其他方面。

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/89534235