2. 时序数据基础:时间序列的定义、平稳性与非平稳性、自相关与偏自相关、时序数据的可视化方法
2.1 时间序列到底是什么?
说实话,我入行那会儿,对「时间序列」的理解特别朴素——不就是按时间排好的数据嘛。后来做轨迹预测项目,才真正体会到,这玩意儿远没那么简单。
时间序列,严格来说,是一组按时间顺序排列的观测值。比如你每天记录的股票收盘价、每小时采集的传感器温度、每帧捕捉的车辆位置坐标。这些数据点之间,不是独立的。
我习惯把时间序列拆成三个核心要素:
- 时间戳:观测发生的时刻,可以是等间隔的,也可以是不等间隔的
- 观测值:在特定时刻记录到的数值
- 顺序关系:这是最关键的——前后数据点之间存在依赖
你想想看,如果我把今天的气温和昨天的气温交换一下,这个序列就完全变味了。这就是时序数据跟普通表格数据最大的区别:顺序本身携带信息。
重要提醒:在轨迹预测中,每一帧的车辆位置就是典型的时间序列。前一帧的位置会直接影响下一帧的预测。忽略这个顺序关系,模型基本就废了。
2.2 平稳性与非平稳性——别被名字吓到
平稳性这个概念,我当年学的时候觉得特别抽象。后来做项目踩了坑,才真正理解它的重要性。
平稳时间序列,说白了就是:统计性质不随时间变化。具体来说:
- 均值是常数,不随时间漂移
- 方差是常数,波动幅度不随时间变化
- 自协方差只跟时间间隔有关,跟具体时刻无关
举个例子,白噪声就是最典型的平稳序列。你取任何一段,它的均值都是0,方差都一样。
非平稳序列就相反了。比如一只股票的价格,长期看是上涨趋势的,均值一直在变。再比如交通流量,早晚高峰的波动幅度明显比半夜大,方差也在变。
我的经验:我在做高速公路车辆轨迹预测时,发现原始速度序列明显非平稳——堵车时方差大,畅通时方差小。直接拿原始数据建模,效果很差。后来做了差分处理,才把序列变得相对平稳。
为什么我们这么在意平稳性?因为大多数经典时序模型(ARIMA、GARCH等)都假设数据是平稳的。Transformer虽然没那么严格,但处理非平稳数据时,注意力机制容易「跑偏」——模型会花大量精力去拟合趋势,反而忽略了局部模式。
2.3 自相关与偏自相关——时序数据的「记忆」
自相关(ACF)这个概念,我习惯这么理解:今天的自己和昨天的自己有多像。
数学上,自相关就是计算时间序列与其滞后版本之间的相关系数。滞后1阶的自相关,就是看t时刻和t-1时刻的相关性。滞后k阶,就是看相隔k个时间步的两个点之间的相关性。
偏自相关(PACF)稍微绕一点。它是在剔除了中间变量的影响后,两个时间点之间的「纯」相关性。比如,t和t-2的相关性,可能完全是由t-1这个中间变量传递过来的。偏自相关就是要去掉这个传递效应。
| 指标 | 含义 | 应用场景 |
|---|---|---|
| ACF(自相关函数) | 包含所有中间路径的相关性 | 判断序列是否有周期性、趋势 |
| PACF(偏自相关函数) | 剔除中间变量后的「直接」相关性 | 确定AR模型的阶数 |
我曾经踩过的坑:有一次做交通流量预测,ACF图显示滞后24阶的相关性很高,我以为是日周期。后来仔细一看,其实是数据预处理时没去掉异常值,导致虚假相关。所以看ACF/PACF之前,一定要先做数据清洗。
2.4 时序数据的可视化——先看再建模
我个人有个习惯:拿到任何时序数据,第一件事不是建模,而是画图。你想想看,模型再厉害,也架不住数据本身有问题。
常用的可视化方法,我列几个:
2.4.1 时间序列折线图
最基础也最直观。横轴是时间,纵轴是数值。一眼就能看出趋势、季节性、异常点。
import matplotlib.pyplot as plt
import pandas as pd
# 假设df是包含时间戳和数值的DataFrame
plt.figure(figsize=(12, 4))
plt.plot(df['timestamp'], df['value'])
plt.title('时间序列折线图')
plt.xlabel('时间')
plt.ylabel('数值')
plt.show()
2.4.2 自相关图(ACF Plot)
画出自相关函数随滞后阶数的变化。如果ACF衰减很慢,说明序列非平稳。如果ACF在某个滞后处突然截断,那可能是MA过程的特征。
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(df['value'], lags=40)
plt.title('自相关函数图')
plt.show()
2.4.3 偏自相关图(PACF Plot)
跟ACF图类似,但显示的是偏自相关。在确定AR模型的阶数时特别有用。
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(df['value'], lags=40)
plt.title('偏自相关函数图')
plt.show()
2.4.4 季节性分解图
把时间序列拆成趋势、季节性和残差三部分。这样能看清数据的底层结构。
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(df['value'], model='additive', period=24)
result.plot()
plt.show()
我的建议:在轨迹预测项目中,我习惯把车辆轨迹画成二维路径图,同时叠加速度或加速度的时间序列。这样既能看空间路径,又能看运动状态的变化,比单看一个维度有效得多。
2.5 小结
这一章我们聊了时间序列的基础概念。说白了,就是三件事:
- 定义:按时间顺序排列的观测值,顺序本身携带信息
- 平稳性:统计性质不随时间变化,是很多模型的前提假设
- 自相关与偏自相关:衡量时序数据「记忆」的工具,帮助理解数据的内在结构
可视化是理解数据的第一步。我见过太多人上来就调模型,结果数据本身就有问题。记住:先画图,再建模。这个习惯能帮你省掉至少一半的调试时间。
下一章,我们会深入Transformer的核心机制——自注意力。到时候你会发现,自注意力其实就是在学习时序数据中的自相关结构。嗯,基础打牢了,后面就顺了。