You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用windowed dataset进行时间序列未来值预测方法咨询(附Colab Notebook参考)

嘿,作为机器学习新手碰到时间序列预测确实容易懵——别慌,我一步步带你用Windowed Dataset在Colab里实现3650步之后的未来数据预测,全程都是可直接运行的代码和易懂的逻辑!

用Windowed Dataset实现时间序列未来预测(Colab实战版)

第一步:准备环境与数据

先在Colab里导入必备工具库,再加载你的3650步时间序列数据。假设你的数据是CSV格式(比如有一列叫value的时序数据),如果是本地文件可以直接在Colab里上传:

import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler  # 数据归一化用,新手必备

# 上传本地数据(Colab专属操作)
from google.colab import files
uploaded = files.upload()

# 加载数据并提取时序列
df = pd.read_csv(list(uploaded.keys())[0])
time_series = df['value'].values.reshape(-1, 1)  # 转成二维数组方便归一化

# 数据归一化(避免数值范围太大影响模型训练)
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_series = scaler.fit_transform(time_series).flatten()

第二步:构建核心的Windowed Dataset

Windowed Dataset的本质是把时序数据切成一个个「输入窗口+预测目标」的样本:用前N步数据(输入窗口)预测后M步未来值。先定义关键参数,再写创建函数:

def create_windowed_dataset(series, window_size, forecast_steps, batch_size, shuffle_buffer):
    # 将时序数据转为TensorFlow数据集
    dataset = tf.data.Dataset.from_tensor_slices(series)
    # 切分窗口:每个窗口包含「输入窗口长度+要预测的步数」个数据点
    dataset = dataset.window(window_size + forecast_steps, shift=1, drop_remainder=True)
    # 把窗口转为张量格式
    dataset = dataset.flat_map(lambda window: window.batch(window_size + forecast_steps))
    # 打乱数据(避免模型学到顺序偏差)
    dataset = dataset.shuffle(shuffle_buffer)
    # 拆分输入特征(前window_size步)和预测标签(后forecast_steps步)
    dataset = dataset.map(lambda window: (window[:-forecast_steps], window[-forecast_steps:]))
    # 批量处理+预取优化(加速训练)
    dataset = dataset.batch(batch_size).prefetch(tf.data.AUTOTUNE)
    return dataset

# 设置参数(新手可以先按这个来,之后再调整)
WINDOW_SIZE = 60       # 用过去60步数据做输入
FORECAST_STEPS = 30    # 预测未来30步
BATCH_SIZE = 32
SHUFFLE_BUFFER = 1000

# 用你的3650步数据创建训练数据集
train_dataset = create_windowed_dataset(scaled_series, WINDOW_SIZE, FORECAST_STEPS, BATCH_SIZE, SHUFFLE_BUFFER)

第三步:搭建简单易上手的预测模型

作为新手,先从轻量的LSTM模型开始(时序任务里LSTM是入门首选):

model = tf.keras.Sequential([
    # 给输入加一个维度,适配LSTM的输入格式:(batch_size, window_size, 1)
    tf.keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=-1), input_shape=[WINDOW_SIZE]),
    tf.keras.layers.LSTM(64, return_sequences=True),
    tf.keras.layers.LSTM(32),
    # 输出层:对应要预测的未来步数
    tf.keras.layers.Dense(FORECAST_STEPS)
])

# 编译模型(损失函数选MSE,优化器用Adam是通用操作)
model.compile(loss=tf.keras.losses.MeanSquaredError(),
              optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
              metrics=['mae'])  # 用MAE评估预测误差

# 查看模型结构
model.summary()

第四步:训练模型(记得开Colab的GPU加速!)

在Colab顶部菜单栏选「代码执行程序」→「更改运行时类型」→ 硬件加速器选「GPU」,这样训练会快很多:

# 开始训练,新手先跑20个epoch看看效果
history = model.fit(train_dataset, epochs=20)

# 可视化训练过程中的损失变化,判断模型是否收敛
plt.figure(figsize=(10, 4))
plt.plot(history.history['loss'], label='训练损失(MSE)')
plt.plot(history.history['mae'], label='平均绝对误差(MAE)')
plt.xlabel('Epoch')
plt.legend()
plt.show()

第五步:用训练好的模型预测未来30步

用你3650步数据的最后一个窗口,预测后续的FORECAST_STEPS步数据:

# 获取最后一个输入窗口(3650 - WINDOW_SIZE 到 3650步的数据)
last_window = scaled_series[-WINDOW_SIZE:]
# 转为模型需要的输入形状:(1, WINDOW_SIZE)
last_window = tf.expand_dims(last_window, axis=0)

# 预测未来数据
scaled_forecast = model.predict(last_window)[0]
# 反归一化,还原成真实数据范围
real_forecast = scaler.inverse_transform(scaled_forecast.reshape(-1, 1)).flatten()

# 可视化结果:原始数据+预测数据
plt.figure(figsize=(14, 6))
# 画原始数据的最后100步
plt.plot(range(3650-100, 3650), time_series[3650-100:], label='原始时序数据')
# 画预测的未来30步
plt.plot(range(3650, 3650+FORECAST_STEPS), real_forecast, label='预测未来数据', color='firebrick', linestyle='--')
plt.xlabel('Time Steps')
plt.legend()
plt.title('3650步后时间序列预测结果')
plt.show()

新手进阶小贴士

  • 调整参数:如果预测效果不好,可以试试增大WINDOW_SIZE(比如改成90),或者调整模型的LSTM单元数
  • 多步预测迭代:如果要预测更远的未来(比如超过30步),可以把第一次预测的结果拼到原始数据末尾,再用新的窗口继续预测
  • 尝试其他模型:比如用Conv1D+LSTM的组合,或者简单的全连接模型,对比哪个效果更好

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

火山引擎 最新活动