时间序列实战(四)

我们实际中一个时间序列可能有上千种特征,我们很难一个个提取,可以使用TSFRESH库帮我们提取时间序列 特征,这个库能提取的特征包括最大最小值,均值,峰值数目,中位数等等,据说能够提取出超过4000种特征,官方文档戳这里

我们首先导入一堆包:

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from tsfresh.examples.robot_execution_failures import download_robot_execution_failures, load_robot_execution_failures
from tsfresh.utilities.dataframe_functions import impute
from tsfresh.feature_extraction import ComprehensiveFCParameters
from tsfresh import extract_features, extract_relevant_features, select_features

然后远程加载数据集:

1
2
3
download_robot_execution_failures()
df, y = load_robot_execution_failures()
df.head()

得到的数据长这样:

image-20200828233524683

我们的目的是预测时间序列数据是否为异常值,首先我们需要看看啥样的数据是正常的啥样是异常的:

1
2
df[df.id==3][["time", "F_x", "F_y", "F_z", "T_x", "T_y", "T_z"]].plot(x="time", title="Success example (id 3)", figsize=(12, 6));
df[df.id==20][["time", "F_x", "F_y", "F_z", "T_x", "T_y", "T_z"]].plot(x="time", title="Success example (id 20)", figsize=(12, 6))

第一个是正常的,第二个是异常的,我们人眼应该是很容易区分的,接下来我们基于时间序列做特征提取:

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

然后就会出现一个特征提取的进度条,完成了特征提取,打印一下X看看结果是啥:

image-20200828234027149

这里一共提取出了 4578种时间序列特征,接下来我们需要筛选特征,提取最相关特征:

1
X_filtered = extract_relevant_features(df, y, column_id="id", column_sort="time", default_fc_parameters=extraction_settings)

代码和前面的没啥区别,提取完之后还剩下635个特征:

image-20200828234350277

接下来将数据进行train_test_split等一系列分类常规操作完成分类:

1
2
3
4
X_train, X_test, X_filtered_train, X_filtered_test, y_train, y_test = train_test_split(X, X_filtered, y, test_size=.4)
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
print(classification_report(y_test, clf.predict(X_test)))

打印结果如下:

1
2
3
4
5
6
7
8
              precision    recall  f1-score   support

False 0.97 1.00 0.98 28
True 1.00 0.88 0.93 8

accuracy 0.97 36
macro avg 0.98 0.94 0.96 36
weighted avg 0.97 0.97 0.97 36

可以看到结果还是很不错的~我们看看经过filtered处理后的结果:

1
2
3
clf = DecisionTreeClassifier()
clf.fit(X_filtered_train, y_train)
print(classification_report(y_test, clf.predict(X_filtered_test)))

打印输出和前面的一模一样===

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020 chenk
  • 由 帅气的CK本尊 强力驱动
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信