查看原文
其他

大神们都是如何在时间序列中进行特征提取的?看完就懂了!

Sharmistha CSDN云计算 2020-12-18

作者 |Sharmistha Chatterjee
翻译 | 火火酱~,责编 | 晋兆雨
出品 | CSDN云计算
头图 | 付费下载于视觉中国


介绍


现在,对于各类机构而言,需要收集的数据越来越多,并且时常需要检测不寻常或异常的时间序列。例如,雅虎就拥有大量邮件服务器,并且对其进行实时监控。为了识别运行异常的服务器/设备,每小时都要从每一台服务器中收集大量关于服务器/IoT设备性能的测量数据。

Python库tsfeature可以协助我们计算每个时间序列上的特征向量,测量序列的不同特征,包括滞后相关性、季节性强度、光谱熵等。

在本文中,我们将讨论时间序列中不同的特征提取技术,并以两个不同的时间序列为例进行演示。


常用的特征提取指标


数据科学中最常用的特征提取机制之一—主成分分析法(Principal Component Analysis,PCA)也被用于时间序列特征提取。对特征进行主成分分析后,可以对前两个主成分应用多种双变量离群值检测方法。这样就可以根据其特征向量,识别出最不寻常的序列。使用的双变量离群值检测方法以最高密度区域为基础进行的。

在使用ARIMA等经典方法对时间序列进行建模时,方差或波动率随时间的变化可能会导致一些问题。

ARCH(Autoregressive Conditional Heteroskedasticity)方法在股票预测等波动性高的时间序列模型中起着至关重要的作用,它可以用来测量随时间变化的方差,如波动率的增减。

接下来,我们将介绍一些时间序列特征、功能及相关信息。

下面这段代码展示了我们如何使用一行代码来提取相关特征。

源代码

tsf_hp = tf.holt_parameters(df2['# Direct_1'].values)
print(tsf_hp)

tsf_centrpy = tf.count_entropy(df2['# Direct_1'].values)
print(tsf_centrpy)

tsf_crossing_points =tf.crossing_points(df2['# Direct_1'].values)
print(tsf_centrpy)

tsf_entropy =tf.entropy(df2['# Direct_1'].values)
print(tsf_entropy)

tsf_flat_spots =tf.flat_spots(df2['# Direct_1'].values)
print(tsf_flat_spots)

tsf_frequency =tf.frequency(df2['# Direct_1'].values)
print(tsf_frequency)

tsf_heterogeneity = tf.heterogeneity(df2['# Direct_1'].values)
print(tsf_heterogeneity)

tsf_guerrero =tf.guerrero(df2['# Direct_1'].values)
print(tsf_guerrero)

tsf_hurst = tf.hurst(df2['# Direct_1'].values)
print(tsf_hurst)

tsf_hw_parameters = tf.hw_parameters(df2['# Direct_1'].values)
print(tsf_hw_parameters)

tsf_intv = tf.intervals(df2['# Direct_1'].values)
print(tsf_intv)

tsf_lmp = tf.lumpiness(df2['# Direct_1'].values)
print(tsf_lmp)

tsf_acf = tf.acf_features(df2['# Direct_1'].values)
print(tsf_acf)

tsf_arch_stat = tf.arch_stat(df2['# Direct_1'].values)
print(tsf_arch_stat)

tsf_pacf = tf.pacf_features(df2['# Direct_1'].values)
print(tsf_pacf)

tsf_sparsity = tf.sparsity(df2['# Direct_1'].values)
print(tsf_sparsity)

tsf_stability = tf.stability(df2['# Direct_1'].values)
print(tsf_stability)

tsf_stl_features = tf.stl_features(df2['# Direct_1'].values)
print(tsf_stl_features)

tsf_unitroot_kpss = tf.unitroot_kpss(df2['# Direct_1'].values)
print(tsf_unitroot_kpss)

tsf_unitroot_pp = tf.unitroot_pp(df2['# Direct_1'].values)
print(tsf_unitroot_pp)

其结果表明了从胎儿心电图(Fetal ECG)中提取的特征值。

结果时间序列-1(数据来自Fetal ECG)

下图显示了从Fetal ECG中收集的时间序列数据,从中提取了特征。

