pyts入门之时间序列的简单特征提取(一) 您所在的位置:网站首页 piecewise是什么意思 pyts入门之时间序列的简单特征提取(一)

pyts入门之时间序列的简单特征提取(一)

2024-07-11 02:30| 来源: 网络整理| 查看: 265

简介

pyts简单的说就是打包了多种时间序列分类和处理算法的类scikit-learn库,国内介绍该库的文档相对较少,所以本人打算开一个新坑,在学习的同时结合自身的理解介绍pyts库的主要api和功能。

那么在进入正题前先介绍一下pyts的基本概念,定义时间序列(x1,x2,x3…,xn),如果一个时间序列只有一个特征,那么xi属于实数集R,该时间序列为单变量时间序列,如果一个时间序列有多个特征,那么xi属于R^d,d指维度,xi为一个d维向量,该时间序列为多元时间序列(比如一串GPS就有纬度和经度两个坐标特征)。

处理单个特征和多个特征的算法是不同的,pyts中提供的大多数算法适用于单个特征。此外在一个时间序列数据集中,会存在长度不等的时间序列和长度相等的时间序列,pyts中的算法也集中于处理长度相等的时间序列,至于长度不等的如前文介绍过的dtw算法就可以处理。

接下来介绍pyts的输入和输出。对于单个变量的时间序列,输入为(n个样本,n个时间戳),对于多个变量的时间序列,输入为(n个样本,n个特征,n个时间戳),对于分类的输出为,一维的0或1组成的向量。

此外可能有人会问,我们不能以传统的机器学习算法来进行时间序列的分类吗?答案是可以,比如启发式KNN就有不错的效果,但是关键点在于时间序列本身存在很高的自相关性,所以不适合用传统的机器学习算法来解决。

那么本节,我们将进行时间序列的特征工程的基础篇,Approximating time series(近似时间序列)。

实践 pip install pyts 或 conda install -c conda-forge pyts 或 git clone https://github.com/johannfaouzi/pyts.git cd pyts pip install . #安装完后可pytest pyts测试能否正常运行

首先是安装环节,这个库的安装非常简单,虽然官方提供了三种方式,不过直接用pip安装是最快的。 安装好之后进入正题,第一篇,近似时间序列,也即对未处理的时间序列进行简单的数据预处理,在保留数据主要特征的同时清理掉数据中的噪声,当然,不同的算法对数据的基本要求是不一样的,怎么灵活的处理在这里就不讨论了,今天来介绍几种基本的处理方式。

方式一:Piecewise Aggregate Approximation(分段聚合近似) 理解:分段,或者说窗口,比如每两个时间点为一个窗口,再对该窗口进行聚合操作(Aggregate这个词最早在SQL数据库里接触到,聚合函数,即sum(),count()之类的),以此来逼近原始序列,具体是怎么样呢? 例子:

from pyts.approximation import PiecewiseAggregateApproximation import matplotlib.pyplot as plt import numpy as np X = np.array([0, 4, 2, 1, 7, 6, 3, 5,2, 5, 4, 5, 3, 4, 2, 3]) n_timestamps = len(X) #时间戳长度就是有多少个数字 window_size = 2 #定义窗口大小为2 transformer = PiecewiseAggregateApproximation(window_size=window_size) #实例化 X_transform = transformer.transform(X.reshape(1,-1)) #转换 #print(x_transform)转换后结果 #array([[2. , 1.5, 6.5, 4. , 3.5, 4.5, 3.5, 2.5]]) #下面是作图部分 plt.plot(X,'o--',label='Original') #o--定义线条的style plt.plot(np.arange(window_size // 2,n_timestamps + window_size // 2,window_size),X_transform[0],'o--',label='PAA') plt.legend(loc='best', fontsize=10) #loc='best'自动寻找最好的位置 plt.xlabel('Time', fontsize=12) plt.title('Piecewise Aggregate Approximation', fontsize=16) plt.vlines(np.arange(0, n_timestamps, window_size)-0.5, #-0.5往左移动看的清楚 X.min(), X.max(), color='g', linestyles='--', linewidth=0.5) #图中的绿线

在这里插入图片描述 上面的窗口为2,所以每两个数字进行一次聚合,(0+4)/2 = 2,(2+1)/2=1.5…以此类推,把十六个数字的序列变成了八个数字,是不是非常简单?而且也可以发现它的使用方法和sklearn基本一致,都是先实例化一个class,然后调用继承的通用方法进行转换,十分简单。 图中也可以非常清晰的看到两个蓝色的点变成了一个橙色的点,也就是我们转换后的值,至于作图过程能注释的都注释了,此外新手在学习时要千万注意数组的shape,为什么在代码中要先X.reshape(1,-1),和为什么取x_transform[0],这里就留给大家自己探索吧。

相关参数说明: class pyts.approximation.PiecewiseAggregateApproximation(window_size=1, output_size=None, overlapping=True)

参数说明window_size=1窗口大小默认为1,若为浮点数则为转换后百分比output_size=None返回时间序列的大小,如果定义了window_size则忽略该参数overlapping=True若为False,在一些情况下窗口大小是变化的

方法二:Symbolic Aggregate approximation(符号聚合近似) 理解:其实就是数据分箱,即把一串连续的数据转换为不同等级的数据。比如1,3,3,5,5,7就可以分为四个等级,A,B,C,D,一个数字代表一类,或者三个等级,A(1),B(3,5),C(7),或者两个等级,A(1,3),B(5,7)。 例子:

import numpy as np import matplotlib.lines as mlines import matplotlib.pyplot as plt from scipy.stats import norm from pyts.approximation import SymbolicAggregateApproximation X = np.array([[0, 4, 2, 1, 7, 6, 3, 5], [2, 5, 4, 5, 3, 4, 2, 3]]) n_bins = 4 sax = SymbolicAggregateApproximation(n_bins=n_bins) X_sax = sax.fit_transform(X) #print(X_sax) #array([['a', 'c', 'b', 'a', 'd', 'd', 'b', 'c'], #['a', 'd', 'c', 'd', 'b', 'c', 'a', 'b']], dtype='


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有