You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Keras结合LSTM神经网络预测时间序列未来值?

如何用Keras的LSTM模型预测时间序列未来值?

嘿,你已经搭好了LSTM的基础架子,接下来要实现时间序列的未来预测其实不难,核心就是把数据转换成模型需要的时序格式,再用滚动预测的方式生成未来值,我给你一步步理清楚:

一、先补全数据预处理的关键环节(你现有代码的缺失部分)

LSTM模型需要把原始时间序列转换成「输入序列-目标值」的配对格式,比如用前N天的需求数据,预测第N+1天的需求:

# 假设你已经读取了csv数据,提取需求列(这里示例取第0列)
demand_data = data_csv.iloc[:, 0].values.reshape(-1, 1)

# LSTM对数据尺度敏感,必须做标准化处理
scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(demand_data)

# 构建时序数据集:用前look_back天的数据作为输入,预测下一天的需求
def create_dataset(data, look_back=60):
    X, Y = [], []
    for i in range(len(data) - look_back):
        X.append(data[i:(i+look_back), 0])
        Y.append(data[i+look_back, 0])
    return np.array(X), np.array(Y)

# 这里设置用前60天预测下一天,可根据数据周期调整(比如周周期设7)
look_back = 60
X, y = create_dataset(scaled_data, look_back)

# 转换为LSTM要求的输入格式:[样本数, 时间步长, 特征数]
X = np.reshape(X, (X.shape[0], X.shape[1], 1))

二、完成LSTM模型的训练(补全你的模型定义)

# 构建完整的LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)))
model.add(Dropout(0.2))  # 防止过拟合
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=25))
model.add(Dense(units=1))  # 输出层:预测单值
model.add(Activation(linear))

# 编译并训练模型
model.compile(optimizer='adam', loss='mean_squared_error')
history = model.fit(X, y, batch_size=32, epochs=50, validation_split=0.1)

# 绘制损失曲线,监控训练效果
pyplot.plot(history.history['loss'], label='训练损失')
pyplot.plot(history.history['val_loss'], label='验证损失')
pyplot.legend()
pyplot.show()

三、核心:预测未来N个时间步的值

这里分两种常见场景:

1. 仅预测下一个时间步(比如次日需求)

# 取最后look_back天的数据作为输入序列
last_sequence = scaled_data[-look_back:]
last_sequence = np.reshape(last_sequence, (1, look_back, 1))

# 预测并反标准化,还原为真实需求尺度
next_pred_scaled = model.predict(last_sequence)
next_pred = scaler.inverse_transform(next_pred_scaled)
print(f"预测的下一日需求:{next_pred[0][0]}")

2. 滚动预测未来N天的值

比如要预测未来7天,每次把上一次的预测值加入输入序列,继续预测下一个值:

future_days = 7
predictions = []
current_sequence = scaled_data[-look_back:].copy()

for _ in range(future_days):
    # 调整为模型要求的输入形状
    input_seq = np.reshape(current_sequence, (1, look_back, 1))
    # 生成预测值(关闭verbose避免打印冗余信息)
    pred_scaled = model.predict(input_seq, verbose=0)
    # 反标准化得到真实值
    pred = scaler.inverse_transform(pred_scaled)
    predictions.append(pred[0][0])
    # 更新输入序列:去掉最旧的一天,加入新的预测值(需先标准化)
    current_sequence = np.append(current_sequence[1:], pred_scaled, axis=0)

print(f"未来{future_days}天的需求预测值:{predictions}")

几个关键注意点

  • look_back参数:可以根据数据的周期调整(比如周周期设7,月周期设30),也可以用网格搜索找最优值
  • 反标准化必须做:模型输出的是缩放后的值,一定要转回到原始数据尺度,否则结果没有业务意义
  • 防止过拟合:如果验证损失持续上升,要及时停止训练,或者调整Dropout比例、LSTM单元数
  • 模型调优:可以尝试双向LSTM(Bidirectional(LSTM(...)))、调整优化器或损失函数,提升预测精度

内容的提问来源于stack exchange,提问作者Nbenz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:56