{'alpha': 0.9998016430979507, 'beta': 0.5262228301908355}
{'count_entropy': 1.783469256071135}
{'crossing_points': 436}
{'entropy': 0.6493414196542769}
{'flat_spots': 131}
{'frequency': 1}
{'arch_acf': 0.3347171050143251, 'garch_acf': 0.3347171050143251, 'arch_r2': 0.14089508110660665, 'garch_r2': 0.14089508110660665}
{'hurst': 0.4931972012451876}
{'hw_alpha': nan, 'hw_beta': nan, 'hw_gamma': nan}
{'intervals_mean': 2516.801557547009, 'intervals_sd': nan}
{'guerrero': nan}
{'lumpiness': 0.01205944072461473}
{'x_acf1': 0.8262122472240574, 'x_acf10': 3.079891123506255, 'diff1_acf1': -0.27648384824011435, 'diff1_acf10': 0.08236265771293629, 'diff2_acf1': -0.5980110240921641, 'diff2_acf10': 0.3724461872893135}
{'arch_lm': 0.7064704126082555}
{'x_pacf5': 0.7303549429779813, 'diff1x_pacf5': 0.09311680507880443, 'diff2x_pacf5': 0.7105000333917864}
{'sparsity': 0.0}
{'stability': 0.16986190432765097}
{'nperiods': 0, 'seasonal_period': 1, 'trend': nan, 'spike': nan, 'linearity': nan, 'curvature': nan, 'e_acf1': nan, 'e_acf10': nan}
{'unitroot_kpss': 0.06485903737928193}
{'unitroot_pp': -908.3309773009415}

结果表明了与日期温度变化相关的提取的特征值。

结果时间序列-2(数据来自每日气温)

{'alpha': 0.4387345064923509, 'beta': 0.0}
{'count_entropy': -101348.71338310161}
{'crossing_points': 706}
{'entropy': 0.5089893350876903}
{'flat_spots': 10}
{'frequency': 1}
{'arch_acf': 0.016273743642920828, 'garch_acf': 0.016273743642920828, 'arch_r2': 0.015091960217949008, 'garch_r2': 0.015091960217949008}
{'hurst': 0.5716257806690483}
{'hw_alpha': nan, 'hw_beta': nan, 'hw_gamma': nan}
{'intervals_mean': 1216.0, 'intervals_sd': 1299.2740280633643}
{'guerrero': nan}
{'lumpiness': 5.464398615083545e-05}
{'x_acf1': -0.0005483958183129098, 'x_acf10': 3.0147995912148108e-06, 'diff1_acf1': -0.5, 'diff1_acf10': 0.25, 'diff2_acf1': -0.6666666666666666, 'diff2_acf10': 0.4722222222222222}
{'arch_lm': 3.6528279285796827e-06}
{'nonlinearity': 0.0}
{'x_pacf5': 1.5086491342316237e-06, 'diff1x_pacf5': 0.49138888888888893, 'diff2x_pacf5': 1.04718820861678}
{'sparsity': 0.0}
{'stability': 5.464398615083545e-05}
{'nperiods': 0, 'seasonal_period': 1, 'trend': nan, 'spike': nan, 'linearity': nan, 'curvature': nan, 'e_acf1': nan, 'e_acf10': nan}
{'unitroot_kpss': 0.29884876591708787}
{'unitroot_pp': -3643.7791982866393}


总结


  • 在上文中,我们讨论了从时间序列(两个时间序列都具有季节性=1)中提取特征的简单步骤,这可以帮助我们发现异常现象。

  • 从计算出的指标中不难看出,第一个序列更加稳定(稳定性和熵给出的值更高),因为时间戳数据的周期较长,与整个周期相比,其波动相对较小。

  • 第二个时间序列显示出了更高的波动性,表现为交叉点较多。

  • 因此,我们还观察到,第二个时间序列的块度和区间均值也较低,这表示其方差的方差更小。unirooot_kpss和unirooot_kpss表明,向量中存在单位根,在两个时间序列中分别小于1和为负数。

  • tsfeature还支持对以NumPy数组形式输入的自定义函数进行求值,并返回一个以特征名为键及其值的字典。

参考文献

  • https://github.com/FedericoGarza/tsfeatureshttps://htmlpreview.github.io/?

  • https://github.com/robjhyndman/M4metalearning/blob/master/docs/M4_methodology.html#features

  • https://cran.r-project.org/web/packages/tsfeatures/tsfeatures.pdf

  • https://robjhyndman.com/papers/icdm2015.pdf

  • https://math.berkeley.edu/~btw/thesis4.pdf

  • https://machinelearningmastery.com/develop-arch-and-garch-models-for-time-series-forecasting-in-python/

  • https://ir.nctu.edu.tw/bitstream/11536/14555/1/A1997YD78100005.pdf

  • Principal Component Analysis for Time Series and Other Non-Independent Data – https://link.springer.com/chapter/10.1007%2F0-387-22440-8_12

原文链接:https://hackernoon.com/key-tactics-the-pros-use-for-feature-extraction-from-time-series-e7q3wfr

本文由CSDN云计算翻译,转载请注明出处


更多阅读推荐

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存