使用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




