【问题标题】:Keras Denoising Autoencoder (tabular data)Keras去噪自动编码器(表格数据)
【发布时间】:2018-10-05 07:55:43
【问题描述】:

我有一个项目,我正在使用表格数据对梯度提升树进行回归。我想看看对我的数据使用去噪自动编码器是否可以更好地表示我的原始数据并提高我的原始 GBT 分数。灵感来自流行的 Kaggle 获胜者here.

AFAIK 对于提取 DAE 的激活,我有两个主要选择 - 创建瓶颈结构并采用单个中间层激活或连接每个层的激活作为表示。

假设我想要下面 3x 512 节点层的所有层激活:

inputs = Input(shape=(31,))
encoded = Dense(512, activation='relu')(inputs)
encoded = Dense(512, activation='relu')(encoded)
decoded = Dense(512, activation='relu')(encoded)
decoded = Dense(31, activation='linear')(decoded)
autoencoder = Model(inputs, decoded)
autoencoder.compile(optimizer='Adam', loss='mse')

history = autoencoder.fit(x_train_noisy, x_train_clean,
                epochs=100,
                batch_size=128,
                shuffle=True,
                validation_data=(x_test_noisy, x_test_clean),
                callbacks=[reduce_lr])

我的问题是:

  • 接受上述激活将为我提供 x_train 的新表示,对吗?我应该为 x_test 重复这个过程吗?我需要两者来训练我的 GBT 模型。

  • 如何进行推理?每个新数据点都需要“转换”成这种新的表示格式。我如何使用 Keras 做到这一点?

  • 在这种情况下,我真的需要将validation_data= 提供给.fit 吗?

【问题讨论】:

    标签: machine-learning deep-learning keras autoencoder


    【解决方案1】:

    去噪自动编码器模型是一种可以帮助对噪声数据进行去噪的模型。作为训练数据,我们使用具有相同目标数据的训练数据。

    您在上面描述的模型不是去噪自动编码器模型。对于自动编码器模型,在编码部分,单元的数量必须逐层逐渐减少,因此在解码部分的单元数量必须逐渐增加。

    简单的自动编码器模型应该如下所示:

    input = Input(shape=(31,))
    encoded = Dense(128, activation='relu')(input)
    encoded = Dense(64, activation='relu')(encoded)
    encoded = Dense(32, activation='relu')(encoded)
    
    decoded = Dense(32, activation='relu')(encoded)
    decoded = Dense(64, activation='relu')(decoded)
    decoded = Dense(128, activation='relu')(decoded)
    decoded = Dense(31, activation='sigmoid')(decoded)
    
    autoencoder = Model(input, decoded)
    autoencoder.compile(optimizer='adam', loss='mse')
    
    autoencoder.fit(x_train_noisy, x_train_noisy,
                    epochs=100,
                    batch_size=256,
                    shuffle=True,
                    validation_data=(x_test_noisy, x_test_noisy))
    

    【讨论】:

      【解决方案2】:

      接受上述的激活会给我一个新的表示 x_train 的,对吧?我应该为 x_test 重复这个过程吗?我需要 两者都用来训练我的 GBT 模型。

      当然,您需要对训练和测试数据都有去噪表示,因为您稍后训练的 GBT 模型只接受去噪特征。

      如何进行推理?每个新的数据点都需要 “转换”成这种新的表示格式。我怎样才能做到这一点 使用 Keras?

      如果要使用去噪/重构的特征,可以直接使用autoencoder.predict( X_feat )提取特征。如果要使用中间层,需要先新建一个模型encoder_only=Model(inputs, encoded),用于特征提取。

      我真的需要提供validation_data= 到.fit 中吗 情况?

      您最好分离一些训练数据进行验证,以防止过度拟合。但是,您始终可以训练多个模型,例如以一种留一法的方式,以整体方式充分利用所有数据。

      补充说明:

      • 512 个隐藏的神经元对于您的任务来说似乎太多了
      • 考虑使用DropOut
      • 注意表格数据,尤其是当不同列中的数据具有不同的动态范围时(即 MSE 不能公平地量化不同列的重建误差)。

      【讨论】:

      • 有趣,感谢回复。因此,如果我理解正确 - 我只是在训练网络从轻微损坏的输入中推导出自己,然后进行自我预测。通过预测自己,它可能只关注重要信息,并吐出一个类似但改变了输入特征的预测?不幸的是,当我尝试这个时 - 它使 GBT 变得更糟 - 好像它在这个过程中丢失了信息 :( 在我的 OP 中的链接中 - 他们实际上使用所有隐藏层的串联激活作为表示,而不仅仅是 model.predict . 对方法的想法?
      最近更新 更多