什么是 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_parameters 或 kind_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 信号中自动提取节律、幅值等特征用于疾病诊断。
注意事项与最佳实践
- 数据预处理:确保时间序列无缺失或异常值,必要时进行插值或平滑。
- 时间排序 :建议指定
column_sort以保证时间顺序正确。 - 内存管理 :特征数量可能非常庞大,对于超长时间序列或大量样本,建议使用
EfficientFCParameters或分批处理。 - 领域知识结合:虽然 tsfresh 自动化程度高,但结合业务理解手动构造特征仍能提升模型性能。
总结
tsfresh 是一个强大而灵活的时间序列特征提取工具,极大地简化了特征工程流程。它不仅节省了开发时间,还通过统计检验帮助识别真正有用的特征,避免过拟合。无论是学术研究还是工业应用,tsfresh 都是处理时间序列数据时值得信赖的助手。
通过合理配置参数、结合后续建模流程,tsfresh 能够成为构建时间序列机器学习系统中的核心组件。
参考资料
- GitHub 仓库: https://github.com/tsfresh/tsfresh
- 官方文档: https://tsfresh.readthedocs.io
- 论文: Christ et al., "Time Series Feature Extraction on Basis of Scalable Hypothesis Tests" (2018)