我有大约1000个节点数据集,其中每个节点都有4个时间序列。每个时间序列正好是6个长度。标签是0
或1
(即二进制分类)。
更准确地说,我的数据集如下所示。
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
层还是有其他方法可以解决此问题?
很高兴在需要时提供更多详细信息。
答案 0 :(得分:2)
您可以将每个节点内的每个序列视为一个单独的通道。因此,首先将数据重塑为n_samples(我认为您正在调用此节点),n_steps和n_channel。有了数据集n_steps=6
和n_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)