LSTM模型损失异常且预测值恒定的技术求助
问题:LSTM模型预测结果全为恒定值
数据集与预处理代码
数据集包含597515行、31列,用于测量单个变量,输入形状为(31,1),预处理代码如下:
import pandas as pd import tensorflow as tf gpu_devices = tf.config.experimental.list_physical_devices("GPU") for device in gpu_devices: tf.config.experimental.set_memory_growth(device, True) raw_dataset = pd.read_csv('data.csv').drop(columns=['Unnamed: 0']) train_set = raw_dataset.sample(frac=0.8, random_state=42) test_set = raw_dataset.drop(train_set.index) import numpy as np train_features = train_set.copy() test_features = test_set.copy() train_labels = train_features.pop('T+1') test_labels = test_features.pop('T+1') train_features = train_features.to_numpy().reshape(train_features.shape[0], 31, 1) test_features = test_features.to_numpy().reshape(test_features.shape[0], 31, 1)
模型结构(Optuna调参)
模型参数由Optuna确定,但不同配置均出现相同现象,仅恒定值有差异:
model = tf.keras.Sequential() model.add(tf.keras.layers.LSTM(11,return_sequences=True)) model.add(tf.keras.layers.LSTM(4, return_sequences=True)) model.add(tf.keras.layers.LSTM(13, return_sequences=False)) model.add(tf.keras.layers.Dense(1)) model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0940840143887362), loss=tf.keras.losses.MeanAbsoluteError(), metrics=['mae', 'mse'] ) history = model.fit(train_features, train_labels, validation_split=0.2, batch_size=65536, epochs=100, verbose=True )
问题现象
训练损失图:

预测结果全部为恒定值:
array([[-9.407474], [-9.407474], [-9.407474], ..., [-9.407474], [-9.407474], [-9.407474]], dtype=float32)
- 前50个测试标签与预测值对比图:

解决建议
1. 补充数据归一化/标准化
LSTM对数据尺度极度敏感,未归一化的特征会让模型极易陷入局部最优,直接输出标签均值这类恒定值。建议用标准化工具处理特征和标签:
from sklearn.preprocessing import StandardScaler # 特征归一化(训练集拟合,测试集复用参数) scaler_feat = StandardScaler() train_feat_scaled = scaler_feat.fit_transform(train_features.reshape(-1, 31)).reshape(-1, 31, 1) test_feat_scaled = scaler_feat.transform(test_features.reshape(-1, 31)).reshape(-1, 31, 1) # 标签归一化(回归任务需还原时用逆变换) scaler_label = StandardScaler() train_label_scaled = scaler_label.fit_transform(train_labels.values.reshape(-1,1))
训练时使用归一化后的数据,预测后通过scaler_label.inverse_transform()还原真实值。
2. 降低学习率
当前学习率0.094远高于Adam默认的0.001,过大的学习率会导致参数更新幅度过大,模型无法收敛到有效解,直接输出恒定值。先把学习率降到0.001,再根据训练曲线微调。
3. 缩小批量大小
65536的batch_size过大,会导致梯度估计偏差严重,模型难以捕捉数据中的模式,最终收敛到最简单的恒定输出。先尝试将batch_size调整到256或512,观察训练过程的损失变化。
4. 简化模型结构
三层LSTM叠加容易引发梯度消失,尤其是中间层仅4个单元的配置。先尝试简化结构:
- 只用一层LSTM(比如32个单元)测试效果
- 在LSTM层后添加
tf.keras.layers.Dropout(0.2)抑制过拟合
5. 检查标签分布
查看训练集标签T+1的统计信息:
print(train_labels.describe())
如果标签本身集中在-9.4左右,模型会直接输出均值来最小化MAE损失,这种情况需要重新审视任务合理性或数据预处理逻辑。
内容的提问来源于stack exchange,提问作者mospira
相关产品推荐
相关产品推荐

