Keras LSTM订单时间序列预测:测试集预测样本数不符问题排查
Hey,咱们一步步拆解这个问题——这绝对是用LSTM做时间序列预测时的高频坑,你不是一个人在踩!
首先得先理清楚「look back窗口」和预测结果数量的基础关系:当你设置look back=N时,对于长度为M的测试序列,理论上能生成的有效预测样本数是 M - N + 1。比如你说测试集有82条记录,look back=30的话,正常最多能得到 82-30+1=53 个预测结果,这和你预期的71就对不上,说明你先得重新核对自己预期数量的计算逻辑——是不是混淆了全量数据和测试集的长度?或者对look back的作用理解有偏差?
接下来分析为什么实际只得到40条结果,这几个方向你重点排查:
1. 测试集的实际长度可能和你以为的不一样
先别想复杂的,先直接打印测试集的长度确认:
print(len(test_data))
如果实际测试集只有69条,那 69-30+1=40,刚好和你得到的结果数匹配。这种情况大概率是划分训练集/测试集时的代码出了问题——比如索引写错、用了错误的比例划分,或者预处理时不小心截断了数据。
2. 预测逻辑的步长/循环次数设置错误
很多人会用「滚动预测」的方式:预测一个值后,把它加入输入序列,再预测下一个值。如果这里的循环次数写死成了40,而不是对应测试集需要预测的次数,就会只得到40个结果。比如正确的循环次数应该是 测试集长度 - look back(也就是82-30=52次),但如果代码里写成了range(40),那结果自然就少了。
举个典型的错误示例:
# 初始输入取测试集前30条 current_input = test_data[:30].reshape(1, 30, 1) predictions = [] # 这里循环次数写错成40了 for _ in range(40): pred = model.predict(current_input, verbose=0) predictions.append(pred[0][0]) # 更新输入序列 current_input = np.append(current_input[:,1:,:], [[pred[0][0]]], axis=1)
3. 测试样本生成时的截断或过滤
如果你用自定义函数生成测试输入序列(比如create_dataset这类函数),要检查函数里有没有对数据做额外的截断或过滤。比如有些人为了让训练集和测试集的归一化维度对齐,会刻意丢弃测试集末尾的部分数据,或者函数逻辑里误删了部分样本。你可以打印生成的X_test的行数:
print(X_test.shape[0])
这个数字应该和最终的预测结果数量完全一致,能帮你快速定位是样本生成环节出了问题。
最后回到你的疑问:look back window确实会直接影响预测结果的数量,但它不是导致「实际结果和预期不符」的核心原因——核心是你对预期数量的计算可能有误,同时测试数据的处理或预测逻辑存在上述某类错误。
内容的提问来源于stack exchange,提问作者niranjan272

