0


使用 tsfresh 和 AutoML 进行时间序列特征工程

时间序列无处不在,心电图上的心跳、股票价格、家庭智能电表读数,甚至句子中词语——这些都是时间序列。它们的特殊之处在于顺序:过去影响未来,相邻的数据点往往高度相关。

现代预测和分类模型很少直接处理原始时间序列值。它们依赖的是特征:用来描述序列形状、变异性、趋势和模式的摘要信息。好的特征能把困难的预测问题转化为更简单的回归或分类任务。

当前有两大趋势,一是 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),每列是一个特征,比如 valuemean、valueabs_energy、valueautocorrelationlag_1、valuefourier_entropybins_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 个数据集:音频(动物声音、语音、音乐)、生态数据、宏观和微观经济、金融(原油、汇率、天然气价格)、医学数据(ECG)、动力系统(受驱摆、Duffing 振荡器等)和随机过程(自回归、随机游走等)。每个数据集按时间分为 67% 训练集和 33% 测试集。

关键发现

几个最有意思的结果值得一提。

多输出模型在相同计算预算下通常优于递归模型,大概是因为避免了跨预测范围的误差累积。原始 auto-sklearn(固定窗口大小)已经在 20 个数据集中的 8 个上击败了所有传统机器学习基线。

专门的 AutoML 变体进一步提升了性能。W 变体(自动窗口大小,无 tsfresh)在 20 个数据集中的 14 个上优于最佳传统机器学习基线(SVM 多输出)。W、T 和 WT 分别在 10、5 和 5 个数据集上显示出比所有传统基线更低的误差。

与深度学习模型 N-BEATS 相比,最佳 AutoML 变体 W 在 20 个数据集中的 14 个上胜出。其他 AutoML 系统(Auto-Keras、原始 auto-sklearn、T、WT)也在许多数据集上击败 N-BEATS,有时差距相当大。

要点总结

这项研究有几个关键发现。AutoML 配合经典模型与深度模型具有极强的竞争力,特别是结合良好的特征工程和窗口大小调整时。窗口大小是一等超参数——即使没有花哨的特征,调整它也能带来很大收益。tsfresh 特征有帮助,但不一定以预期的方式:总体来看,纯窗口大小变体 W 是最强的,而基于 tsfresh 的变体可能在特定领域或评估指标上更有优势。多输出策略是有限预算下多步预测的可靠默认选择。

案例研究 2:将文本作为时间序列处理

时间序列特征工程不只适用于传感器读数或金融数据。在 2020 年的 EPJ Data Science 文章中,Tang 等人把短文本样本重新解释为时间序列,然后应用 tsfresh 风格的特征提取来改进作者归属任务。

从文本到"语言时间序列"

先对每个文本样本分词,然后把每个 token 映射到一个数值度量——可以是它在语料库中的频率、按频率的排名、字符长度,或者对词计数向量的贡献等。按 token 在句子中的位置排列这些数值,就形成了"语言时间序列"。

他们实验了五种功能性语言序列映射,包括 token 频率序列、token 排名序列、token 长度序列,以及基于分布的序列(如 token 长度分布和 token 排名分布)。每个结果序列都像普通时间序列一样处理。

文本上的时间序列特征提取

对于这五种映射中的每一种,他们用 tsfresh(ComprehensiveFCParameters)每个序列提取 794 个时间序列特征,最终得到每个文本样本 3970 个风格计量特征(794 × 5 种映射)。用 tsfresh 的 impute 函数处理缺失值和无穷值,用 10 折交叉验证评估模型,以 log loss 作为主要指标。

这些时间序列特征然后与标准 NLP 基线(朴素贝叶斯和最近质心分类器)的预测结合,用 XGBoost 构建混合分类器。

结果和见解

他们在两个数据集上进行了测试:Spooky Books(平衡类别,恐怖小说)和联邦党人文集(不平衡,历史上很重要的论文)。

在 Spooky Books 案例中,语言时间序列特征持续改进了基线 NLP 模型。对于联邦党人文集,将这些特征加到强 NLP 基线中带来了较小但仍有希望的改进。

一些特定的 tsfresh 特征在语言学上具有很好的可解释性。平均 token 长度特征能区分倾向于使用长词还是短词的作者。token 长度序列上的 c3 非线性统计量捕捉了词长波动的微妙模式。token 长度分布上的线性趋势特征(截距和斜率)能反映作者是倾向于使用均匀范围的词长还是集中于较短的词。

作者的结论是,时间序列特征提取提供了新颖的风格计量信号,可以增强传统 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 和特定预测范围的误差。分类任务(包括文本)用准确率、log loss 和校准指标,最好配合交叉验证。

最后是解释关键特征。用特征重要性图或 SHAP 值看哪些 tsfresh 特征重要,把它们与领域知识联系起来:是否捕捉了季节性、波动性、体制变化或风格模式?是否揭示了不同组之间的差异(作者、患者类型、设备状态等)?

总结

从数值到文本领域,这些工作传达的信息很明确。

时间序列的特征工程远未过时——它只是变得更系统化和自动化了。AutoML 系统可以把 tsfresh 这样的时间序列特定组件纳入进来,效果很好,通常能在许多任务上与最先进的神经模型匹敌甚至超越。把文本这样的非传统数据当作时间序列处理,开启了一个全新的特征和分析工具空间。

如果正在构建预测或序列分类流水线,值得尝试 tsfresh 或类似的特征库、能同时调整模型和窗口大小的 AutoML 框架,以及"语言时间序列"这样的跨领域思路。工程特征带来可解释性,AutoML 提供灵活性,而如果这些研究有任何指示意义的话——实现最先进性能的机会相当不错。

引用:

https://www.mdpi.com/2673-4591/18/1/17

https://link.springer.com/article/10.1140/epjds/s13688-020-00244-9

作者:QuarkAndCode

“使用 tsfresh 和 AutoML 进行时间序列特征工程”的评论:

还没有评论