时间序列无处不在,从心电图上的心跳、股票价格波动,到家庭智能电表读数的变化,甚至一个句子中词语的排列——这些都是时间序列。它们的特殊性在于其顺序性:过去会影响未来,相邻的数据点之间往往高度相关。
现代用于预测和分类的模型很少直接处理原始的、按时间顺序排列的数值。它们更依赖于特征——那些能够概括序列形状、变化性、趋势和模式的摘要信息。优秀的特征可以将一个复杂的预测问题,转化为相对更简单的回归或分类任务。
当前有两个重要的技术趋势值得关注。一是AutoML(自动机器学习),像 auto-sklearn 这样的系统能够自动搜索合适的模型家族、超参数以及数据预处理步骤。二是自动化时间序列特征提取,以 tsfresh 为代表的库,可以从每个序列中自动生成数百个特征,涵盖统计量、自相关、频谱内容和熵等多个维度。
近期的研究表明,将 AutoML 与丰富的时间序列特征相结合,在许多预测任务上能够超越复杂的深度神经网络。更有意思的是,这种方法甚至可以通过处理“语言时间序列”来提升文本分类的性能。
本文将详细介绍多步时间序列预测的构建方式、如何扩展 auto-sklearn 以用于时间序列任务、tsfresh 的工作原理与使用方法,并通过两个案例研究——数值预测和将文本视为时间序列——来具体说明。文末还提供了一些可以直接应用到项目中的实用工作流程和技巧。
多步预测:不仅预测下一步,还要预测接下来的 k 步
多步超前预测的目标并非仅仅预测下一个值,而是要预测未来一整段序列的值:
x_{i+1}, x_{i+2}, \dots, x_{i+k}
例如,预测未来24小时的电力负荷、未来10天的原油价格,或者提前数个时间步预测洪水水位。
目前,有两种主要策略被广泛使用。
递归策略
首先,训练一个模型,使其仅预测下一个时间步:
\hat{x}_{i+1} = f(x_{i-w+1}, \dots, x_i)
然后,将这个预测值作为输入反馈回模型中,以获取下一个预测值:
\hat{x}_{i+2} = f(x_{i-w+2}, \dots, x_i, \hat{x}_{i+1})
重复此过程,直到预测出 x_{i+k}。
这种方法只需训练一个模型,计算成本较低。但其缺点在于,早期预测步骤产生的任何误差都会在后续预测中被传播和放大,这也就是我们常说的自回归预测的误差累积问题。
直接多输出策略
另一种思路是训练一个模型,使其能够一次性预测所有未来的步骤:
[\hat{x}_{i+1}, \dots, \hat{x}_{i+k}] = f(x_{i-w+1}, \dots, x_i)
这样做的好处是,不同预测步长之间没有误差累积,在固定的计算预算下通常能获得更好的准确性。缺点是模型结构更为复杂,在数据有限的情况下可能更难拟合。
在实践中,两种策略都各有其用武之地。关键在于:无论选择哪种策略,输入窗口大小 w 的选择,以及从该窗口计算出的特征,都会对模型的性能产生显著影响。
时间序列的 AutoML:扩展 auto-sklearn
AutoML 的目标是自动化机器学习流水线的设计,包括数据清洗、特征预处理、模型选择以及超参数调优。像 auto-sklearn 这样的系统将这个问题视为一个搜索问题:利用贝叶斯优化和元学习技术来探索不同的流水线组合,并集成表现优秀的候选模型。
一个典型的 auto-sklearn 流水线包含预处理器(如缩放、填充缺失值)、特征预处理器(如PCA、核近似)、模型(如SVM、随机森林、梯度提升机)以及集成构建组件。
然而,原始的 auto-sklearn 是为通用的表格数据设计的。开箱即用时,它并不包含专门针对时间序列的特征提取器,例如自相关峰值、频谱熵或季节性统计量等。
有研究人员对 auto-sklearn 进行了修改,使其特征预处理阶段能够包含时间序列特征提取(特别是使用 tsfresh),并且将窗口大小 w 本身也作为一个可搜索的超参数。扩展后的 AutoML 系统会同时搜索算法 A(如SVM、GBM等)、超参数 λ 以及窗口大小 w,以最小化验证数据上的损失函数(例如RMSE)。
tsfresh
tsfresh(Time Series Feature Extraction based on Scalable Hypothesis tests,基于可扩展假设检验的时间序列特征提取)是一个强大的 Python 库。它能自动从每个时间序列中计算出数百个特征:其“综合”特征集大约能为每个序列生成794个特征。
这些特征覆盖的类别相当广泛:基本统计量(均值、方差、分位数)、形状描述符(偏度、峰度、绝对能量)、自相关和偏自相关、频域度量(傅里叶系数、频谱能量、熵),以及非线性时间序列特征(如排列熵、小波系数等)。tsfresh 还会运用假设检验来判断哪些特征与目标变量显著相关,并配合多重检验校正来避免错误发现。
这种方式将工作重心从手动设计特征(例如,“要不要试试滚动均值、滞后差分,或许再加个FFT?”)转移到系统性地探索一个丰富的特征库,让统计学和模型性能来决定哪些特征才是真正重要的。
数据格式化
tsfresh 期望数据以长格式的 DataFrame 呈现:需要一列用于 id(标识该行数据属于哪个时间序列)、一列用于 time(或排序索引)、以及一列或多列包含观测值。
其示例结构大致如下:

