时间序列分析工具包–tsfresh

Pasted image 20211127213158.png

1 简介

  • 官方文档:https://tsfresh.readthedocs.io/en/latest/index.html
  • 源码:https://github.com/blue-yonder/tsfresh
  • Star:目前 6.1K
  • 笔者推荐:看一遍官方文档,再试一下源码中的例程 tsfresh/notebooks/examples/
  • 介绍:
    • 可对应的长短不一的周期序列进行时间序列特征的提取。
    • 能够自动地从时间序列数据中提取上百种基本的时序特征,如:峰数量,均值,最值等等

2 适用性

2.1 适用

  • 自动地提取时序数据特征,扩充建模时的特征维度
  • 只基于时间序列的聚类、分类和回归任务。

2.2 不适用

  • 不适用于在线数据
  • 不适用于对时间序列数据直接训练建模(sklearn 更加适合)。
  • 不适用于高度不规则的时间序列,对于此类数据,tsfresh 可用于与时间间隔无关的特征提取(如峰值数量);但对于非等间隔的数据(如趋势)应谨慎使用。

3 安装

1
$ pip install tsfresh

目前版本为 0.18.0(21 年 12 月)

4 基本用法

4.1.1 下载数据

1
2
3
4
5
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()
Pasted image 20211205205244.png

其中 id 用于区别不同机器,time 采集数据的时间点,每个机器对应 15 个时间点(0-14);F_x, F_y, F_z, x, T_y, T_z 分别采集六个传感器的值,标签 y 标记是否故障。

(上述是为格式数据,tsfresh 还支持长格式数据,以及多类传感器拆分后的数据)

4.1.2 查看数据

对某一机器的所有优越感器序列做图:

1
timeseries[timeseries['id'] ==20].plot(subplots=True, sharex=True, figsize=(10,10))
Pasted image 20211205210456.png

通过对比可以看到不同正常和异常的情况下,传感器波形的差异。

4.1.3 特征提取

1
2
3
4
from tsfresh import extract_features
extracted_features = extract_features(timeseries, column_id="id", column_sort="time")
extracted_features.shape
# 运行结果: 88, 4722

可以看到针对 88 个不同 id 每成了 4000 多维特征。

一般情况下,输入和输出数据一般都为 dataframe 格式,column_id 用于指定时间序列所属的实体,本例中是不同机器;column_sort 用于标记时间顺序,某些功能可能仅适用于等距时间戳。如果不设置,则假定数据帧已按升序排序。

提取特征的具体定义请见:

Overview on extracted features

4.1.4 特征筛选

方法一

根据 y 筛选 X 特征(假设检验),并去掉空特征:

1
2
3
4
5
6
7
from tsfresh import select_features
from tsfresh.utilities.dataframe_functions import impute

impute(extracted_features)
features_filtered = select_features(extracted_features, y)
features_filtered.shape
# 运行结果: 88, 676

清理后可以看到还剩 600 多维特征。

方法二

也可使用 calculate_relevance_table 函数做特征选择,用法如下:

1
def calculate_relevance_table(X, y, ml_task='auto', n_jobs=1, show_warnings=False, chunksize=None, test_for_binary_target_binary_feature='fisher', test_for_binary_target_real_feature='mann', test_for_real_target_binary_feature='mann', test_for_real_target_real_feature='kendall', fdr_level=0.05, hypotheses_independent=False):

它可以针对特征和目标变量的类型,设置具体的假设检验方法,返回数据为 pandas.DataFrame,主要包括特征、特征类型、假设检验 p 值、相关性等信息。

方法三

用以下命令将特征提取和特征选择合二为一:

1
2
3
from tsfresh import extract_relevant_features

features_filtered_direct = extract_relevant_features(timeseries, y, column_id='id', column_sort='time')

tsfresh 可与 sklearn 连接使用,具体使用 sklearn 中的 pipeline 连接。

5 进阶

5.1 特征提取设置

上例中最终产生了 600 多维特征,当数据较多时,运行时间也比较长。tsfresh 提供了三种特征集:

settings.ComprehensiveFCParameters 全面参数

settings.EfficientFCParameters 有将参数

settings.MinimalFCParameters 最小参数

可以通过以下命令查看和编辑:

1
2
from tsfresh.feature_extraction import settings
settings_minimal = settings.MinimalFCParameters()

提取特征时可通过 default_fc_parameters 或 kind_to_fc_parameters 来设置提取哪些特征,如:

1
extracted_features = extract_features(timeseries, column_id="id", column_sort="time", default_fc_parameters=settings_minimal)

参数 default_fc_parameters: 用于全局配置所需计算的特征;kind_to_fc_parameters 用于单独配置每一类数据所需计算的特征(推荐使用)。

default_fc_parameters 除了指定三种特征集,还可以使用字典指定具体参数,形如:

1
2
3
4
fc_parameters = {
"length": None,
"large_standard_deviation": [{"r": 0.05}, {"r": 0.1}]
}

kind_to_fc_parameters 也使用字典指定设置项,形如:

1
2
3
4
kind_to_fc_parameters = {
"temperature": {"mean": None},
"pressure": {"maximum": None, "minimum": None}
}

5.2 特征命名

提取的出特征都依据一定的命名规则(注意单下划线和多下划线,一般包括方法、参数等),可以从处理的数据中查看提取了哪些特征。

1
settings.from_columns(extracted_features)

另外,还可以针对不同的特征设置不同的提取项,以及设置具体的提取参数,请见源码中的例程:

1
tsfresh/notebooks/examples/03%20Feature%20Extraction%20Settings.ipynb

5.3 自定义特征提取

5.3.1 实现特征提取函数

如最简单的示例:加特征提取方法,用于计算众数:

1
2
3
4
5
6
from tsfresh.feature_extraction import feature_calculators

@feature_calculators.set_property("fctype", "simple")
def mode(x):
c = Counter(x)
return tuple(x for x, count in c.items() if count == c.most_common(1)[0][1])

其中 simple 指的是简单方法:只返回单个值。

5.3.2 注册特征提取函数

方法一:

加入字典:tsfresh.feature_extraction.settings.ComprehensiveFCParameters

方法二:(推荐)

setattr(feature_calculators,name,func)

5.4 大量数据处理&并行计算

tsfresh 底层使用 numpy 而非 pandas,相对来说速度更快。但由于 numpy 不包含索引,因此丢弃了 dataframe 的索引信息,如需要使用或返回索引信息,则需要自行处理。

tsfresh 当数据量较很大时,对内存进行了优化(每次加载一些小块,其它存在磁盘上)。

tsfresh 底层也支持 dask(类似 pandas 的并行框架),但是默认使用。Dask 与 pandas 对比详见:Pandas模块替代品分析

tsfresh 默认开启了并行化,且支持分布式支持。

5.5 滑动时间窗口

待加

6 问题与解答

  • tsfresh 库 import 时很慢

    把版本从 0.18 降成 0.17 之后就好了

7 一些想法

tsfresh 确实提取了几百维时序特征,但我们还是不知应该怎么使用,全部作为特征代入模型,让模型自行筛选?

8 参考