LSTM股票预测性能计算及预测结果绘制问题咨询
问题根因
你遇到的维度不匹配问题核心是输出层维度设置错误,同时流程里还有另外几处会影响预测效果的错误,修正方案如下:
1. 输出层维度错误
你当前定义Dense层时用了Dense(X_train.shape[1]),而X_train的第二维是时间步长n_steps=10,所以模型会输出10个值,自然和shape为(998,1)的y_test不匹配。你做的是单步预测,只需要输出下1个时间步的收盘价,所以这里改成Dense(1)即可。
2. 测试集归一化逻辑错误
你对测试集调用了scaler.fit_transform(df_test),相当于用测试集的分布重新训练了归一化器,这属于数据泄露,会导致评估结果虚高。正确做法是只在训练集上fit归一化器,测试集直接用训练好的scaler做transform:
# 修正后的归一化代码 from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(0, 1)) df_train_scaled = scaler.fit_transform(df_train) df_test_scaled = scaler.transform(df_test) # 此处不要重新fit
3. 反归一化步骤变量名错误
你代码里写的predict_test=scaler.inverse_transform(forecast_test),但前面生成的预测结果变量名是predict_test,没有forecast_test这个变量,直接运行会报变量未定义错误,替换为predict_test即可。
4. 可选优化:LSTM激活函数适配
默认的LSTM激活函数是tanh,比relu更适合时序任务,你可以去掉activation='relu'的参数设置,用默认值会获得更稳定的训练效果。
修正后的核心代码
模型结构部分
model = Sequential() model.add(LSTM(50, return_sequences=True)) model.add(Dropout(0.2)) model.add(LSTM(50, return_sequences=False)) model.add(Dense(1)) # 输出维度改为1 model.compile(optimizer='adam', loss='mse')
反归一化部分
y_test = scaler.inverse_transform(y_test) predict_test = scaler.inverse_transform(predict_test) # 修正变量名
修正后predict_test的shape就会变成(998,1),和y_test维度完全匹配,可以正常计算MSE、绘制对比曲线。
内容的提问来源于stack exchange,提问作者Lachlan Sweet
相关产品推荐
相关产品推荐

