Python 如何使用当前的timestep功能培训LSTM?

Python 如何使用当前的timestep功能培训LSTM?,python,pandas,numpy,deep-learning,tensorflow2.0,Python,Pandas,Numpy,Deep Learning,Tensorflow2.0,我有一个时间序列数据集的训练数据集,如下所示: import numpy as np import pandas as pd train_df = pd.DataFrame(np.random.randint(0,100,size=(100, 16))) train_df.columns=['var1(t-3)','var2(t-3)','var3(t-3)','var4(t-3)','var1(t-2)','var2(t-2)','var3(t-2)','var4(t-2)','var1(t-

我有一个时间序列数据集的训练数据集,如下所示:

import numpy as np
import pandas as pd
train_df = pd.DataFrame(np.random.randint(0,100,size=(100, 16)))
train_df.columns=['var1(t-3)','var2(t-3)','var3(t-3)','var4(t-3)','var1(t-2)','var2(t-2)','var3(t-2)','var4(t-2)','var1(t-1)','var2(t-1)','var3(t-1)','var4(t-1)','var1(t)','var2(t)','var3(t)','var4(t)']
train_X=train_df.drop(['var1(t)'],axis=1)
train_y=train_df[['var1(t)']]
train_X=train_X.reshape(train_X.shape[0],1,train_X.shape[1])
train_y = train_y.reshape(train_y.shape[0],1)


train_X shape is (100, 1, 15)
train_y shape is (100,1)
正如你们在培训中看到的,我正在输入网络,包括所有4个变量的过去三个时间步和剩余三个变量的当前时间步,这三个变量构成了15个变量

我想在Keras中使用函数API的LSTM中对其进行培训,因为我不能在我的示例中使用顺序API。因此,我尝试了以下方法:

import tensorflow
from tensorflow.keras.utils import plot_model
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
visible = Input(shape=(100,15))
hidden1 = LSTM(10)(visible)
hidden2 = Dense(10, activation='relu')(hidden1)
output = Dense(1, activation='sigmoid')(hidden2)
model = Model(inputs=visible, outputs=output)
model.compile(loss='mae', optimizer='adam')


history = model.fit(train_X, train_y, batch_size=64, epochs=2, validation_split=0.2)
然后,我对列车进行改造,并进行如下测试:

import numpy as np
import pandas as pd
train_df = pd.DataFrame(np.random.randint(0,100,size=(100, 16)))
train_df.columns=['var1(t-3)','var2(t-3)','var3(t-3)','var4(t-3)','var1(t-2)','var2(t-2)','var3(t-2)','var4(t-2)','var1(t-1)','var2(t-1)','var3(t-1)','var4(t-1)','var1(t)','var2(t)','var3(t)','var4(t)']
train_X=train_df.drop(['var1(t)'],axis=1)
train_y=train_df[['var1(t)']]
train_X=train_X.reshape(train_X.shape[0],1,train_X.shape[1])
train_y = train_y.reshape(train_y.shape[0],1)


train_X shape is (100, 1, 15)
train_y shape is (100,1)
但这给出了一个非常大的MAPE和RMSE。所以我认为我的重塑是错误的


感谢您的帮助。

原始答案:

LSTM以3D形式接收输入,您正在传递一个2D输入,该输入解释了
ValueError
。您应该预处理数据,使其满足要求
[批处理、时间步、功能]
。您的数据应该以每行表示一个时间步的方式呈现

让我们用4个变量创建虚拟数据

train_df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)))
train_df.columns =['val1','val2','val3','val4']
train_df.head()
输出:

    val1  val2  val3  val4
t0    93    78    78    53
t1    38    30    48    39
t2    92    88    18     5
t3    56     8    36    59
t4    13     1    20    22
    val1   val2  val3   val1shift   val2shift   val3shift  target
t0    63    17    86       13.0       57.0       63.0      14
t1    13    57    63       85.0       20.0       60.0      62
t2    85    20    60       72.0        4.0       58.0      74
t3    72     4    58       70.0       22.0       25.0       6
t4    70    22    25       23.0       15.0       49.0      52
每行表示时间t的值。您需要回溯3个时间步来预测t=4时的
val1

