如何在keras中将多个时间序列输入LSTM

时间:2019-07-19 02:08:24

标签: python keras classification lstm

我有大约1000个节点数据集,其中每个节点都有4个时间序列。每个时间序列正好是6个长度。标签是01(即二进制分类)。

更准确地说,我的数据集如下所示。

node, time-series1, time_series2, time_series_3, time_series4, Label
n1, [1.2, 2.5, 3.7, 4.2, 5.6, 8.8], [6.2, 5.5, 4.7, 3.2, 2.6, 1.8], …, 1
n2, [5.2, 4.5, 3.7, 2.2, 1.6, 0.8], [8.2, 7.5, 6.7, 5.2, 4.6, 1.8], …, 0
and so on.

因为我有时间序列,所以我认为它更像序列分类,其中大多数博客文章都使用LSTM。我以前从未使用过LSTM,这将是我的第一个keras应用程序。因此,我开始按如下方法使用最基本的sequential LSTM模板。

# create the model
model = Sequential()
model.add(Embedding(5000, 32, input_length=24))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

但是,我在理解如何使用embedding层向LSTM输入四个时间序列方面遇到困难。我可以使用四个embedding层还是有其他方法可以解决此问题?

很高兴在需要时提供更多详细信息。

2 个答案:

答案 0 :(得分:2)

您可以将每个节点内的每个序列视为一个单独的通道。因此,首先将数据重塑为n_samples(我认为您正在调用此节点),n_steps和n_channel。有了数据集n_steps=6n_channel=4。基本上,您将为每个样本(节点)堆叠不同的时间序列数据。

然后,您可以创建LSTM模型。像这样:

model = Sequential()
model.add(LSTM(64, input_shape=(6, 4), activation='sigmoid'))
model.add(Dense(1))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

请注意,您可以使用LSTM进行不同的激活,并且不一定需要密集层。但是密集层是一个附加的非线性层,可能会提高性能。

您还可以堆叠LSTM层以获得更复杂的模型,如下所示:

model = Sequential()
model.add(LSTM(64, input_shape=(6, 4), return_sequences=True))
model.add(LSTM(1, input_shape=(6, 4)))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

答案 1 :(得分:2)

有几种方法可以构造此结构。首先,我可能会把4个序列展平为24个数字的数组,并使用密集层

totalcost+=isNaN(rows[0].Totalcost[i])?0:rows[0].Totalcost[i]

您可能有4个单独的输入,分别使用from keras.models import Sequential from keras.layers import Dense model = Sequential() model.add(Dense(32, input_shape=24)) model.add(Dense(32)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print(data.shape) # (1000, 24) model.fit(data, target) 层处理4个系列。但是您需要使用功能性API。例如

LSTM

或者,如果数据的格式为input1 = Input(shape=(6,1)) x1 = LSTM(10)(input1) input2 = Input(shape=(6,1)) x2 = LSTM(10)(input2) input3 = Input(shape=(6,1)) x3 = LSTM(10)(input3) input4 = Input(shape=(6,1)) x4 = LSTM(10)(input4) x = concatenate([x1,x2,x3,x4]) x = Drouput(0.2)(x) x = Dense(40)(x) x = Drouput(0.2)(x) output = Dense(1, activation='sigmoid')(x) model = Model(inputs=[input1,input2,input3,input4], outputs=output) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) print(data1.shape) #(1000,6,1) model.fit([data1,data2,data3,data4], target) ,则可以使用一个LSTM并将每个系列视为一个单独的特征

(1000, 6, 4)

或者您可以使用CNN代替RNN。

model = Sequential()
model.add(LSTM(10, input_shape=(6,4)))
model.add(Dense(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

print(data.shape) # (1000, 6, 4)
model.fit(data, target)