快速开始
安装 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 20报告的失败:
timeseries[timeseries['id'] == 20].plot(subplots=True, sharex=True, figsize=(10,10))
plt.show()
通过肉眼你已经可以看到一些差异 - 但对于成功的机器学习,我们必须将这些差异转化为数字。
为此,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。
参考文献