快速开始

安装 tsfresh

由于编译后的 tsfresh 包托管在 Python Package Index (PyPI) 上,您可以使用 pip 轻松安装它

pip install tsfresh

如果您需要处理可能不适合内存的大型时间序列数据,请使用 Dask 安装 tsfresh

pip install tsfresh[dask]

另请参阅 大型输入数据

深入了解

在详细阅读文档之前,您可以直接通过以下示例深入了解 tsfresh

我们得到一个包含机器人故障的数据集,如 [1] 中所述。每个机器人记录来自六个不同传感器的时间序列。对于由不同 id 表示的每个样本,我们将分类机器人是否报告故障。从机器学习的角度来看,我们的目标是分类每组时间序列。

首先,我们将数据加载到 python 中

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()

并得到一个形状如下的 pandas.DataFrame timeseries

print(timeseries.head())

id

time

F_x

F_y

F_z

T_x

T_y

T_z

0

1

0

-1

-1

63

-3

-1

0

1

1

1

0

0

62

-3

-1

0

2

1

2

-1

-1

61

-3

0

0

3

1

3

-1

-1

63

-2

-1

0

4

1

4

-1

-1

63

-3

-1

0

第一列是 DataFrame 索引,在此没有意义。不同传感器有六个不同的时间序列(F_x, F_y, F_z, T_x, T_y, T_z)。不同的机器人由 ids 列表示。

另一方面,y 包含哪个机器人 id 报告了故障而哪个没有的信息

1

0

2

0

3

0

4

0

5

0

这里,ids 为 1 到 5 的样本没有报告故障。

下面我们展示 id 为 3 的样本报告无故障的时间序列

import matplotlib.pyplot as plt
timeseries[timeseries['id'] == 3].plot(subplots=True, sharex=True, figsize=(10,10))
plt.show()
the time series for id 3 (no failure)

以及 id 为 20 的样本报告故障的时间序列

timeseries[timeseries['id'] == 20].plot(subplots=True, sharex=True, figsize=(10,10))
plt.show()
the time series for id 20 (failure)

您已经可以通过肉眼看到一些差异 - 但为了成功的机器学习,我们需要将这些差异转化为数字。

为此,tsfresh 应运而生。它允许我们自动为每个机器人从这六个不同的时间序列中提取超过 1200 个特征。

要提取所有特征,我们执行以下操作

from tsfresh import extract_features
extracted_features = extract_features(timeseries, column_id="id", column_sort="time")

您将得到一个包含 1200 多个不同提取特征的 DataFrame extracted_features。现在我们将首先移除所有 NaN 值(这些值是由无法用于给定数据的特征计算器生成的,例如,因为统计量过低),然后只选择相关的特征

from tsfresh import select_features
from tsfresh.utilities.dataframe_functions import impute

impute(extracted_features)
features_filtered = select_features(extracted_features, y)

只有大约 300 个特征被认为足够相关。

此外,您甚至可以使用 tsfresh.extract_relevant_features() 函数同时执行特征提取、填充和过滤

from tsfresh import extract_relevant_features

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

您现在可以使用 DataFrame features_filtered (与 features_filtered_direct 相同) 中的特征结合 y 来训练您的分类模型。您可以在 Jupyter notebook 01 Feature Extraction and Selection.ipynb 中找到一个示例,我们在其中使用提取的特征训练了一个 RandomForestClassifier。

参考资料