长文总结:时间序列分类的实践指南(附Python代码)

长文总结:时间序列分类的实践指南(附Python代码)

简介

我们大多数人所接触的时间序列数据主要用于生成预测。无论是预测产品的需求或销售,航空公司的乘客数量,还是某只股票的收盘价,我们都习惯于利用成熟的时间序列技术来预测需求。

但是,随着生成的数据量呈指数级增长,尝试新思想和新算法的机会也随之增加。处理复杂的时间序列数据集仍然是一个有潜力的领域,扩展您的库以包含新想法总是有帮助的。

我在这篇文章中要做的就是向你们介绍时间序列分类的创新概念。我们将首先了解这个主题的含义和它在行业中的应用。但是,我们不会停留在理论部分—我们将着手处理时间序列数据集并执行二进制时间序列分类。边做边学——这也会帮助你以实践的方式理解这个概念。

如果你以前没有研究过时间序列问题,我强烈建议你先从一些基本的预测开始。你可以先看看这篇文章: A comprehensive beginner’s guide to create a Time Series Forecast (with Codes in Python)。

目录

1. 时间序列分类简介
    a. ECG信号
    b. 图像数据
    c. 传感器
2. 问题描述
3. 读取和理解数据
4. 预先处理
5. 建立时间序列分类模型

时间序列分类简介

 时间序列分类实际上已经存在一段时间了。但到目前为止,它主要局限于实验室研究,而不是工业应用。不过由于有很多研究正在进行,新的数据集正在创建,一些新的算法也正在提出。当我第一次遇到时间序列分类的概念时,我最初的想法是:我们如何对时间序列进行分类?时间序列分类的数据是什么样子的?

可以想象,时间序列分类数据不同于常规分类问题,因为属性具有有序的序列。让我们来看看一些时间序列分类用例来理解这种差异。

1) ECG/EEG信号分类

心电图(ECG,Electrocardiogram)记录着心脏的电活动,被广泛地用于诊断各种心脏问题。这些心电信号是用外部电极捕捉的。例如,考虑下面的信号样本,它表示一个心跳的电活动。左边的图像表示正常的心跳,而相邻的图像表示心肌梗死。

从电极上采集的数据是时间序列形式的,信号可以分为不同的类别。我们还可以对记录大脑电活动的脑电波(EEG)信号进行分类。

2) 图像数据

图像也可以是时间序列相关的格式。考虑以下场景:

作物生长在特定的领域取决于天气条件、土壤肥力、水的可用性和其他外部因素。这片土地的照片是连续5年每天拍摄的,并标有种植在这片土地上的作物的名称。数据集中的图像是在固定的时间间隔后拍摄的,并且有一个确定的序列,这是对图像进行分类的一个重要因素。

3) 动作传感器数据分类

传感器产生高频数据,可以识别出物体在其范围内的运动。通过设置多个无线传感器,观察传感器信号强度的变化,可以识别出物体的运动方向。

你还能想到什么其他的应用我们可以应用时间序列分类?请在文章下面的评论部分告诉我们。

问题描述

下面我们以“室内用户运动预测”这个问题为例。在这个挑战中,多个运动传感器被放置在不同的房间中,目标是根据从这些运动传感器捕捉到的频率数据来识别一个人是否在房间中移动过。

一共有四个运动传感器(A1、A2、A3、A4)分布在两个房间。请看下图,它说明了传感器在每个房间的位置。这两个房间的设置是在3对不同的房间组中创建的(group1、group2、group3)。

一个人可以沿着上图所示的六个预定义路径中的任意一条移动。如果一个人走在2号、3号、4号或6号路上,他就会在房间里移动。另一方面,如果一个人遵循路径1或路径5,我们可以说这个人已经在房间之间移动了。

传感器读数可以用来识别一个人在给定时间点的位置。当人在房间里走动或穿越房间时,传感器中的读数会发生变化。此更改可用于标识人员的路径。

