您的位置首页百科知识

基于时间序列的数据,该如何提取特征?

基于时间序列的数据,该如何提取特征?

的有关信息介绍如下:

基于时间序列的数据,该如何提取特征?

时间序列在我们的日常生活中是无处不在的,无论是个人,集体还是其他物品,总能够产生各种各样的时间序列。例如,在不同的时刻,每个人在地球上会有相应的经纬度信息,随着时间的变化,每个人的经纬度信息就会发生变化。如果用同样的时间间隔来获取这个人的经纬度信息,那么就可以得到一个时间序列。对于时间戳 而言,可以用 来表示经度,用 来表示纬度,那么 个时间戳产生的经纬度信息就是一条时间序列 。又例如大家都知道的股票,每天都有该股票的开盘价 ,收盘价 ,涨跌幅 等信息,那么将这些数据收集起来,同样可以获得时间序列 。上述两个例子属于多维时间序列的范畴,为了将重点放在介绍时间序列上,本文将重点介绍单维的时间序列,也就是每一个时间戳只对应一个值的时间序列

针对长度为 的时间序列为 , 时间序列可以有两种看法,第一种是从时间序列的定义出发,把它看成一个具有先后顺序的序列,第二种则是把时间序列是看成一个多重集合(multi-set),暂且放下它的先后顺序的关系。如果作为集合,那么 就可以看成一个多重集,意思是它的元素可以有重复。集合的势由其每个元素的重数之和组成,将该集合的元素进行打乱,其集合依然是不变的。

那么在做时间序列特征的时候,针对先后顺序可以做出一批特征,针对多重集合也可以做出另外一批特征。在不同的场景下,其特征所发挥到作用是截然不同的。

从 tsfresh 的官网上找到上图,每一条时间序列(sample)都有其原始值(raw time series),基于相应的特征工程提取工具,就可以得到加工后的特征(aggregated features)。提取时间序列特征的工具包括最大值(max),最小值(min),均值(avg)等。然后通过机器学习中的特征工程重要性的选择方法(feature importance calculation),得到相对重要的一批特征(selected features)。最后可以根据相应的分类,回归或者聚类,进行模型的训练和预测。

每一条时间序列(sample)都有其原始值(raw time series),基于相应的特征工程提取工具,就可以得到加工后的特征(aggregated features)。提取时间序列特征的工具包括最大值(max),最小值(min),均值(avg)等。然后通过机器学习中的特征工程重要性的选择方法(feature importance calculation),得到相对重要的一批特征(selected features)。最后可以根据相应的分类,回归或者聚类,进行模型的训练和预测。

通过 tsfresh,用户可以直接提取时间序列的特征,可以提取的内容包括:

tsfresh 开源工具可以提取时间序列的很多特征,开发者在工具包中开发了各种各样的特征提取方法。

如上图所示,这条时间序列对应着很多特征,例如最大值(max),最小值(min),局部最大最小值个数(number peaks),中位数(median),均值(mean)等。除此之外,基于 tsfresh,开发者还可以提取更多的时间序列特征。这些特征工程的计算方法可以在 tsfresh 的 tsfresh.feature_extraction.feature_calculators 模块找到。下面来逐步介绍这个模块的一些特征工程方法。假设时间序列用 来表示,时间戳 对应的值是 。

时间序列最容易提取的就是各种各样的统计类特征,假设时间序列用 来表示,时间戳 对应的值是 。

对于时间序列而言,像均值(mean),中位数(median),方差(variance),偏度(skewness),峰度(kurtosis)等就是统计学中的经典指标都可以作为时间序列的统计特征。用数学公式表示就是:

基于时间序列的均值,方差等特征,时间序列有许多可以归一化的方法,假设时间序列 是一个非常值序列,那么我们可以用以下方法来进行归一化:

其中 是时间序列的均值, 是时间序列的标准差(方差的平方根)。上述两个公式都可以将时间序列进行归一化,并且 成立。

特征函数 返回的是时间序列的和,用数学公式来表示就是:

特征函数 返回时间序列的值的平方和,用数学公式来表示就是

特征函数 表示计算时间序列 的平方和的均值的平方根,用数学公式表示就是:

特征函数 返回时间序列最大的绝对值, 返回时间序列最小的绝对值,用数学公式表示就是

特征函数 返回时间序列差分的绝对值之和,特征函数 返回差分的均值,特征函数 返回差分的均值,特征函数 返回二阶差分的均值,用数学公式来表示就是

与差分相关的还有函数 ,用数学公式表示就是:

如果我们想计算时间序列 是否位于某个值上方或者某个值下方,则可以考虑使用以下几个特征函数。count above,count below,count above mean,count below mean 就是用来计算时间序列的取值分布的,更精确地说则是:

特别地,如果想知道时间序列 大于或者小于某个值的最长连续长度,可以使用以下两个特征函数:

某些时候我们想知道时间序列的最大值,最小值在时间序列中的相对位置,则可以使用

, , , 这四个特征函数。它们返回的是时间序列 的最大或者最小值的相对位置,相对时间序列 的长度而言,返回的值范围是 。其中,

如果我们想知道时间序列中某个值出现的次数,可以参考特征函数 ,它返回的是时间序列 中值是 value 的个数。特别地,如果我们想知道时间序列的是否存在重复的值,就可以参考 tsfresh 中的 duplicate 类特征函数。详细来说:

如果想进一步地知道重复的点所占据的比例,可以考虑 percentage 类函数,其定义是:

如果想查看时间序列 中只出现了一次的值在全局中的占比,可以直接使用函数 ,它返回的是时间序列 中唯一值的个数除以时间序列 的长度。除了计算重复值的比例之外,也可以计算出这些重复值的和。特征函数

