首页 文章

预测的测试用例数小于LSTM中的实际测试数据

提问于
浏览
0

我一直在尝试使用 LSTM Keras. 根据时间序列数据预测订单数量

我将样本数据与训练集分开包含282条记录,而测试集包含82条记录 . 我使用 look back window of 30 来预测测试数据的预测 .

但由于某种原因, predicted dataset contains only 40 记录与预期的测试数据中的71条记录相反 . 它背后的原因是什么?是导致问题的查找窗口?我觉得回头看窗户造成了这个问题 . 但我该如何纠正呢?

It is important to keep such a high look back window

def create_LSTM(trainX,testX,trainY,testY,look_back):
    model = Sequential()
    model.add(LSTM(6, input_shape=(1, look_back),activation= 'relu'))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='RMSProp')
    model.fit(trainX, trainY, epochs=300, batch_size=4, verbose=1)
    trainpredict = model.predict(trainX,batch_size=4)
    testpredict  = model.predict(testX,batch_size=4) 
    testpredict = np.array(testpredict).reshape(len(testpredict),1)      
    print(testpredict) 
    print(len(testpredict))
    return trainpredict,testpredict

我正在使用以下函数为LSTM创建导致实际问题的数据 . 我怎么能纠正它?

def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
    #for i in range(len(dataset)-look_back):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return np.array(dataX), np.array(dataY)

1 回答

  • 0

    create_dataset的问题

    当你得到ndarray的一个元素时,你会失去与该元素相关的等级 . 这是因为如果您对该单个元素感兴趣,那么您不需要保留维 1

    x = np.random.randn(4, 4)
    print(x, x.shape)
    array([[ 1.37938213, -0.10407424, -0.356567  , -1.5032779 ],
       [-0.53166922,  0.98204605, -0.62052479,  0.99265612],
       [ 0.23046477, -0.17742399,  0.38283412,  0.24104468],
       [-0.78093724,  1.06833765, -1.22112772, -0.78429717]])
    (4, 4)
    
    print(x[0:3, 0], x[0:3, 0].shape)
    array([ 1.37938213, -0.53166922,  0.23046477])
    (3,)
    

    因此,当您编写 a = dataset[i:(i + look_back), 0] 时,您将获取形状 (samples, features) 的数据集并获得一块形状 (look_back,) . 将所有a添加到 dataX 之后,它变成了形状 (samples, look_back) = (len(dataset) - look_back - 1, look_back) 的ndarray . 但是,LSTM期待形状 (samples, look_back, features) ,在您的情况下 (samples, look_back, 1) .

    如果将其更改为 a = dataset[i:(i + look_back)] ,则事情将开始起作用 . 但是,更好的解决方案是使用 TimeseriesGenerator

    from keras.preprocessing.sequence import TimeseriesGenerator
    
    batch_size = 4
    look_back = 1
    features = 1
    
    d = np.random.randn(364, features)
    train = TimeseriesGenerator(d, d,
                                length=look_back,
                                batch_size=batch_size,
                                end_index=282)
    test = TimeseriesGenerator(d, d,
                               length=look_back,
                               batch_size=batch_size,
                               start_index=282)
    
    model = Sequential()
    model.add(LSTM(6, input_shape=[look_back, features], activation='relu'))
    model.add(Dense(1))
    model.compile(loss='mse', optimizer='rmsprop')
    model.fit_generator(train, epochs=1, verbose=1)
    p_train = model.predict_generator(train)
    p_test = model.predict_generator(test)
    

    关于其他部分的进一步评论

    • model.add(LSTM(6, input_shape=(1, look_back),activation= 'relu')) - 输入形状应符合 (length, features) . 在这种情况下, length == features ,事情会有效 . 如果你想要更大的 look_back ,你需要将此代码更新为 input_shape=(look_back, 1) .

    • testpredict = np.array(testpredict).reshape(len(testpredict), 1) - 这是不必要的 . 如果您有一个输出 Model#predict 已输出 ndarray ,其形状已经是 (samples, output_units) = (len(testX), 1) .

    • LSTM(activation='relu') 在处理非常大的序列时通常会导致不稳定 . 将它留在 tanh 通常是个好主意 .

相关问题