现在我将对数据进行预处理,使其满足三维张量的要求。 我创建了一个函数,它将按如下方式进行预处理:

def create_time_series(data, time_steps, look_forward, target_col, n_features):

    x = []
    y = []
    
    for i in range(time_steps, len(data)):
        x.append(data[i-time_steps:i,:])
        y.append(data[i:i+look_forward, target_col])
    
    x, y = np.array(x), np.array(y)

    x = np.reshape(x, (x.shape[0], x.shape[1], n_features))
    y = np.reshape(y, (y.shape[0], y.shape[1]))

    return x, y

data = train_df.values 
time_steps = 3  #We want to use previous 3 values to predict the next value
look_forward = 1 #We want to predict 1 time step ahead.
target_col = 0 #Target column is the 1st column i.e (Val1).
n_features = 4 #We are using 4 features

x_train, y_train = create_time_series(data,time_steps,look_forward,target_col,n_features)
现在我们已经创建了3D张量,可以通过LSTM层了

visible = Input(shape=(x_train.shape[1],x_train.shape[2]))
hidden1 = LSTM(10)(visible)
hidden2 = Dense(10, activation='relu')(hidden1)
output = Dense(1, activation='sigmoid')(hidden2)
model = Model(inputs=visible, outputs=output)
model.compile(loss='mae', optimizer='adam')
model.fit(x_train, y_train, batch_size=64, epochs=2, validation_split=0.2)
希望这有帮助

编辑:

假设有3列具有特征,第4列包含目标值,则可以使用

train_df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)))
train_df.columns =['val1','val2','val3','target']
由于您希望传递3个特性
val1
val2
val3
及其在时间
t
的值,以预测时间
t
目标
值,因此您可以使用创建另外3个表示
val1
val2
val3
变化的特性

train_df['val1shift'] = train_df['val1'].shift(-1)
train_df['val2shift'] = train_df['val2'].shift(-1)
train_df['val3shift'] = train_df['val3'].shift(-1)
train_df = train_df[['val1',  'val2',  'val3', 'val1shift',  'val2shift',  'val3shift', 'target']]
输出:

    val1  val2  val3  val4
t0    93    78    78    53
t1    38    30    48    39
t2    92    88    18     5
t3    56     8    36    59
t4    13     1    20    22
    val1   val2  val3   val1shift   val2shift   val3shift  target
t0    63    17    86       13.0       57.0       63.0      14
t1    13    57    63       85.0       20.0       60.0      62
t2    85    20    60       72.0        4.0       58.0      74
t3    72     4    58       70.0       22.0       25.0       6
t4    70    22    25       23.0       15.0       49.0      52
现在,每行将包含时间
t
t+1
时的
val1
val2
val3
的值,或者您可以说时间
t-1
&时间
t

创建此数据帧后,您可以创建时间序列,该时间序列将使用

data = train_df.values 
time_steps = 3  #We want to use previous 3 values to predict the next value
look_forward = 1 #We want to predict 1 time step ahead.
target_col = 6 #Target column is the last column.
n_features = 7 #We are using 7 features

x_train, y_train = create_time_series(data,time_steps,look_forward,target_col,n_features)

你能在你的问题中添加
train\u X
train\u y
形状吗?我已经添加了它,并且可以从我的问题中复制出来。这还不能回答问题。问题是,我无法使用
t=t时的
val2,val3,val4
信息来预测t=t时的
val1
。您仍然在使用
t=(t-3)
t=(t-1)
中的值,而没有使用
val2,val3,val4
at
t=t
中的
,我给出了解决方案。如果您最初的问题是关于使用有关
val2、val3、val4的信息,那么您应该问两个问题。首先,您应该询问如何通过编辑原始问题来解决已删除的
值错误
。第二个问题是关于如何在
t=t
中使用
val2、val3、val4
信息的问题。很抱歉沟通错误。所以我的问题实际上是用15个变量(4个变量的3个时间滞后和当前的时间步长3个变量
val2,val3,val4
)来重塑,这就是为什么我将两者结合起来。