举例来看:

对于时间序列而言,很可能会穿越某个值 多次,所谓穿越就是时间序列的连续两个点 满足这个条件 。基于这个定义可以得到一个特征函数 ,它返回时间序列 穿越 的次数,穿越一次指的是时间序列的连续两个点,一个大于 ,另一个小于 。

由于时间序列是一个离散的序列,对于极大值点而言,可以查看它在多大的邻域内是极大值点。可以考虑特征函数 ,其中 是时间序列, 是邻域(support)的大小,该函数返回邻域 的极大值个数。例如,对于时间序列 而言,4 是邻域 1 和领域 2 的极大值(peak),但是对于邻域 3 而言,4 就不是邻域 3 的极大值。另外,特征函数 也是同样的含义,只不过在时间序列 进行小波变换之后再考虑其邻域 的极大值。

为了计算在给定的最小和最大值范围内的时间序列的点的个数,可以考虑函数 ,返回的是时间序列 在 内的点的个数,注意这个地方是左闭右开区间。除此之外,如果要查看时间序列中大于一定比例标准差的情况,可以使用函数 ,它返回的是在时间序列 中,有多少比例的点大于 ,其中 指的是时间序列的均值, 是比例值,std 指的是标准差。

如果均值和中位数偏差在一定的比例里面,时间序列 就看上去有某种对称性,函数 ,其中 是包含字典 ,其中 是一个 float 型的数字。该函数返回的是一个 boolean 的值,如果满足条件 ,则返回 1;否则返回 0。

variance_larger_than_standard_deviation:方差是否大于标准差。

基于一个滞后的参数 ,可以构造出时间序列的自相关性特征,例如:

其中 tras 表示 time_reversal_asymmetry_statistic 的简称。

由于不同的滞后系数 可以产生不同的值,所以把这些值拼接起来可以提供一个向量。特征函数 可以返回 对于 成立。

根据时间序列的 AR 模型或者线性拟合模型,其实可以得到一些特征。就先以 AR 模型为例,给定一个参数 ,用 来拟合 ,于是其方程就是:

于是,特征函数 就会返回 和对应的 值作为特征。

除了自回归函数之外,还可以使用线性拟合方法(linear_trend,linear_trend_timewise),或者小波变换(cwt_coefficient,continuous_wavelet_transform,number_cwt_peaks)的方法来获取特征。

为什么要研究时间序列的熵呢?请看下面两个时间序列:

在时间序列(1)中,1 和 2 是交替出现的,而在时间序列(2)中,1 和 2 是随机出现的。在这种情况下,时间序列(1)则更加确定,时间序列(2)则更加随机。并且在这种情况下,两个时间序列的统计特征,例如均值,方差,中位数等等则是几乎一致的,说明用之前的统计特征并不足以精准的区分这两种时间序列。

通常来说,要想描述一种确定性与不确定性,熵(entropy)是一种不错的指标。对于离散空间而言,一个系统的熵(entropy)可以这样来表示:

如果一个系统的熵(entropy)越大,说明这个系统就越混乱;如果一个系统的熵越小,那么说明这个系统就更加确定。

提到时间序列的熵特征,一般来说有几个经典的例子,那就是 binned entropy,approximate entropy,sample entropy。下面来一一介绍时间序列中这几个经典的熵。

首先,我们来看一下 Binned Entropy 的定义。从熵的定义出发,可以考虑把时间序列 的取值进行分桶的操作。例如,可以把 这个区间等分为十个小区间,那么时间序列的取值就会分散在这十个桶中。根据这个等距分桶的情况,就可以计算出这个概率分布的熵(entropy)。i.e. Binned Entropy 就可以定义为:

其中 表示时间序列 的取值落在第 个桶的比例(概率),maxbin 表示桶的个数, 表示时间序列 的长度。

如果一个时间序列的 Binned Entropy 较大,说明这一段时间序列的取值是较为均匀的分布在 之间的;如果一个时间序列的 Binned Entropy 较小,说明这一段时间序列的取值是集中在某一段上的。

其次,我们来看一下 Approximate Entropy 的定义。回到本节的问题,如何判断一个时间序列是否具备某种趋势还是随机出现呢?这就需要介绍 Approximate Entropy 的概念了,Approximate Entropy 的思想就是把一维空间的时间序列提升到高维空间中,通过高维空间的向量之间的距离或者相似度的判断,来推导出一维空间的时间序列是否存在某种趋势或者确定性。那么,我们现在可以假设时间序列 的长度是 ,同时 Approximate Entropy 函数拥有两个参数 与 ,下面来详细介绍 Approximate Entropy 的算法细节。

Step 1. 固定两个参数,正整数 和正数 ,正整数 是为了把时间序列进行一个片段的提取,正数 是表示时间序列距离的某个参数。i.e. 需要构造新的 维向量如下:

Step 2. 通过新的向量 ,可以计算出哪些向量与 较为相似。i.e.

在这里,距离 可以选择 范数。在这个场景下,距离 通常选择为 范数。

Step 3. 考虑函数

Step 4. Approximate Entropy 可以定义为:

Remark.

再次,我们来看一下 Sample Entropy 的定义。除了 Approximate Entropy,还有另外一个熵的指标可以衡量时间序列,那就是 Sample Entropy,通过自然对数的计算来表示时间序列是否具备某种自相似性。

按照以上 Approximate Entropy 的定义,可以基于 与 定义两个指标 和 ,分别是

其中, 表示集合的元素个数。根据度量 (无论是 )的定义可以知道 ,因此 Sample Entropy 总是非负数,i.e.

Remark.