首页
/ 最完整的tsfresh教程:从安装到特征提取,一站式掌握时间序列分析

最完整的tsfresh教程:从安装到特征提取,一站式掌握时间序列分析

2026-02-05 05:37:54作者:贡沫苏Truman

你是否还在为时间序列数据的特征工程烦恼?面对海量的时序数据,手动提取有效特征既耗时又容易遗漏关键信息。tsfresh(Time Series FeatuRe Extraction)作为一款强大的开源工具,能够自动从时间序列中提取1200+特征,帮助数据科学家快速构建预测模型。本文将从安装到高级应用,全面讲解tsfresh的核心功能,读完你将掌握:

  • tsfresh的安装与环境配置
  • 时间序列数据的标准化处理
  • 特征提取全流程及参数调优
  • 特征筛选与模型集成方法
  • 工业级应用案例实战

什么是tsfresh?

tsfresh是一个用于时间序列特征工程的Python库,能够自动从原始时序数据中提取大量统计特征、时域特征和频域特征。其核心优势在于:

  • 自动化特征生成:内置1200+特征计算器,覆盖从基础统计量到复杂谱分析的全维度特征
  • 科学特征筛选:基于假设检验的特征相关性评估,自动过滤冗余特征
  • 高效并行计算:支持多进程/分布式计算,轻松处理百万级时序数据
  • ** sklearn兼容**:提供Transformer接口,可无缝集成到机器学习 pipelines

tsfresh已被成功应用于工业预测性维护[2]、火山喷发预测[4]、传感器异常检测[7]_等领域,是时序分析领域的重要工具。

时间序列特征示例

图1:tsfresh可提取的时间序列特征类型示例,包括最大值、最小值、峰值数量等基础统计量及复杂特征

快速安装与环境配置

基础安装

tsfresh支持Python 3.7+环境,通过PyPI可快速安装:

pip install tsfresh

对于需要处理大规模数据的场景,建议安装Dask扩展以支持分布式计算:

pip install tsfresh[dask]

官方文档:docs/text/quick_start.rst

验证安装

安装完成后,可通过导入库并查看版本验证安装是否成功:

import tsfresh
print("tsfresh版本:", tsfresh.__version__)

数据格式规范

tsfresh要求输入数据遵循特定格式,以确保特征提取的准确性。主要支持两种数据格式:

长格式DataFrame

最常用的输入格式是包含以下列的DataFrame:

  • id列:时间序列的唯一标识符(column_id)
  • time列:时间戳或排序键(column_sort)
  • 一个或多个value列:时序观测值(如传感器读数)

示例数据格式:

id time F_x F_y F_z T_x T_y T_z
1 0 -1 -1 63 -3 -1 0
1 1 0 0 62 -3 -1 0
2 0 -2 -1 64 -2 -1 0

数据格式文档:docs/text/data_formats.rst

宽格式字典

对于多类型时间序列数据,可使用字典格式,其中键为时序类型(kind),值为包含idtimevalue列的DataFrame:

{
    "temperature": pd.DataFrame({
        "id": [1, 1, 2, 2],
        "time": [0, 1, 0, 1],
        "value": [23.5, 24.1, 22.8, 23.0]
    }),
    "pressure": pd.DataFrame(...)
}

核心功能实战

1. 特征提取全流程

以下以机器人故障检测数据集为例,展示tsfresh的完整特征提取流程。该数据集包含6个传感器的时序数据,需判断机器人是否发生故障[1]_。

步骤1:加载示例数据

tsfresh提供内置数据集,可直接加载用于测试:

from tsfresh.examples.robot_execution_failures import download_robot_execution_failures, load_robot_execution_failures

# 下载并加载数据
download_robot_execution_failures()
timeseries, y = load_robot_execution_failures()

# 查看数据基本信息
print("时序数据形状:", timeseries.shape)
print("标签分布:", y.value_counts())

数据集包含134个机器人的执行数据,其中timeseries为时序数据,y为故障标签(1表示故障,0表示正常)。

步骤2:可视化时序数据

正常与故障状态的时序数据存在明显差异,可通过可视化观察:

import matplotlib.pyplot as plt

# 绘制正常样本(id=3)
timeseries[timeseries['id'] == 3].plot(subplots=True, sharex=True, figsize=(10, 10))
plt.suptitle("正常状态传感器数据")
plt.savefig("normal_robot.png")
plt.show()

# 绘制故障样本(id=20)
timeseries[timeseries['id'] == 20].plot(subplots=True, sharex=True, figsize=(10, 10))
plt.suptitle("故障状态传感器数据")
plt.savefig("faulty_robot.png")
plt.show()

正常状态时序数据

图2:正常状态下的机器人传感器数据(id=3)

故障状态时序数据

图3:故障状态下的机器人传感器数据(id=20),可观察到明显的模式变化

步骤3:自动特征提取

使用extract_features函数提取特征,核心参数包括:

  • column_id:样本ID列名
  • column_sort:时间排序列名
  • default_fc_parameters:特征计算参数配置
from tsfresh import extract_features

# 提取所有特征
extracted_features = extract_features(
    timeseries,
    column_id="id",
    column_sort="time",
    n_jobs=4  # 使用4个进程并行计算
)

print("提取特征数量:", extracted_features.shape[1])
print("特征数据形状:", extracted_features.shape)

默认配置下,tsfresh会提取1200+个特征,涵盖:

  • 基础统计量(均值、方差、极值)
  • 时间域特征(峰值数量、斜率、自相关)
  • 频域特征(傅里叶变换、小波系数)

