如何使用特征提取对时间序列进行分类

star2017 1年前 ⋅ 2406 阅读

当您要对时间序列进行分类时,有两种选择。一种是使用时间序列特定的方法。一个例子是 LSTM,或者一般的循环神经网络。另一种是从系列中提取特征,并将它们与正常的监督学习一起使用。在本文中,我们将了解如何使用名为 tsfresh 的 Python 包自动提取相关特征。

我们使用的数据集来自时间序列分类存储库该站点提供了每个数据集达到的最佳准确度的信息。对于我们尝试的每个数据集,我们似乎都获得了接近最先进水平的结果,或者更好。

时间序列比标准任务更棘手,因为根据定义,示例不是独立的(它们彼此的时间越近,它们就越相互依赖)。想想温度。如果今天是 20 摄氏度,明天可能是 15 或 25 摄氏度,但可能不会是 5 或 35 摄氏度,即使这些温度可能会在一年中的另一个时间发生。

这意味着我们不能使用普通分类器,因为普通分类器假设独立的例子。此外,数据结构更深一层。在分类中,一个例子不是一个单一的点,它是一个由多个点(步骤)组成的时间序列。每个步骤可能包含多个属性,例如温度、湿度和风速。

但是,我们可以通过提取特征将一个系列减少到一个点。例如,如果我们要处理一个多月的每日天气时间序列,我们可以使用以下功能:

  • 最低温度
  • 最高温度
  • 平均温度
  • 中位温度
  • 温度变化
  • 最低湿度
  • 最大湿度

而且,事实上,还有更多。正如您可能猜到的,发明和实施它们可能很乏味。幸运的是,有一个名为tsfresh的 Python 包,它可以自动提取大量功能

人们可以预期它们中的大多数是无关紧要的,因此最好选择具有预测能力的那些。Tsfresh 也这样做。注意这一步使用了分类标签,所以为了避免标签泄露,你应该首先将数据集拆分为训练和验证,只使用训练部分进行特征选择。否则您的验证结果将过于乐观。

特征提取和选择。蛇象征着时间序列数据。不可谷歌米开朗基罗的艺术。

据我们了解,tsfresh 使用成对(特征-目标)显着性检验进行选择。如果目标碰巧仅由特征的相互作用而不是由任何一个单独的特征确定,这可能会带来问题。

在实践中

我们抓取了三个最大的数据集:FordA、FordB 和 Wafer。存储库中的时间序列似乎都是一维的(例如,温度或湿度,但不是两者兼有)。在此设置中,每个系列都是 CSV 文件中的一行,列代表时间步长:

In [9]: d.head()
Out[9]:
       0       1        2        3
0  1.01430  1.0143  1.01430  1.01430
1 -0.88485 -1.0375 -0.97771 -1.01690
2  0.58040  0.5804  0.59777  0.59777
3 -0.88390 -1.0371 -0.97998 -1.01210
4  1.10500  1.2856  1.19630  1.25610

因此,我们需要重塑数据:

d = d.stack()
d.index.rename([ 'id', 'time' ], inplace = True )
d = d.reset_index()

获取 tsfresh 格式:

In [11]: d.head()
Out[11]:
   id  time       0
0   0     0  1.0143
1   0     1  1.0143
2   0     2  1.0143
3   0     3  1.0143
4   0     4  1.0143

特征提取和选择是计算密集型的,因此 tsfresh并行执行这样做的副产品是需要以if __name__ == '__main__':风格编写程序,否则多处理会失控。或者,可以将n_jobs参数设置为 1。

特别是特征提取步骤需要很长时间。

f = extract_features( d, column_id = "id", column_sort = "time" )
# Feature Extraction: 20it [22:33, 67.67s/it]

一些特征构造函数输出空值。为了处理它们,tsfresh 提供了 impute() 函数。

impute( f )
assert f.isnull().sum().sum() == 0

选择时,有一个超参数需要调整:fdr_level是所有创建的特征中不相关特征的理论预期百分比默认情况下,它设置得非常低,为 5%。只要我们的下游分类器能够处理非信息性特征(哪个不是?),我们可能希望增加fdr_level,具体取决于我们从选择中获得的许多特征,增加到 0.5,甚至 0.9。另一方面,我们希望样本与特征的比率尽可能高,以获得最佳泛化并避免维数灾难。

In [2]: run select_features.py
loading data/wafer/features.csv
selecting features...
selected 247 features.
saving data/wafer/train.csv
saving data/wafer/test.csv

选定的特征,分为训练集和测试集。尼古拉·巴特拉姆的艺术作品。

之后,我们可以自由地训练和评估一些分类器。在缩放特征上运行的逻辑回归通常工作正常。

完整的代码可以在GitHub上。它应该适用于时间序列存储库中的所有 [二进制分类] 数据集,因为它们都采用相同的格式。只需在下载后从 CSV 文件中删除 ARFF 标头即可。


相关文章推荐

全部评论: 0

    我有话说: