虽然一般的统计和机器学习效用指标提供了一个基础评估,但它们往往无法捕捉时间序列数据固有的复杂动态特性。时间序列数据集的特点是时间依赖性、趋势、季节性以及可能复杂的自相关结构。评估合成时间序列数据需要专门的方法,明确评估在生成过程中是否保留了这些动态特性。如果没有这种专门的关注,合成时间序列数据在其边际分布上可能看起来统计相似,但在用于预测或模拟动态系统时会表现不佳。本节详细介绍了评估合成时间序列数据质量的方法,着重于其复制原始数据时间动态的能力。评估自相关结构时间序列数据的一个定义性特征是自相关性,即序列与其自身滞后版本的相关性。一个好的合成时间序列生成器应能复制这种结构。自相关函数 (ACF) 和偏自相关函数 (PACF) 图可视化自相关性的主要工具是 ACF 和 PACF 图。ACF 图显示时间序列 $y_t$ 与其各种滞后 $y_{t-k}$ 之间的相关性。PACF 图显示 $y_t$ 与 $y_{t-k}$ 之间的相关性,但已移除中间滞后($y_{t-1}, y_{t-2}, ..., y_{t-k+1}$)的影响。一个标准的评估实践是为真实和合成数据集生成 ACF 和 PACF 图并进行视觉比较。明显的差异表明合成数据未能捕捉真实数据中存在的短期和长期时间依赖性。实施: Python 中的 statsmodels 等库提供了函数 (plot_acf, plot_pacf) 来方便地生成这些图。import numpy as np import pandas as pd import statsmodels.api as sm import matplotlib.pyplot as plt # 或者使用plotly进行交互式绘图 # 假设 'real_series' 和 'synthetic_series' 是pandas Series fig, axes = plt.subplots(1, 2, figsize=(12, 4)) sm.graphics.tsa.plot_acf(real_series, lags=40, ax=axes[0], title='真实数据 ACF') sm.graphics.tsa.plot_acf(synthetic_series, lags=40, ax=axes[1], title='合成数据 ACF') plt.tight_layout() plt.show() # 对PACF图重复上述步骤 # sm.graphics.tsa.plot_pacf(...)ACF/PACF 的定量比较视觉比较有用但有主观性。为了进行定量评估,计算真实数据 ($ACF_R$) 和合成数据 ($ACF_S$) 在特定滞后 $K$ 之前的 ACF 值。然后计算这些向量之间的距离指标,例如平均绝对误差 (MAE):$$ MAE_{ACF} = \frac{1}{K} \sum_{k=1}^{K} |ACF_R(k) - ACF_S(k)| $$较低的 MAE 表示自相关结构的保留更好。同样的方法也适用于 PACF。{"layout": {"title": "ACF 比较 (示例)", "xaxis": {"title": "滞后"}, "yaxis": {"title": "自相关性", "range": [-0.4, 1]}, "legend": {"title": "数据集"}, "height": 350, "width": 600}, "data": [{"x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "y": [0.85, 0.72, 0.60, 0.51, 0.43, 0.36, 0.30, 0.25, 0.20, 0.16, 0.12, 0.09, 0.06, 0.04, 0.02, 0.01, -0.01, -0.02, -0.03, -0.04], "type": "scatter", "mode": "lines+markers", "name": "真实 ACF", "marker": {"color": "#1c7ed6"}}, {"x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "y": [0.82, 0.68, 0.55, 0.46, 0.39, 0.32, 0.27, 0.22, 0.18, 0.14, 0.11, 0.07, 0.05, 0.03, 0.01, -0.01, -0.02, -0.03, -0.04, -0.05], "type": "scatter", "mode": "lines+markers", "name": "合成 ACF", "marker": {"color": "#fd7e14"}}]}示例真实和合成时间序列的自相关函数 (ACF) 值比较图,最高滞后为 20。紧密的一致性表明时间依赖性得到了良好的保留。评估多元时间依赖性对于多元时间序列(随时间测量的多个变量),评估序列之间的关系与评估单个序列的自相关性同样重要。互相关函数 (CCF)CCF 衡量一个时间序列 $x_t$ 与另一个时间序列 $y_{t-k}$ 的滞后值之间的相关性。通过比较真实多元数据集和合成数据集之间的 CCF 图(或定量比较 CCF 值),可以显示变量之间的领先-滞后关系是否得到了保持。实施: statsmodels.tsa.stattools.ccf 可以计算互相关。可视化这些需要为每对变量绘制 CCF。评估趋势和季节性许多时间序列显示出趋势(长期增加或减少)和季节性(在固定周期内重复的模式,例如每日、每周、每年)。时间序列分解分解方法,例如使用 Loess (STL) 进行季节-趋势分解,将时间序列分为三个部分:趋势、季节和残差。对真实和合成时间序列都应用分解(使用相同的季节周期)。视觉比较估计的趋势和季节部分。定量比较各部分,例如,通过计算真实和合成趋势部分之间的 MAE。实施: statsmodels.tsa.seasonal.STL 提供了 STL 分解的实现。from statsmodels.tsa.seasonal import STL # 假设 'real_ts' 和 'synthetic_ts' 是带有 DatetimeIndex 的 pandas Series # 并且 'period' 是已知的季节周期 (例如,对于具有每周季节性的每日数据,period=7) stl_real = STL(real_ts, period=period).fit() stl_synthetic = STL(synthetic_ts, period=period).fit() # 绘制组成部分 fig, axes = plt.subplots(3, 2, figsize=(12, 8), sharex=True) axes[0, 0].plot(stl_real.trend, color='#1c7ed6') axes[0, 0].set_title('真实趋势') axes[0, 1].plot(stl_synthetic.trend, color='#fd7e14') axes[0, 1].set_title('合成趋势') axes[1, 0].plot(stl_real.seasonal, color='#1c7ed6') axes[1, 0].set_title('真实季节性') axes[1, 1].plot(stl_synthetic.seasonal, color='#fd7e14') axes[1, 1].set_title('合成季节性') axes[2, 0].plot(stl_real.resid, color='#1c7ed6', alpha=0.7) axes[2, 0].set_title('真实残差') axes[2, 1].plot(stl_synthetic.resid, color='#fd7e14', alpha=0.7) axes[2, 1].set_title('合成残差') plt.tight_layout() plt.show()分析频谱特性有时,时间序列的特性最好在频域中理解。功率谱密度 (PSD) 描述了序列的方差(功率)如何分布在不同的频率上。这对于具有非严格绑定到标准季节周期的振荡模式的数据尤其相关。功率谱密度 (PSD) 比较使用 Welch 算法等方法估计真实和合成时间序列的 PSD。绘制估计的 PSD 与频率的关系图。视觉比较这些图。真实 PSD 中的明显峰值应在合成 PSD 中以相似的频率和幅度出现。定量比较可以包括计算归一化 PSD 之间的 Jensen-Shannon 散度或 Wasserstein 距离等指标。实施: scipy.signal.welch 通常用于 PSD 估计。{"layout": {"title": "功率谱密度比较 (示例)", "xaxis": {"title": "频率", "type": "log"}, "yaxis": {"title": "功率/频率", "type": "log"}, "legend": {"title": "数据集"}, "height": 350, "width": 600}, "data": [{"x": [0.01, 0.02, 0.05, 0.1, 0.2, 0.5], "y": [100, 80, 50, 20, 5, 1], "type": "scatter", "mode": "lines", "name": "真实 PSD", "line": {"color": "#1c7ed6"}}, {"x": [0.01, 0.02, 0.05, 0.1, 0.2, 0.5], "y": [95, 75, 48, 22, 6, 1.2], "type": "scatter", "mode": "lines", "name": "合成 PSD", "line": {"color": "#fd7e14"}}]}对数-对数图比较了示例真实和合成时间序列的估计功率谱密度 (PSD)。相似性表明合成数据捕获了频域特性。时间序列预测效用与通用机器学习效用评估(第 3 章)类似,我们可以评估合成数据对预测这一特定下游任务的有用性。训练-合成-测试-真实 (TSTR) 预测训练: 仅使用合成时间序列数据训练一个标准预测模型(例如 ARIMA、指数平滑、Prophet,甚至是 RNNs/LSTMs)。测试: 评估训练好的模型在保留期内预测真实时间序列的能力。比较: 将预测准确性(使用 MAE、RMSE、MAPE 等指标)与两个基线进行比较:纯粹在真实数据上训练和测试的模型(训练-真实-测试-真实)。朴素预测(例如,预测上次观察到的值)。如果用合成数据训练的模型表现与用真实数据训练的模型相当(并且明显优于朴素预测),则表明其对预测任务具有较高的效用。时间序列特征的分布除了比较整个序列,您还可以计算每个时间序列的各种统计特征(如果您有许多时间序列的数据集,例如不同商店的销售额),并比较真实数据集和合成数据集之间这些特征的分布。特征示例:均值、方差、偏度、峰度滞后 1 处的自相关 (ACF(1))熵或复杂性度量拟合模型的参数(例如 ARIMA 参数)趋势强度、季节性强度(来自分解)一旦您为真实集和合成集中的每个序列计算了这些特征,您就可以将第 2 章中的分布比较技术(例如 KS-检验、Wasserstein 距离、通过直方图或密度图进行视觉比较)应用于这些特征的分布。这提供了不同的视角,可以判断合成数据是否捕获了原始时间序列集合的多样性和特性。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fontcolor="#495057"]; edge [fontname="sans-serif", color="#495057", fontcolor="#495057"]; subgraph cluster_real { label = "真实数据集"; bgcolor="#e9ecef"; RTS1 [label="真实 TS 1"]; RTS2 [label="真实 TS 2"]; RTSN [label="..."]; RFeat [label="计算特征\n(均值, ACF(1) 等)", shape=ellipse, color="#1c7ed6", fontcolor="#1c7ed6"]; RDist [label="真实特征的\n分布", shape=cylinder, color="#1c7ed6", fontcolor="#1c7ed6"]; {RTS1, RTS2, RTSN} -> RFeat [arrowhead=none]; RFeat -> RDist; } subgraph cluster_synth { label = "合成数据集"; bgcolor="#e9ecef"; STS1 [label="合成 TS 1"]; STS2 [label="合成 TS 2"]; STSN [label="..."]; SFeat [label="计算特征\n(均值, ACF(1) 等)", shape=ellipse, color="#fd7e14", fontcolor="#fd7e14"]; SDist [label="合成特征的\n分布", shape=cylinder, color="#fd7e14", fontcolor="#fd7e14"]; {STS1, STS2, STSN} -> SFeat [arrowhead=none]; SFeat -> SDist; } Compare [label="比较\n分布\n(KS-检验, 视觉)", shape=cds, color="#be4bdb", fontcolor="#be4bdb"]; RDist -> Compare; SDist -> Compare; }图示比较从真实和合成时间序列集合中计算出的统计特征分布的过程。评估合成时间序列数据需要检查的不仅仅是静态分布检查。通过分析自相关、互相关、趋势、季节性、频谱特性和预测效用,您可以更全面地了解生成的数据是否真正捕获了原始时间序列的基本动态性质。结合视觉检查(如 ACF/PACF 图)和定量指标可提供最可靠的评估。