我正在建模一个LSTM模型,该模型包含多个功能和一个目标值。这是一个回归问题。 我怀疑我为LSTM准备的数据是错误的;主要是因为该模型只学习目标值的平均值。
我编写的以下代码用于为LSTM准备数据:
# df is a pandas data frame that contains the feature columns (f1 to f5) and the target value named 'target'
# all columns of the df are time series data (including the 'target')
# seq_length is the sequence length
def prepare_data_multiple_feature(df):
X = []
y = []
for x in range(len(df)):
start_id = x
end_id = x + seq_length
one_data_point = []
if end_id + 1 <= len(df):
# prepare X
for col in ['f1', 'f2', 'f3', 'f4', 'f5']:
one_data_point.append(np.array(df[col].values[start_id:end_id]))
X.append(np.array(one_data_point))
# prepare y
y.append(np.array(df['target'].values[end_id ]))
assert len(y) == len(X)
return X, y
然后,我将数据重塑如下:
X, y = prepare_data_multiple_feature(df)
X = X.reshape((len(X), seq_length, 5)) #5 is the number of features, i.e., f1 to f5
我的数据准备方法和数据重塑是否正确?
答案 0 :(得分:1)
如@ isp-zax所述,请提供reprex,以便我们重现结果并查看问题出在哪里。
顺便说一句,您可以使用for col in df.columns
而不是列出所有列名,并且(次要优化)应该执行第一个循环for x in range(len(df) - seq_length)
,否则最后请执行循环{{1 }}很多次却没有实际处理任何数据。另外,seq_length - 1
将不会在索引df.values[a, b]
处包含该元素,因此,如果您要在b
的最后一行中包含“窗口”,则X
可以等于end_id
,即,您可以为len(df)
执行内部条件(准备和追加)
除此之外,如果您不同时使用if end_id <= len(df):
,即同时跨列和行将数据帧切片,则我认为它更容易阅读。
要选择没有(最后一个)目标列的one_data_point
行,只需执行以下操作:
seq_length