使用自动编码器对少量数据缺少数据插补

时间:2019-01-16 11:36:37

标签: python keras autoencoder

对于我的硕士论文,我必须为人工神经网络建模,以预测消费者对连锁生产中的过程中参数的抱怨程度。不幸的是,该公司给了我不受监管的收集数据,并且有很多缺失的数据。大约一年的数据按开放日分组,所以我有260天的17列物理值。为了推断丢失的值,我尝试对去噪自动编码器建模,但效果不佳。为了训练模型,我只有113天的完整数据。这些值是实值,具有不同的单位和范围(有些在(100,150)范围内,有些在(90.03,90.35)范围内。)

要模拟噪声并像缺少动态效果一样,根本不是随机的,我在这种情况下修改了一个值(Random.random()

def DAE(train,l1,l2,num_layer):
    input_size = train.shape[1]
    #num_layer = 2
    theta = 1 #int(input_size/num_layer)
    code_size = input_size-theta*(num_layer+1)
    epochss=1000  
    lrr=0.01

    autoencoder = Sequential()
    autoencoder.add(Dense(input_size, input_shape=(input_size,), kernel_regularizer=regularizers.l2(0.01),
            activity_regularizer=regularizers.l1(0.01)))

    for index in range(num_layer):
        layer_size=input_size-(index+1)*theta
        autoencoder.add(Dense(layer_size,input_shape=(input_size,),activation='linear'))
        print(layer_size)

    autoencoder.add(Dense(code_size,activation='linear'))
    print(code_size) 

    for index in range(num_layer):
        layer_size=input_size-(num_layer-index)*theta
        autoencoder.add(Dense(layer_size,input_shape=(input_size,),activation='linear'))
        print(layer_size)

    autoencoder.add(Dense(input_size,activation='linear'))
    autoencoder.compile(Adam(lr=lrr), loss='mean_squared_error', metrics=['accuracy'])

    return autoencoder

autoencoder = DAE(AE_train,l1,l2,3)
history = autoencoder.fit(AE_train,AE_target,epochs=1000,validation_split=0.2)

在火车和测试损失图上,它确实快速收敛,但是经过一定时期后,它出现了一个很大的峰值,并随即出现了对数衰减。我不明白为什么会上升。

当我尝试预测缺失值时,我通过列均值来更改nan。该预测始终超出特定物理值的最大最小值范围。

这是我的问题,如何处理一小部分值中的缺失数据?在这里,我有不同类型的值(单位),我应该标准化这些值吗?但是,如果这样做的话,应该如何重构它们,因为我想推断出真正的价值。是否有比ML系列技术中的自动编码器更好的丢失数据插补解决方案?

感谢您阅读我的问题,甚至还给我带来了答案。

Loss plot for test and train sets

0 个答案:

没有答案