Python 中的时间序列特征自动提取工具:tsfresh

什么是 tsfresh?

tsfresh 是一个开源的 Python 库,全称为 Time Series Feature Extraction Based on Scalable Hypothesis tests。它能够自动从大量时间序列数据中提取数百种特征,并通过统计检验筛选出对目标变量有显著影响的特征,从而实现高效、可扩展的时间序列特征工程。

主要特点:

  • ✅ 自动提取超过 70 种类型的特征(如均值、方差、偏度、过零率、傅里叶系数等)
  • ✅ 支持大规模数据集的并行处理
  • ✅ 内置特征选择机制,基于假设检验过滤无关特征
  • ✅ 易于集成到机器学习流程中
  • ✅ 支持多变量时间序列

安装 tsfresh

你可以通过 pip 安装 tsfresh:

python 复制代码
pip install tsfresh

如果你需要使用部分高级功能(如 R 熵计算),还可以安装完整版本:

python 复制代码
pip install tsfresh[complete]

基本使用示例

下面我们通过一个简单的例子来展示如何使用 tsfresh 提取时间序列特征。

1. 准备数据

假设我们有一个包含多个时间序列的数据集,每个序列属于某个类别(如正常/异常)。数据格式如下:

python 复制代码
import pandas as pd

# 示例数据:id 表示不同样本,time 是时间戳,value 是观测值,kind 可用于多变量
data = pd.DataFrame({
    'id': [1, 1, 1, 2, 2, 2, 3, 3, 3],
    'time': [0, 1, 2, 0, 1, 2, 0, 1, 2],
    'value': [1.2, 3.4, 2.1, 0.5, 0.8, 1.0, 5.0, 4.8, 5.2]
})

y = pd.Series([0, 1, 0], name='target', index=[1, 2, 3])  # 标签:样本 id 对应的目标值

注意:tsfresh 要求输入的时间序列数据为长格式(long format),即每行代表一个时间点,通过 id 列区分不同样本。

2. 特征提取

使用 extract_features 函数自动提取特征:

python 复制代码
from tsfresh import extract_features

# 提取所有特征
features = extract_features(data, column_id='id', column_sort='time')
print(features.shape)  # 输出特征矩阵的维度

此时 features 是一个 DataFrame,每一行对应一个 id,每一列是一个提取出的特征(如 __mean, __std, __maximum, 等)。

3. 特征选择

并非所有提取的特征都对预测有用。tsfresh 提供了 select_features 函数,基于假设检验(如 Mann-Whitney U 检验)筛选出与目标变量显著相关的特征:

python 复制代码
from tsfresh import select_features

selected_features = select_features(features, y)
print(f"原始特征数: {features.shape[1]}, 筛选后特征数: {selected_features.shape[1]}")

你也可以一步完成提取和选择:

python 复制代码
from tsfresh import extract_relevant_features

relevant_features = extract_relevant_features(data, y, column_id='id', column_sort='time')

高级功能

1. 自定义提取哪些特征

你可以通过 default_fc_parameterskind_to_fc_parameters 控制提取的特征种类:

python 复制代码
from tsfresh.feature_extraction.settings import MinimalFCParameters

# 只提取少量基本特征(速度快)
features_minimal = extract_features(
    data,
    column_id='id',
    column_sort='time',
    default_fc_parameters=MinimalFCParameters()
)

其他预设配置包括:

  • ComprehensiveFCParameters:全部特征(默认)
  • EfficientFCParameters:平衡速度与覆盖范围
  • MinimalFCParameters:仅基础统计量(均值、方差等)

你也可以自定义参数字典,只启用特定特征。

2. 多变量时间序列支持

如果数据包含多个变量(如温度、湿度、压力),可以使用 kind 列区分:

python 复制代码
multi_data = pd.DataFrame({
    'id': [1, 1, 1, 1, 1, 1],
    'time': [0, 1, 0, 1, 0, 1],
    'kind': ['temp', 'temp', 'humidity', 'humidity', 'pressure', 'pressure'],
    'value': [20.1, 20.3, 45.0, 46.2, 1013, 1012]
})

features_multi = extract_features(
    multi_data,
    column_id='id',
    column_sort='time',
    column_kind='kind',
    column_value='value'
)

3. 并行加速

tsfresh 支持并行特征提取,提升大数据集的处理效率:

python 复制代码
features = extract_features(
    data,
    column_id='id',
    n_jobs=4  # 使用 4 个 CPU 核心
)

实际应用场景

  • 设备故障预测:从传感器时间序列中提取振动、温度变化特征,训练分类模型判断是否即将故障。
  • 金融交易信号识别:分析股价走势,提取波动性、趋势强度等特征辅助量化交易。
  • 用户行为分析:从用户点击流时间序列中提取活跃度、周期性等特征进行分群或流失预测。
  • 医学信号处理:从 ECG、EEG 信号中自动提取节律、幅值等特征用于疾病诊断。

注意事项与最佳实践

  1. 数据预处理:确保时间序列无缺失或异常值,必要时进行插值或平滑。
  2. 时间排序 :建议指定 column_sort 以保证时间顺序正确。
  3. 内存管理 :特征数量可能非常庞大,对于超长时间序列或大量样本,建议使用 EfficientFCParameters 或分批处理。
  4. 领域知识结合:虽然 tsfresh 自动化程度高,但结合业务理解手动构造特征仍能提升模型性能。

总结

tsfresh 是一个强大而灵活的时间序列特征提取工具,极大地简化了特征工程流程。它不仅节省了开发时间,还通过统计检验帮助识别真正有用的特征,避免过拟合。无论是学术研究还是工业应用,tsfresh 都是处理时间序列数据时值得信赖的助手。

通过合理配置参数、结合后续建模流程,tsfresh 能够成为构建时间序列机器学习系统中的核心组件。


参考资料

相关推荐
dxz_tust2 小时前
flow match简单直观理解
开发语言·python·深度学习·扩散模型·流匹配·flow match
癫狂的兔子2 小时前
【BUG】【Python】【爬虫】爬取加载中的数据
爬虫·python·bug
Frank学习路上2 小时前
【Qt】问题记录ld: framework ‘AGL‘ not found on MacOS 26
开发语言·qt·macos
陳10302 小时前
C++:二叉搜索树
开发语言·数据结构·c++
wqwqweee2 小时前
Flutter for OpenHarmony 看书管理记录App实战:个人中心实现
开发语言·javascript·python·flutter·harmonyos
t198751282 小时前
水下无人自主航行器(AUV)的MATLAB/Simulink仿真程序实现
开发语言·matlab
费弗里2 小时前
我的Python环境管理方式,兼顾常用AI工具依赖环境
python·ai
七夜zippoe2 小时前
Python网络编程实战:从TCP/IP到WebSocket的协议演进与核心技术解析
网络·python·websocket·tcp/ip·socket·心跳机制
jj008u2 小时前
Garmin 中国区活动同步到国际区的一个简单实现方案
python·ai编程