Python Keras LSTM收敛于数据集#x27;s均值

Python Keras LSTM收敛于数据集#x27;s均值,python,tensorflow,keras,lstm,Python,Tensorflow,Keras,Lstm,数据片段: [1,0.52916667 0.55,0.5375 0.55714286 0.54285714 0.09395973] [0,0.59285714 0.55,0.5,0.53076923 0.5,0.09395973] [0,0.53076923 0.5375 0,0.5375 0.5,0.08277405] [0,0.55625 0.55833333 1,0.538889 0.52777778 0.08137584] [1,0.5222222 0.52857143 0.54,0.5

数据片段:

[1,0.52916667 0.55,0.5375 0.55714286 0.54285714 0.09395973]

[0,0.59285714 0.55,0.5,0.53076923 0.5,0.09395973]

[0,0.53076923 0.5375 0,0.5375 0.5,0.08277405]

[0,0.55625 0.55833333 1,0.538889 0.52777778 0.08137584]

[1,0.5222222 0.52857143 0.54,0.55,0.55,0.10834132]

[1,0.6875 0.6125 0.575 0.53,0.52,0.09395973]

[0,0.55666667 0.55,0.55833333 0.52647059 0.52058824 0.08137584]

[0,0.53529412 0.5,0.5,0.5,0.5,0.025177]

[0,0.5208333 1,1,0.54,0.58,0.34563758]

[0,0.55,0.6,0.5,0.58,0.5,0.09395973]

[0,0.67,0.5,0,0.5,0.5,0.07957814]

[0,0.51764706 1,1,0.54166667 0.55,0.16107383]

此timeseries数据帧中的每一行包含7个特性,我试图预测下一时间步的第一个特性是1还是0

为了实现这一点,我将所有内容向前移动了一步来创建标签,如下所示:

def windows(data):
    x_window_size = 100
    y_window_size = 1
    dataX, dataY = [], []

    for i in range(len(data)-x_window_size-y_window_size):
        x_window_data = data[i:(i+x_window_size)]
        y_window_data = [data[(i + x_window_size + y_window_size)]]
        dataX.append(x_window_data)
        y = [x[0] for x in y_window_data]
        dataY.append(y)

    return np.array(dataX), np.array(dataY)
模型:

inputs = Input(shape=(100, 7))

x = CuDNNLSTM(128, return_sequences=True)(inputs)
x = Dropout(0.2)(x)
x = CuDNNLSTM(128, return_sequences=True)(x)
x = Dropout(0.2)(x)
x = CuDNNLSTM(128)(x)
x = Dropout(0.2)(x)
predictions = Dense(1, activation='linear')(x)

model = Model(inputs=inputs, outputs=predictions)

optimiser = keras.optimizers.Nadam(lr=0.01)
model.compile(
    loss="mse",
    optimizer=optimiser
    )
如果我在模型中运行10000行数据,在10个纪元之后,我会得到以下结果:

看起来不错。。。但我的数据集实际上是400万行。当我通过训练运行400万行时,它只预测Y值的平均值(0.5):


经过1或10个时代后,结果是相同的。我不知道这里发生了什么。有什么想法吗?

首先,有很多不同的方法,为什么会这样

  • 在过去,我也遇到过类似的问题,输出也只是平均值。我在那里从事股票价格预测工作。对于机器学习算法来说,从股票信息中提取有意义的信息是非常困难的,这就是为什么它开始预测随机结果,或者像你的例子一样预测平均值。这可能是一个模型(在预测股票价格时)能得到的最好的结果,因为股票价格也会随机地上下波动。不幸的是,在这种情况下,你无能为力

  • 第二种情况是数据太少。尽管您有400万行数据,但这有时不足以概括问题,您仍然需要获得更多数据

  • 这是最有可能的情况。您的模型架构是错误的。您的真实数据是0或1,因此它应该是一个分类问题。将模型体系结构更改为以下内容:

  • 您仍然需要进行微调,我还没有对此进行测试

    x = CuDNNLSTM(128)(inputs)
    x = Dropout(0.5)(x)
    predictions = Dense(1, kernel_initializer='normal', activation='sigmoid')(x)
    
    model.compile(loss='binary_crossentropy', optimizer='adam')
    
    另外,您的模型可能仍然有太多的噪音。您可以尝试图层为64-64-1的模型,而不是128-128-128的模型,甚至可以尝试图层为32-1的模型。您还可以调整掉图层,使其类似于0.3、0.4、0.5甚至更多。如果你的模型有太多的噪音,那么它只是尝试和错误,试图把噪音出来

    资源:


    你期望结果是什么?我试图预测下一个时间步为1或0的概率,因此我期望预测值在1和0之间,变化很大。因此,0.4、0.2、0.7等预测是可以预期的。