使用tsfresh进行时间序列特征提取与选择的技术实践

使用tsfresh进行时间序列特征提取与选择的技术实践

tsfresh Automatic extraction of relevant features from time series: tsfresh 项目地址: https://gitcode.com/gh_mirrors/ts/tsfresh

引言

时间序列数据分析在工业预测性维护、金融量化交易、物联网设备监控等领域有着广泛应用。传统机器学习方法通常需要人工设计特征,而tsfresh项目则提供了自动化特征提取与选择的解决方案。本文将详细介绍如何使用tsfresh从时间序列数据中提取有意义的特征,并基于统计方法筛选出最具预测性的特征子集。

数据集介绍

我们使用机器人执行失败数据集作为示例,该数据集记录了88次机器人执行过程(每次执行有唯一ID),其中每次执行包含15个时间点的力(F)和扭矩(T)测量值,分别在x、y、z三个空间维度上采集。因此,每条记录包含:

  • 执行ID(id)
  • 时间索引(time)
  • 6个传感器的测量值(F_x, F_y, F_z, T_x, T_y, T_z)
  • 执行结果标签(y):成功或失败

环境准备

首先需要导入必要的库:

import matplotlib.pylab as plt
from tsfresh import extract_features, extract_relevant_features, select_features
from tsfresh.utilities.dataframe_functions import impute
from tsfresh.feature_extraction import ComprehensiveFCParameters
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

数据加载与可视化

加载数据集并可视化部分执行示例:

from tsfresh.examples import robot_execution_failures
robot_execution_failures.download_robot_execution_failures()
df, y = robot_execution_failures.load_robot_execution_failures()

# 成功执行示例(ID=3)
df[df.id == 3][['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']].plot(x='time', title='成功示例(id 3)', figsize=(12, 6))

# 失败执行示例(ID=20)
df[df.id == 20][['time', 'F_x', 'F_y', 'F_z', 'T_x', 'T_y', 'T_z']].plot(x='time', title='失败示例(id 20)', figsize=(12, 6))

通过可视化可以直观地看出成功与失败执行在传感器读数上的差异模式。

特征提取

tsfresh的核心功能之一是自动从时间序列中提取大量特征。我们使用extract_features函数:

extraction_settings = ComprehensiveFCParameters()
X = extract_features(df, 
                    column_id='id', 
                    column_sort='time',
                    default_fc_parameters=extraction_settings,
                    impute_function=impute)

参数说明:

  • column_id:标识不同时间序列的列(此处为执行ID)
  • column_sort:时间索引列
  • default_fc_parameters:特征计算器配置
  • impute_function:处理缺失值的函数

执行后,X数据框将为每个机器人执行生成一行记录,包含所有计算出的特征(约4674个)。

特征选择

提取的特征数量庞大,但并非所有特征都与预测目标相关。tsfresh提供了基于假设检验的特征选择方法:

# 划分训练集和测试集
X_full_train, X_full_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)

# 仅在训练集上进行特征选择
X_filtered_train = select_features(X_full_train, y_train)

特征选择过程会:

  1. 对每个特征进行统计假设检验
  2. 保留与目标变量显著相关的特征
  3. 最终保留约423个特征(具体数量可能因数据和版本而异)

模型训练与评估

我们比较使用全部特征和筛选后特征的分类效果:

# 使用全部特征
classifier_full = DecisionTreeClassifier()
classifier_full.fit(X_full_train, y_train)
print(classification_report(y_test, classifier_full.predict(X_full_test)))

# 使用筛选后的特征
X_filtered_test = X_full_test[X_filtered_train.columns]
classifier_filtered = DecisionTreeClassifier()
classifier_filtered.fit(X_filtered_train, y_train)
print(classification_report(y_test, classifier_filtered.predict(X_filtered_test)))

实验结果表明,使用筛选后的特征通常能达到相当或更好的分类性能,同时显著减少了特征维度。

一步式特征提取与选择

如果只关心最终选择的特征,可以使用extract_relevant_features函数一步完成:

relevant_features = extract_relevant_features(df, y, 
                                            column_id='id', 
                                            column_sort='time',
                                            default_fc_parameters=extraction_settings)

技术要点总结

  1. 特征提取范围:tsfresh支持提取包括统计特征、傅里叶变换特征、熵特征等在内的广泛时间序列特征。

  2. 特征选择原理:基于假设检验,评估每个特征与目标变量的相关性,控制假阳性率。

  3. 数据泄露预防:特征选择必须在训练集上进行,避免使用测试集信息。

  4. 性能权衡:虽然特征选择减少了维度,但计算假设检验本身也有开销,需根据数据规模权衡。

  5. 替代方案:除统计检验外,也可考虑基于模型的特征重要性评估等其他特征选择方法。

最佳实践建议

  1. 对于大型数据集,可以先使用部分数据进行特征提取和选择,确定特征子集后再处理全部数据。

  2. 调整ComprehensiveFCParameters可以控制提取的特征类型,平衡计算成本和特征丰富度。

  3. 特征选择后建议人工检查保留的特征,理解其物理意义是否符合领域知识。

  4. 考虑将tsfresh特征与传统领域专家特征结合,可能获得更好的模型性能。

通过本文介绍的方法,工程师可以系统地从时间序列数据中提取和选择有意义的特征,为后续的预测性维护、异常检测等应用奠定基础。

tsfresh Automatic extraction of relevant features from time series: tsfresh 项目地址: https://gitcode.com/gh_mirrors/ts/tsfresh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左唯妃Stan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值