我有9个输入的时间序列数据,所以我想使用自动编码器来创建新功能,因为我无法再手动创建有意义的功能。我通过以下自动编码器运行X
i = Input(9)
encoded = BatchNormalization()(i)
encoded = Dense(256, activation='linear')(encoded)
decoded = Dense(input_dim, name='decoded')(decoded)
x = Dense(128, activation='linear')(decoded)
x = BatchNormalization()(x)
x = Dense(9, activation='swish', name='label_output')(x)
encoder = Model(inputs=i, outputs=decoded)
autoencoder = Model(inputs=i, outputs=[decoded, x])
autoencoder.compile(optimizer=tf.keras.optimizers.Adam(.0005), loss={'decoded':'mse','label_output':'mse'})
encoder.save_weights('encoder.hdf5')
我加载编码器:
encoder = encoder.load_weights('encoder.hdf5')
encodedX = encoder.predict(X)
我将编码的X拟合到XGBRgressor,并根据y对其进行训练。它输出的CV分数比我根本不编码X时的分数要高。例如,编码CV=-13,而正常CV为-0.09。有人能给我指正确的方向吗?谢谢
自动编码器不添加任何功能,它们学习以非平凡的方式复制输入(即:不是通过学习身份函数,而是通过学习解码器阶段用于生成新输入的输入的"抽象"表示(。
首先,你应该评估你的自动编码器(AE(在他的工作中表现如何。AE可能特别难以训练,赋予它们太多(或太少(的能力,你最终会得到身份函数,在这种情况下,你的模型将无法生成任何";"好";X的实例,这可以解释性能下降的原因。
其次,即使你的AE看起来做得很好,它也可能添加了一些噪声(由于重建中的错误(,或者已经学习了一些特定于你的训练集的模式,这些模式不会推广到其他数据。
因此,XGBRgressor将间接地过度适应您的训练集。