楼主: 狗豆子
157 0

[其他] 深度学习时间序列预测全攻略:从基线到LSTM实战 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-4-16
最后登录
2018-4-16

楼主
狗豆子 发表于 2025-12-5 19:47:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

深度学习在时间序列预测中的应用:从基础方法到LSTM实战

引言:时间序列预测的挑战与潜力

时间序列数据广泛存在于现实世界中,例如股票价格波动、气温变化、电力消耗以及网站访问量等。这些数据以时间顺序记录,蕴含着潜在的时间依赖性和周期性规律。 本文将围绕一个具体的气温预测任务展开,系统介绍时间序列预测的全流程——从最简单的基准模型开始,逐步过渡到使用LSTM等深度学习方法进行建模与优化。

数据说明:德国耶拿气象站观测数据

我们采用的是德国耶拿气象站于2009年至2016年期间采集的气象数据,具体信息如下:
  • 时间范围:2009年1月1日 至 2016年12月31日
  • 采样频率:每10分钟记录一次
  • 特征数量:共14个气象变量(包括温度、气压、湿度、风速等)
  • 总样本数:420,451个时间点
  • 预测目标:利用过去5天的历史数据,预测未来24小时后的气温值
该任务不仅具有实际意义,也适合用于展示时序建模的关键技术环节。

数据探索与可视化分析

首先对数据集进行初步查看和趋势分析:
print("表头:", header)
print("数据行数:", len(lines))
print("数据形状:", raw_data.shape)
接着绘制长期和短期的温度变化曲线:
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(range(len(temperature)), temperature)
plt.title("8年温度变化趋势")
plt.xlabel('时间点')
plt.ylabel('温度(℃)')
[此处为图片1]
plt.subplot(1, 2, 2)
plt.plot(range(1440), temperature[:1440])
plt.title("前10天温度变化")
plt.xlabel('时间点(10分钟间隔)')
plt.ylabel('温度(℃)')
plt.tight_layout()
plt.show()
通过图像可以观察到以下特征:
  • 年度周期性明显:每年气温呈现规律性的高低起伏
  • 日周期性存在:每日昼夜温差形成稳定波动模式
  • 短期波动复杂:在小时级别上,受天气系统影响较大,难以直接预测

关键预处理步骤详解

1. 数据划分策略

由于是时间序列问题,必须严格按照时间先后顺序进行切分,避免引入未来信息泄露。因此采用如下方式:
num_train_samples = int(0.5 * len(raw_data))
num_val_samples = int(0.25 * len(raw_data))
num_test_samples = len(raw_data) - num_train_samples - num_val_samples
即:
  • 训练集:前50%
  • 验证集:中间25%
  • 测试集:最后25%
核心原则:严禁随机打乱时间序列数据!

2. 数据标准化处理

为提升模型训练稳定性,使用训练集的均值和标准差对所有数据进行归一化:
mean = raw_data[:num_train_samples].mean(axis=0)
raw_data -= mean
std = raw_data[:num_train_samples].std(axis=0)
raw_data /= std
此操作确保各特征处于相近的数量级,有利于梯度优化过程。

3. 构造时间序列输入样本

设定关键参数以生成滑动窗口数据:
  • sampling_rate = 6:每6个原始记录取一个点,相当于每小时一个数据点
  • sequence_length = 120:每次输入模型的序列长度为120个时间步(即5天)
  • delay:目标输出相对于输入序列末尾的偏移量,设为对应24小时后
使用Keras内置工具创建批处理数据集:
train_dataset = keras.utils.timeseries_dataset_from_array(
    raw_data[:-delay],
    targets=temperature[delay:],
    sampling_rate=sampling_rate,
    sequence_length=sequence_length,
    shuffle=True,
    batch_size=256
)
注意:虽然允许在训练集中轻微打乱批次顺序,但每个序列内部的时间顺序不可更改。

构建基准模型:简单却有效的起点

在尝试复杂模型之前,建立一个合理的性能基线至关重要。这里我们实现一个朴素预测法:
def evaluate_naive_method():
    """预测24小时后的温度等于当前时刻温度"""
    batch_maes = []
    for samples, targets in test_dataset:
        preds = samples[:, -1, 1] * std[1] + mean[1]  # 取最后一个时间点的原始温度值
        mae = np.mean(np.abs(preds - targets))
        batch_maes.append(mae)
    print(f"基准方法MAE: {np.mean(batch_maes):.2f}℃")
运行结果显示,该方法在测试集上的平均绝对误差(MAE)为 2.62℃。这一结果将成为后续模型改进的参照标准。

尝试传统机器学习模型

1. 全连接神经网络(Dense Network)

作为首次引入可学习参数的模型,构建一个简单的密集连接网络:
def build_dense_model():
    """搭建基础全连接网络结构"""
该模型将展平输入序列并送入若干全连接层,用以捕捉非线性关系。尽管结构简单,但其表现通常优于纯启发式方法,并为后续更高级模型提供对比依据。 [此处为图片2]

import os
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

模型构建与性能分析

1. 全连接网络(Dense Network)

使用简单的全连接结构对时间序列数据进行建模:


def build_dense_model():
    inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
    x = layers.Flatten()(inputs)  # 展平时间维度
    x = layers.Dense(16, activation="relu")(x)
    outputs = layers.Dense(1)(x)  # 回归输出,无激活函数
    return keras.Model(inputs, outputs)

表现:验证集上的MAE约为2.44℃,与基准方法相当。这表明该模型未能有效捕捉时间序列中的动态依赖关系,因其忽略了输入数据的时间顺序特性。

[此处为图片1]

