【问题标题】:How to train LSTM with current timestep feature also?如何用当前时间步长特征训练 LSTM?
【发布时间】:2020-07-06 06:04:27
【问题描述】:

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

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)']]

因此,正如您在训练中看到的那样,我正在输入网络,其中包含所有 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)

然后我重塑火车并进行如下测试:

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。所以我认为我的重塑在这里是错误的。

感谢任何帮助。

【问题讨论】:

  • 您可以在问题中添加train_X 和train_y 形状吗?
  • 我已经添加了它,它也可以从我的问题中重现。

标签: python pandas numpy deep-learning tensorflow2.0


【解决方案1】:

原答案:

LSTM 接受 3D 输入,而您传递的 2D 输入解释了ValueError。您应该预处理您的数据,使其满足[batch, timesteps, feature] 的要求。您的数据应该以每行代表一个时间步长的方式呈现。

让我们用 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

每一行代表时间 t 的值。您想回顾 3 个时间步来预测 t=4 时的 val1。

现在我将对满足 3D 张量要求的数据进行预处理。 我创建了一个函数,可以按如下方式进行预处理:

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']

由于您想通过 val1、val2 和 val3 以及它们在时间 t 的值来预测 target 在时间 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   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

现在每一行将包含val1、val2 和val3 的值,时间为t 和t+1,或者你可以说时间t-1 和时间t。

创建此数据框后,您可以创建将使用传递给 LSTM 的时间序列

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)

【讨论】:

  • 这还没有回答问题。问题是我无法使用t=t 处的val2,val3,val4 的信息来预测t=t 处的val1。您仍在使用t=(t-3) 和t=(t-1) 的值,而不是使用val2,val3,val4在t=t
  • 在您询问尺寸错误的原始帖子中,我给出了解决方案。如果您最初的问题是关于使用有关 val2,val3,val4 的信息,那么您应该问 2 个问题。首先,您应该询问如何解决您已通过编辑原始问题删除的Value Error。第二个问题应该是关于如何在t=t使用val2,val3,val4的信息。
  • 很抱歉给您带来了误会。所以我的问题实际上是用 15 个变量(4 个变量的 3 个时间滞后和当前时间步 3 个变量 val2,val3,val4)重塑,所以这就是我将两者结合起来的原因。
猜你喜欢
  • 2022-01-24
  • 2017-12-08
  • 2021-10-20
  • 2018-08-28
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多