Keras LSTM收敛于数据集的均值

时间:2018-01-06 17:14:02

标签: 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.53888889 0.52777778 0.08137584]

     

[1.,0.52222222 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.02205177]

     

[0,0.52083333 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,0.5,0.5,0.07957814]

     

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

此时间序列数据框中的每一行包含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
    )

如果我通过模型运行10,000行数据,在10个时期之后我会得到以下结果:

enter image description here

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

enter image description here

在1或10个时期后结果相同。我无法弄清楚这里发生了什么。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

  2. 第二种情况是您的数据太少。虽然您有400万行数据,但这有时不足以概括问题而您仍需要获取更多数据。

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

  4. 你仍然需要进行微调,我还没有测试过。

    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。您也可以将Dropout图层调整为0.3,0.4,0.5甚至更多。如果你的模型有很多噪音,那就是尝试和错误,试图消除噪音。

    资源:

    Machine Learning Mastery

    Binary Classification