Keras去噪自动编码器(表格数据)

时间:2018-04-24 23:40:54

标签: machine-learning deep-learning keras autoencoder

我有一个项目,我使用表格数据对Gradient Boosted Trees进行回归。我想看看在我的数据上使用去噪自动编码器是否可以找到更好的原始数据表示并提高我的原始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

2 个答案:

答案 0 :(得分:2)

  

采取上述激活将给我一个新的代表   x_train,对吧?我应该为x_test重复这个过程吗?我需要   两者都是为了训练我的GBT模型。

当然,你需要对训练和测试数据进行去噪表示,因为你后来训练的GBT模型只接受去噪特征。

  

我该怎么做推理?每个新数据点都需要   "转换"进入这种新的表示格式。我怎样才能做到这一点   与Keras?

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

  

我是否真的需要在此提供validation_data = .fit   情况?

您最好将一些培训数据分开以进行验证,以防止过度拟合。但是,您可以随时训练多个模型,例如以一对一的方式以完整的方式完全使用所有数据。

补充说明:

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

答案 1 :(得分:0)

去噪自动编码器模型是一种可以帮助去噪噪声数据的模型。作为列车数据,我们使用我们的列车数据,目标是相同的数据。

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

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

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))