2. 一维卷积神经网络(Conv1D)

尝试利用卷积层提取局部时序模式:


def build_conv1d_model():
    """构建一维卷积网络,适合捕捉局部时序模式"""
    inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
    x = layers.Conv1D(8, 24, activation="relu")(inputs)  # 24小时窗口
    x = layers.MaxPooling1D(2)(x)
    x = layers.Conv1D(8, 12, activation="relu")(x)        # 12小时窗口
    x = layers.MaxPooling1D(2)(x)
    x = layers.Conv1D(8, 6, activation="relu")(x)         # 6小时窗口
    x = layers.GlobalAveragePooling1D()(x)
    outputs = layers.Dense(1)(x)
    return keras.Model(inputs, outputs)

表现:验证MAE达到约2.9℃,结果甚至劣于基准方法。主要原因包括:

  • 平移不变性假设失效:天气变化不具备图像那样的空间平移不变性;
  • 池化操作破坏顺序信息:下采样过程丢失了关键的时间步结构。
[此处为图片2]

3. 循环神经网络登场:LSTM 模型

LSTM 被设计用于处理和预测时间序列中长期依赖的问题,其结构更契合本任务需求。


def build_lstm_model():
    """构建LSTM模型,专门处理序列数据"""
    inputs = keras.Input(shape=(sequence_length, raw_data.shape[-1]))
    x = layers.LSTM(16)(inputs)  # LSTM层,包含16个记忆单元
    outputs = layers.Dense(1)(x)
    return keras.Model(inputs, outputs)

# 训练配置
model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"])
callbacks = [
    keras.callbacks.ModelCheckpoint("jena_lstm.keras", save_best_only=True)
]

表现:在验证集上MAE降至2.36℃,测试集为2.55℃,首次超越基准方法!

[此处为图片3]

LSTM 成功的关键机制

  • 记忆能力:通过遗忘门、输入门和输出门的协同作用,能够选择性地保留或丢弃长期信息;
  • 顺序处理:逐时间步处理输入,完整保留序列的时序结构;
  • 状态传递:隐藏状态在时间步之间持续传递,形成动态“记忆”轨迹。

模型对比与深度思考

模型类型 验证MAE 测试MAE 特点 适用场景
基准方法 2.44℃ 2.62℃ 简单快速 快速验证、基线参考
密集连接 ~2.44℃ 需测试 忽略时序 特征间关系简单
一维卷积 ~2.9℃ 需测试 提取局部特征 具有局部模式的序列
LSTM 2.36℃ 2.55℃ 建模时序依赖 复杂时序关系

核心洞察总结

  • 基准方法至关重要:在引入复杂模型前,必须建立可靠的简单基线作为比较标准;
  • 模型并非越复杂越好:一维卷积在此任务中表现反而更差,说明架构需匹配数据本质;
  • 选择合适架构是关键:对于序列数据,RNN/LSTM 类模型通常更具优势;
  • 数据的本质决定方法选择:时间序列的核心在于其时序依赖性,应优先考虑能保留并学习此特性的模型。

训练过程可视化

以下函数用于绘制训练过程中MAE的变化曲线:


def plot_training_history(history, title):
    """绘制训练和验证的MAE曲线"""
    plt.figure(figsize=(8, 5))
    loss = history.history["mae"]
    val_loss = history.history["val_mae"]

该函数将帮助直观评估模型收敛情况及是否存在过拟合现象。

[此处为图片4]

扩展应用与进阶思考

时间序列的其他应用场景

时间序列数据在实际中有着广泛的应用,除了预测任务外,还包括以下几类典型问题:

  • 时间序列分类:通过分析序列的整体模式进行类别判断,例如对心电图信号进行疾病分类。
  • 异常检测:识别数据流中偏离正常行为的异常点,常用于设备监控或金融欺诈检测。
  • 事件检测:定位并识别特定事件的发生时刻,比如地震波形中的震源识别。

进阶技术方向探索

随着模型复杂度的提升,可以引入更先进的结构来增强对时序特征的捕捉能力:

  • 双向LSTM:能够同时利用历史和未来上下文信息,在序列标注等任务中表现突出。
  • 注意力机制:使模型动态聚焦于关键的时间步,提升对重要片段的敏感性。
  • Transformer:凭借自注意力机制,在处理长序列依赖问题上展现出优越性能。
  • 多变量预测:不仅限于单一变量(如温度),还可同时预测多个相关变量(如湿度、风速等)。

总结与核心要点

本案例以温度预测为主线,系统展示了时间序列建模的关键环节。我们从中可以提炼出以下几个核心经验:

  • 数据预处理至关重要:尤其是如何合理划分训练集与验证集,直接影响模型评估的有效性。
  • 建立合理的基准模型:只有设定了明确的对比基线,才能科学衡量后续模型的改进效果。
  • 根据数据特性选择模型:对于具有时序依赖性的数据,RNN及其变体(如LSTM)通常比传统方法更具优势。
  • 实践是检验方法的唯一标准:理论分析固然重要,但最终仍需通过实验验证不同策略的实际表现。

时间序列预测虽具挑战性,但在工业、金融、医疗等领域具有极高的应用价值。随着深度学习的发展,我们拥有了更多强有力的工具来应对复杂的时序建模任务。希望本文能为你开启通往这一领域的大门。

epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, "bo", label="训练MAE")
plt.plot(epochs, val_loss, "b", label="验证MAE")
plt.title(title)
plt.xlabel("训练轮次")
plt.ylabel("MAE")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
[此处为图片1]
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:时间序列预测 时间序列 深度学习 STM 全攻略

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-30 16:24