特征提取
通常会调用类似下面的代码:
from tsfresh import extract_features
from tsfresh.feature_extraction import ComprehensiveFCParameters
features = extract_features(
df,
column_id="id",
column_sort="time",
default_fc_parameters=ComprehensiveFCParameters()
)
这将产生一个宽表,其中每一行对应一个时间序列(一个 id),每一列是一个特征,例如 value__mean、value__abs_energy、value__autocorrelation_lag_1、value__fourier_entropy_bins_5 等等。
处理缺失值
对于非常短或退化的序列,某些特征可能是未定义的(例如,长度为1的序列无法计算FFT)。tsfresh 提供了工具来填充或删除包含太多 NaN 值的列:
from tsfresh.utilities.dataframe_functions import impute
impute(features) # 用合理的默认值替换 NaN / inf
或者直接删除全部为 NaN 的列:
features = features.dropna(axis=1)
特征相关性和选择
对于监督学习任务,tsfresh 还能基于假设检验进行特征选择,评估每个特征与目标变量的关联程度。这通常通过 extract_relevant_features 等函数完成,或者通过集成了 tsfresh 的 AutoML 框架来应用其自身的特征选择逻辑。
用于预测的滚动特征提取
在进行预测时,我们通常希望在滑动窗口上计算特征。首先选择一个窗口大小(例如24小时),然后对每个时间窗口计算 tsfresh 特征,接着将这些特征行作为模型输入,并将未来的目标值作为标签。
案例研究 1:AutoML + tsfresh 用于多步预测
Wang 等人对 AutoML 和时间序列特征工程在多步预测任务上的相互作用进行了系统性研究。
问题设置
给定一个单变量时间序列 (x_1, x_2, \dots, x_i),目标是仅使用最后 w 个观测值来预测接下来的 k 个值:
x_{i+1}, \dots, x_{i+k}
窗口大小 w 至关重要。太小可能会错过缓慢变化的模式;太大则可能让模型看到过多噪声或不相关的历史信息。作者之前的工作表明,即使在单步预测任务中,调整 w 也能显著影响性能,因此他们将自动窗口大小选择扩展到了多步预测的场景中。
扩展 auto-sklearn
他们对 auto-sklearn 做了两处主要调整。第一,添加了基于 tsfresh 的时间序列特征提取器作为候选的特征预处理器。第二,将窗口大小 w 本身作为 AutoML 可以搜索的超参数,而不是一个固定的、手动选择的常数。
扩展后的 AutoML 系统会同时搜索模型族(SVM、GBM等)、超参数(如C值、学习率、树深度等)以及窗口大小 w(考虑如50-200点等范围)。
三种 AutoML 变体
他们提出了三种专门用于时间序列预测的 auto-sklearn 变体:
- W 变体(带自动窗口大小选择的 Auto-sklearn):使用窗口中的原始滞后值作为特征,并让 AutoML 在50-200的范围内选择最佳窗口大小。
- T 变体(带 tsfresh 特征的 Auto-sklearn):使用固定的窗口大小(例如
w = 100),应用 tsfresh 从每个窗口段提取数百个特征,使用 Benjamini-Hochberg 程序为每个预测步骤选择统计显著的特征,然后取所有预测步长上显著特征的并集。
- WT 变体:结合了以上两个想法,让 AutoML 同时调整窗口大小
w,并使用从每个候选窗口提取的 tsfresh 特征。
基线和数据
为了对这些变体进行基准测试,他们与多种基线模型进行了比较。传统机器学习基线包括 SVM(递归和多输出形式)和 GBM(同样有递归和多输出形式)。神经网络和 AutoML 基线则包括 N-BEATS(一个强大的单变量预测深度学习模型)、Auto-Keras(配置了 LSTM/GRU 循环块和手动选择的窗口大小)以及原始的 auto-sklearn(固定窗口大小,无时间序列特定特征)。
数据集来自 CompEngine(一个大型时间序列数据仓库)。他们从不同类别中选择了20个数据集,涵盖音频、生态数据、宏观经济与微观经济、金融、医学数据、动力系统和随机过程。每个数据集按时间顺序划分为67%的训练集和33%的测试集。
关键发现
几个最有意思的结果值得一提:
- 多输出模型在相同计算预算下通常优于递归模型,这大概是因为避免了跨预测步长的误差累积。
- 原始
auto-sklearn(固定窗口大小)已经在20个数据集中的8个上击败了所有传统机器学习基线。
- 专门的 AutoML 变体进一步提升了性能。W 变体在20个数据集中的14个上优于最佳的传统机器学习基线。W、T 和 WT 变体分别在10、5和5个数据集上显示出比所有传统基线更低的误差。
- 与深度学习模型 N-BEATS 相比,最佳的 AutoML 变体 W 在20个数据集中的14个上胜出。
要点总结
这项研究有几个关键启示:AutoML 结合经典模型在与深度模型的竞争中表现出极强的实力,尤其是在配合良好的特征工程和窗口大小调整时。窗口大小是一个至关重要的超参数——即使没有复杂的特征,调整它也能带来巨大收益。tsfresh 特征确实有帮助,但方式可能出乎意料:总体来看,纯窗口大小变体 W 是最强的,而基于 tsfresh 的变体可能在特定领域或评估指标上更具优势。多输出策略是有限计算预算下进行多步预测的可靠默认选择。
案例研究 2:将文本作为时间序列处理
时间序列特征工程并不仅限于传感器读数或金融数据。在2020年发表于 EPJ Data Science 的文章中,Tang 等人将短文本样本重新解释为时间序列,然后应用 tsfresh 风格的特征提取来改进作者归属任务。
从文本到“语言时间序列”
首先对每个文本样本进行分词,然后将每个 token 映射到一个数值度量——可以是它在语料库中的频率、按频率的排名、字符长度,或者对词计数向量的贡献等。接着,按照 token 在句子中的出现顺序排列这些数值,就形成了一个“语言时间序列”。
他们实验了五种功能性的语言序列映射,包括 token 频率序列、token 排名序列、token 长度序列,以及基于分布的序列。每个结果序列都像普通时间序列一样被处理。
文本上的时间序列特征提取
对于这五种映射中的每一种,他们使用 tsfresh(ComprehensiveFCParameters)从每个序列中提取794个时间序列特征,最终为每个文本样本得到3970个风格计量特征。使用 tsfresh 的 impute 函数处理缺失值和无穷值,并采用10折交叉验证进行评估。
这些时间序列特征随后与标准 NLP 基线(如朴素贝叶斯)的预测结果相结合,利用 XGBoost 构建一个混合分类器。
结果和见解
他们在两个数据集上进行了测试:Spooky Books(类别平衡的恐怖小说数据集)和联邦党人文集(类别不平衡的历史文献数据集)。
- 在 Spooky Books 案例中,语言时间序列特征持续改进了基线 NLP 模型的性能。
- 对于联邦党人文集,将这些特征添加到强 NLP 基线中也带来了较小但仍有希望的改进。
- 一些特定的
tsfresh 特征在语言学上具有良好的可解释性。例如,平均 token 长度特征能区分倾向于使用长词还是短词的作者;token 长度序列上的 c3 非线性统计量捕捉了词长波动的微妙模式。
作者的结论是,时间序列特征提取提供了新颖的风格计量信号,可以增强传统 NLP 特征。这个功能性语言分析框架在更广泛的作者归属和风格分析任务中具有潜力。
实用工作流程
整合前面的内容,这里给出一个可以用于时间序列项目(无论是数值数据还是文本数据)的具体流程。
- 定义任务:明确是单步还是多步预测?是分类还是回归问题?
- 选择窗口策略:从一个合理的
w 值范围开始尝试(例如,对于小时数据,可以从24-168开始)。如果条件允许,最好将 w 作为可调的超参数来处理。
- 为 tsfresh 格式化数据:对于数值时间序列,使用
(id, time, value) 格式。对于文本,可以参照 Tang 等人的方法,将句子转换为功能性语言序列(如 token 长度、频率、排名等)。
- 提取特征:使用
tsfresh 的 ComprehensiveFCParameters 开始探索完整的特征库。使用 impute() 函数清理 NaN 和无穷值。
- 特征选择:可以采用几种方式:使用
tsfresh 自带的相关性检验;应用如 Benjamini-Hochberg 这样的多重检验控制方法;或者在模型中使用自带正则化或特征重要性评估的方法(如基于树的模型、L1正则化的线性模型)。
- 选择与训练模型:如果进行结构化实验,可以使用
auto-sklearn 或 Auto-Keras 等框架来自动搜索模型族和超参数。否则,可以从梯度提升机、随机森林或调优良好的神经网络等强基线模型开始。
- 充分评估:对于预测任务,考虑 RMSE、MAE 等指标,并关注特定预测步长的误差。对于分类任务,使用准确率、对数损失等指标,最好配合交叉验证。
- 解释关键特征:利用特征重要性图或 SHAP 值等工具,分析哪些
tsfresh 特征最为重要,并尝试将它们与领域知识联系起来。
总结
从数值预测到文本分析,这些研究工作传达的信息非常明确。
时间序列的特征工程远未过时——它只是变得更加系统化和自动化。AutoML 系统可以将 tsfresh 这样的时间序列特定组件纳入其中,并且效果显著,通常能在许多任务上与最先进的神经模型匹敌甚至超越。将文本这类非传统数据视为时间序列来处理,开启了一个全新的特征提取和分析工具空间。
如果你正在构建预测或序列分类流水线,值得尝试 tsfresh 或类似的特征库、能够同时调整模型和窗口大小的 AutoML 框架,以及“语言时间序列”这样的跨领域思路。特征工程带来可解释性,AutoML 提供自动化与灵活性,而这些研究也表明,这种方法在追求先进性能的道路上大有可为。
引用: