快速开始

安装 tsfresh

由于编译后的 tsfresh 包托管在 Python 包索引 (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

时间

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

在这里,对于ID为1到5的样本,没有报告任何故障。

在下面,我们展示了样本编号3报告无故障的时间序列:

import matplotlib.pyplot as plt
timeseries[timeseries['id'] == 3].plot(subplots=True, sharex=True, figsize=(10,10))
plt.show()
id 3 的时间序列(无故障)

对于ID 20报告的失败:

timeseries[timeseries['id'] == 20].plot(subplots=True, sharex=True, figsize=(10,10))
plt.show()
id 20 的时间序列(失败)

通过肉眼你已经可以看到一些差异 - 但对于成功的机器学习,我们必须将这些差异转化为数字。

为此,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 笔记本 01 Feature Extraction and Selection.ipynb 中找到一个示例,我们在其中使用提取的特征训练了一个 RandomForestClassifier。

参考文献