为何直接用训练测试数据拟合LSTM模型比TimeseriesGenerator精度更高?
我在构建时间序列预测模型时发现,直接使用x_train和y_train拟合模型的输出精度远高于使用TimeseriesGenerator生成的训练/测试生成器的方式。具体实验结果:
- 直接拟合的RMSE:6.3454423
- 生成器拟合的RMSE:13.4363478
相关代码
数据拆分代码
x_train, x_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=123, shuffle=False)
生成器创建代码
train_generator = TimeseriesGenerator(x_train, y_train, length= win_length, sampling_rate=1, batch_size=batch_size) test_generator = TimeseriesGenerator(x_test, y_test, length= win_length, sampling_rate=1, batch_size=batch_size)
直接拟合模型代码
# Fitting the model model.fit(x_train, y_train, batch_size= 16, epochs = 34, shuffle = False)
生成器拟合模型代码
model.fit_generator(train_generator, epochs = 34, validation_data = test_generator, shuffle= False)
精度差异的核心原因
输入维度与模型结构不匹配
直接拟合时,模型接收的是原始特征维度的数据(比如形状(num_samples, n_features));而TimeseriesGenerator会将输入转换为滑动窗口格式,输出的每个batch形状为(batch_size, win_length, n_features)。如果你的模型输入层是针对原始特征设计的(比如没有处理时间步的Dense层),生成器的输入维度会完全不符合模型预期,导致模型无法正确学习特征模式,精度暴跌。训练样本量与分布的差异
TimeseriesGenerator生成的有效训练样本数为len(x_train) - win_length,比直接拟合的全量样本少了win_length个。如果win_length数值较大,训练数据集规模会大幅缩减,模型学习的信息不足。此外,滑动窗口会让每个原始样本(除前win_length个)被包含在多个窗口中,样本分布和独立性发生变化,在shuffle=False的情况下,这种顺序性的重复采样可能让模型学习到错误的时间依赖关系。验证集的评估逻辑完全不同
直接拟合后,你用x_test和y_test计算的是每个测试样本对应标签的预测误差;而test_generator生成的验证样本,是基于x_test的滑动窗口,预测的是每个窗口之后的下一个y值。这两种RMSE的计算对象完全不一样——前者是单样本预测,后者是基于历史窗口的下一步预测,后者的任务难度本身更高,误差自然更大。batch_size与训练过程的差异
直接拟合用的batch_size=16,而生成器使用的batch_size变量如果和16不同,会影响权重更新的频率和稳定性。比如batch_size过大时,权重更新次数减少,学习效率降低;过小时,更新噪声大,模型收敛不稳定。另外,生成器的batch生成逻辑和直接输入的batch拆分逻辑不同,每个epoch内模型看到的样本顺序或重复次数有差异,也会影响最终收敛效果。
内容的提问来源于stack exchange,提问作者Krunal Jani

