时序建模属实是一个令人困惑的抽象概念,因为它被不分场合的混用 (统计学、机器学习、深度学习),术语定义也较为模糊。
1、什么是时序建模?
时序建模就是处理带有时间顺序的数据,并且利用时间顺序处理问题(预测、分类和异常检测)。
需要满足的关键特征(满足以下几点审稿人就很难攻击你的工作不是时序建模):
- 数据点之间不是独立存在的
- 顺序很重要
- 存在时间依赖关系
2、三种时序建模
时序建模主要分为三种:统计学、机器学习和深度学习。
2.1 统计学
这是最经典的时序建模,关注统计规律:自回归模型(AR)、移动平均模型(MA)、ARIMA和状态空间模型。
特点:参数少,可解释性强,适合线性关系
2.2 机器学习
引入更多特征工程和传统算法,将时序问题转化为监督学习问题。例如:特征工程 (提取滞后特征、滑动窗口统计、季节性特征)、算法(线性回归、XGBoost/LightGBM、SVM)
特点:需要大量特征工程,非线性能力有限
2.3 深度学习
能够进一步的处理更加复杂的非线性问题(其实2.1~2.3也就是一个非线性应对能力增长的过程,从2.1统计学的线性回归,到2.3的非线性模型)例如:RNN/LSTM/GRU、TCN、Tranformer
时序建模的核心任务类型
cpp
时序建模任务
├── 预测任务(最常见)
│ ├── 单步预测:预测下一个时间点
│ ├── 多步预测:预测未来多个时间点
│ ├── 序列到序列:输入序列 → 输出序列
│ └── 滚动预测:不断用新观测值更新预测
│
├── 分类任务
│ ├── 序列分类:整条时间序列的类别(如心电图分类)
│ └── 时间点分类:每个时间点的类别(如动作识别)
│
├── 异常检测
│ ├── 点异常:单个时间点的异常
│ └── 集体异常:连续时间段的异常
│
└── 生成任务
├── 数据增强:生成类似的时间序列
└── 补全任务:填补缺失的时间点
实际项目中的时序建模流程
cpp
1. 问题定义
↓
2. 数据探索和预处理
│ - 处理缺失值
│ - 平稳性检验
│ - 季节性分析
↓
3. 构建监督学习数据集
│ - 创建滞后特征
│ - 定义时间窗口
│ - 划分训练/验证/测试集(按时间顺序!)
↓
4. 模型选择
│ - 简单任务:传统方法(ARIMA)
│ - 中等复杂度:树模型(XGBoost)
│ - 复杂序列:深度学习(LSTM/Transformer)
↓
5. 模型训练和评估
│ - 使用时间序列交叉验证
│ - 评估指标:MAE, RMSE, MAPE
↓
6. 部署和监控
后记
本人在摸索学习的过程中踩过不少奇奇怪怪的坑,大部分都是自己一厢情愿和固有认知导致的左脚绊右脚,例如:
时序建模不仅仅是预测未来的曲线走向,还能完成其他任务;深度学习不一定比统计学好,例如数据量不足和规律明显时就别硬上(造创新点不算);注意避免数据泄露让代码陪着自己骗自己(哈哈);RNN/LSTM/GRU这几个卧龙凤雏是一起的,Transformer和他们不一样。