我通过LSTM网络传递的数据不平衡。
这是我的代码的一部分:
weights = class_weight.compute_class_weight('balanced',np.unique(trainY),trainY)
print (weights)
model = Sequential()
model.add(LSTM(64, input_shape=(look_back, trainX.shape[2]), recurrent_dropout=0.3, return_sequences=True)) #
model.add(Dropout(0.3))
model.add(LSTM(32, recurrent_dropout=0.3))
model.add(Dense(1, activation='sigmoid'))
print (model.summary())
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])
model.fit(trainX, trainY, validation_data=(validX, validY), epochs=100, batch_size=16, class_weight=weights, verbose=1 , callbacks=callbacks_list, shuffle=True)
[0.6147541 2.67857143]
的重量不平衡。
但是,当我打印混乱矩阵(每组)时,我只能得到0
的预测。
如何整理我的数据。实际上,LSTM输入中的每个2-D序列的大小为(time_step, features)
,对吗?在这里,我使用1的time_step
(并且features
= 22,没关系)。因此,这就像我一次一次提取时间序列的每个样本一样。
当我将time_step
增加到5左右时,它的工作效果稍好一些,但我仍然得到了很高的“假0”值(0是最大的表示类),尽管几层MLP可以很好地工作参数class_weight
可以很好地处理相同的数据。我对LSTM做错了吗?
以下是构建序列的方式:look_back
是瞬间滑动窗口的大小,该滑动窗口的中心是我当前采取的当前时间步,并且窗口重叠:
def create_dataset(feat,targ, look_back=2):
semi_window=math.floor(look_back/2)
dataX, dataY = [], []
for i in range(semi_window,len(targ)-semi_window):
a = feat[i-semi_window:(i+semi_window+1), :]
dataX.append(a)
dataY.append(targ[i])
return np.array(dataX), np.array(dataY)
我真的在等待帮助,因为它似乎可以在简单的MLP下提供性能,而它是用来学习时间序列的时间依赖性的。