特征提取源码:tsfresh/feature_extraction/extraction.py

2. 特征筛选与优化

处理缺失值

特征提取过程中可能产生NaN值(如某些特征计算器无法应用于特定数据),需进行缺失值填充:

from tsfresh.utilities.dataframe_functions import impute

# 填充缺失值(默认使用均值填充)
impute(extracted_features)

相关性筛选

使用select_features函数基于统计检验筛选与目标变量相关的特征:

from tsfresh import select_features

# 筛选相关特征
features_filtered = select_features(extracted_features, y)

print("筛选后特征数量:", features_filtered.shape[1])

筛选原理基于Benjamini-Yekutieli多重检验校正[2]_,通过以下步骤实现:

  1. 对每个特征进行假设检验(如ANOVA、Kruskal-Wallis)
  2. 计算特征与目标变量的p值
  3. 控制错误发现率(FDR),保留显著相关特征

特征筛选文档:docs/text/feature_filtering.rst

特征提取与筛选流程

图4:tsfresh特征提取与筛选流程,包括特征计算、p值检验和多重检验校正三个阶段

3. 特征提取参数配置

tsfresh提供灵活的参数配置机制,可通过以下方式控制特征提取过程:

预设参数集

  • ComprehensiveFCParameters:默认配置,包含所有特征(1200+)
  • MinimalFCParameters:最小特征集,仅包含基础统计量(适合快速测试)
  • EfficientFCParameters:高效特征集,排除高计算成本特征
from tsfresh.feature_extraction import MinimalFCParameters, EfficientFCParameters

# 使用最小特征集
minimal_fc_params = MinimalFCParameters()
features_minimal = extract_features(timeseries, column_id="id", column_sort="time", default_fc_parameters=minimal_fc_params)

# 使用高效特征集(适合大规模数据)
efficient_fc_params = EfficientFCParameters()
features_efficient = extract_features(timeseries, column_id="id", column_sort="time", default_fc_parameters=efficient_fc_params)

自定义特征参数

通过字典自定义需要计算的特征及参数:

# 自定义特征配置
custom_fc_parameters = {
    # 无参数特征
    "mean": None,
    "maximum": None,
    # 带参数特征
    "quantile": [{"q": 0.25}, {"q": 0.5}, {"q": 0.75}],
    "fft_aggregated": [{"aggtype": "centroid"}, {"aggtype": "variance"}]
}

# 使用自定义配置提取特征
features_custom = extract_features(
    timeseries,
    column_id="id",
    column_sort="time",
    default_fc_parameters=custom_fc_parameters
)

参数配置文档:docs/text/feature_extraction_settings.rst

4. 高级应用:特征命名规则

tsfresh采用结构化命名方式,便于理解特征含义:

{时间序列名称}__{特征计算器}__{参数名1}_{参数值1}__{参数名2}_{参数值2}

示例:

  • F_x__quantile__q_0.6:F_x传感器数据的0.6分位数
  • T_z__cwt_coefficients__widths_(2,5,10)__coeff_14:T_z传感器数据的小波系数特征

特征命名规则:docs/text/feature_calculation.rst

工业级应用案例

预测性维护

在机器人故障检测案例中,使用筛选后的特征训练分类模型:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features_filtered, y, test_size=0.2, random_state=42)

# 训练随机森林模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 评估模型
y_pred = model.predict(X_test)
print("准确率:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))

完整案例教程:[notebooks/01 Feature Extraction and Selection.ipynb](https://gitcode.com/gh_mirrors/ts/tsfresh/blob/41e54c6c3046476105f78a99826fa593fb361e6c/notebooks/01 Feature Extraction and Selection.ipynb?utm_source=gitcode_repo_files)

大规模数据处理

对于无法载入内存的大规模数据,使用Dask分布式计算:

# 大规模数据处理示例(需安装dask)
from tsfresh import extract_features
import dask.dataframe as dd

# 将pandas DataFrame转换为dask DataFrame
ddf = dd.from_pandas(timeseries, chunksize=1000)

# 使用dask提取特征
extracted_features = extract_features(
    ddf,
    column_id="id",
    column_sort="time",
    n_jobs=8,  # 分布式计算
    distributor="dask"
)

大规模数据处理文档:docs/text/large_data.rst

总结与展望

tsfresh作为自动化时序特征工程工具,极大简化了从原始数据到模型特征的转化过程。通过本文学习,你已掌握:

  • tsfresh的安装与基础配置
  • 时序数据的标准化处理
  • 特征提取、筛选全流程
  • 特征参数自定义与优化
  • 工业级应用案例实现

未来,tsfresh将进一步优化计算效率,支持流数据处理,并扩展更多特征类型。建议结合官方文档和示例 notebooks深入学习:

通过tsfresh,让时间序列特征工程不再成为数据分析的瓶颈!

参考文献

.. [1] http://archive.ics.uci.edu/ml/datasets/Robot+Execution+Failures .. [2] Christ, M., Kempa-Liehr, A.W. and Feindt, M. (2016). Distributed and parallel time series feature extraction for industrial big data applications. .. [4] Dempsey, D. E. et al. (2020). Automatic precursor recognition and real-time forecasting of sudden explosive volcanic eruptions. .. [7] Teh, H. Y. et al. (2021). Expect the Unexpected: Unsupervised feature selection for automated sensor anomaly detection.

登录后查看全文
热门项目推荐
相关项目推荐