现在问题陈述已经很清楚了,是时候开始编写代码了!在下一节中,我们将查看问题的数据集,它将帮助您清除关于此语句的任何遗留问题。您可以从这个链接下载数据集:https://archive.ics.uci.edu/ml/datasets/Indoor+User+Movement+Prediction+from+RSS+data.

读取和理解数据

我们的数据集包括316个文件:

     · 314个MovementAAL 数据集,包含环境中运动传感器的读数
    · 包含每个MovementAAL文件的目标变量的Target 数据集
    · 一个Group数据集来标识不同的移动文件属于哪个设置组
    · 包含对象所取路径的路径数据文件

让我们看一下数据集。我们将从导入对应的数据库开始。

Python Code:

在载入数据之前,我们一个快速看一下我们要处理的数据。读取移动数据的前两个文件:

这些文件包含来自四个传感器(A1、A2、A3、A4)的标准化数据。csv文件的长度(行数)不同,因为每个csv对应的数据的持续时间不同。为了简化问题,让我们假设每秒钟收集一次传感器数据。第一次读取持续时间为27秒(即27行),而另一次读取持续时间为26秒(即26行)。

在建立模型之前,我们必须处理这个变化的长度。现在,我们将使用以下代码块从传感器中读取并存储列表的值:

我们现在有一个“序列”,它包含了动作传感器的数据和包含数据文件标签的“Targets”。当我们print Sequences【0】时,我们可以从第一个文件里获得传感器的值:

如前所述,数据集是在三对不同的房间组中收集的,因此分为三组。此信息可用于将数据集划分为训练集、测试集和验证集。我们现在加载数据组csv文件:

我们将取前两组数据用于训练集,取第三组数据用于测试集。

预先处理

由于时间序列数据的长度是变化的,我们不能直接在这个数据集上建立模型。那么如何确定一个级数的理想长度呢?我们可以通过多种方式来解决这个问题,这里有一些想法(我很乐意在评论部分听到你的建议):

  · 用零填充较短的序列,使所有序列的长度相等。但在这种情况下,我们将向模型提供一些不正确的数据
· 找出序列的最大长度,并用最后一行中的数据填充序列
· 在数据集中确定序列的最小长度,并将所有其他序列截断到该长度。然而,这将导致数据的巨大损失
· 取所有长度的平均值,截断较长的序列,填充比平均长度短的序列求出最小、最大和平均长度

我们来找出最小、最大和平均长度:

大多数文件的长度在40到60之间。只有3个文件的长度超过100。因此,取最小或最大长度没有多大意义。第90个四分位数是60,我们把这个作为数据的序列长度。让我们把它码出来:

现在我们的数据集已经准备好,我们将会根据Group将它分开。准备好训练集,验证集和测试集:

建立时间序列分类模型

我们已经准备好了用于LSTM(长短期内存)模型的数据。我们处理可变长度序列并创建了训练、验证和测试集。让我们构建一个单层LSTM网络。

注意:您可以在本教程中熟悉LSTMs。我建议您首先完成这些操作,因为这将帮助您理解下面的代码是如何工作的。

我们现在训练我们的模型,并检测验证准确度:

我的正确率为0.78846153846153844。还算一个不错的开始,同事我们可以通过修改超参数、改变学习率或纪元数来提高LSTM模型的性能。

总结

这就是本教程的结尾。写这篇文章的目的是用一种实践的方式向你介绍一个全新的时间序列频谱。

就我个人而言,我发现预处理步骤是我们讨论过的所有步骤中最复杂的部分。然而,它也是最基本的一个(否则整个时间序列数据点都将失败!) 。同时在处理这种挑战时,向模型提供正确的数据同样重要。

原文作者:AISHWARYA SINGH

翻译作者:Holly Kong

美工编辑:星竹

校对审稿:冬冬

原文链接:https://www.analyticsvidhya.com/blog/2019/01/introduction-time-series-classification/