对时间序列进行分类?这真的有可能吗?这会有什么用呢?

我们接触的大多数时间序列数据主要涉及产生预测的交易。无论是预测产品的需求还是销售额,航空公司的乘客数量或特定股票的收盘价,我们都习惯于利用久经考验的时间序列技术来预测需求。

但随着生成的数据量呈指数增长,尝试新想法和算法的机会也随之增加。使用复杂的时间序列数据集仍然是一个利基领域,扩展你的保留曲目以包含新想法总是有帮助的。

这就是本文的目的,向你介绍时间序列分类的新概念。我们将首先了解这个主题的含义以及它在行业中的应用。但是不会只停留在理论部分——我们将通过处理时间序列数据集并执行二进制时间序列分类来解决问题。边学边应用——这将有助于你以实际的方式理解这个概念。

时间序列分类介绍

时间序列分类实际上已经存在了一段时间。但到目前为止,它主要限于研究实验室,而没有进行行业应用。但是有很多研究正在进行,正在创建新的数据集并提出了许多新的算法。

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

1.对心电图(ECG/EEG)信号进行分类

心电图或心电图记录心脏的电活动,广泛用于诊断各种心脏问题。使用外部电极捕获这些心电图信号。

例如,考虑以下信号样本,它代表一个心跳的电活动。左侧的图像表示正常心跳,而与其相邻的图像表示心肌梗塞。

从电极捕获的数据将是时间序列形式,并且信号可以分类为不同的类别。我们还可以对记录大脑电活动的脑电信号进行分类。

2.图像分类

图像也可以是顺序的时间相关格式。请考虑以下情形:

根据天气条件、土壤肥力、水的可用性和其他外部因素,农作物在特定的田地中生长。这块田地被监测拍摄了5年,并标记在该字段上种植的作物的名称。 你知道为什么要这么做吗?数据集中的图像是在固定的时间间隔之后拍摄的,并且具有定义的序列,这可能是对图像进行分类的重要因素。

3.对运动传感器数据进行分类

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

设置问题陈述

我们将致力于“室内用户运动预测”问题。在该挑战中,多个运动传感器被放置在不同的房间中,并且目标是基于从这些运动传感器捕获的频率数据来识别个体是否已经移动穿过房间。

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

一个人可以沿着上图中所示的六个预定义路径进行任何移动。如果一个人走在路径2,3,4或6上,他会在单个房间内移动。另一方面,如果一个人沿着路径1或路径5行进,我们可以说该人在两个房间之间移动。

传感器读数可用于识别人在给定时间点的位置。当人在房间或房间内移动时,传感器中的读数会发生变化。此更改可用于标识人员的路径。

既然这个问题陈述已经清楚了,现在是时候开始编码了!

读取和理解数据

我们的数据集有316个文件

· 314个MovementAAL csv文件,包含放置在环境中的运动传感器的读数

· Target csv文件,其中包含每个MovementAAL文件的目标变量

· 一个组数据csv文件,用于标识哪个MovementAAL文件属于哪个安装组

· Path csv文件,包含对象所采用的路径

我们来看看数据集。我们将从导入必要的数据库库开始。

import pandas as pd

import numpy as np

%matplotlib inline

import matplotlib.pyplot as plt

from os import listdir

from keras.preprocessing import sequence

import tensorflow as tf

from keras.models import Sequential

from keras.layers import Dense

from keras.layers import LSTM

from keras.optimizers import Adam

from keras.models import load_model

from keras.callbacks import ModelCheckpoint

在加载所有文件之前,让我们快速了解一下要处理的数据。从移动数据中读取前两个文件:

df1 = pd.read_csv(‘/MovementAAL/dataset/MovementAAL_RSS_1.csv')

df2 = pd.read_csv('/MovementAAL/dataset/MovementAAL_RSS_2.csv')

df1.head()

df2.head()

df1.shape, df2.shape

((27, 4), (26, 4))

这些文件包含来自四个传感器的标准化数据——A1,A2,A3,A4。csv文件的长度(行数)不同,因为对应于每个csv的数据的持续时间不同。为简化起见,我们假设每秒都会收集传感器数据。第一次读数持续27秒(所以是27行),而另一次读数持续26秒(所以是26行)。

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

path = 'MovementAAL/dataset/MovementAAL_RSS_'

sequences = list()

for i in range(1,315):

file_path = path + str(i) + '.csv'

print(file_path)

df = pd.read_csv(file_path, header=0)

values = df.values

sequences.append(values)

targets = pd.read_csv('MovementAAL/dataset/MovementAAL_target.csv')

targets = targets.values[:,1]

我们现在有一个列表“序列”,其中包含来自运动传感器的数据和“目标”,其中包含csv文件的标签。当我们打印序列[0]时,从第一个csv文件中获取传感器的值:

sequences[0]

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

groups = pd.read_csv('MovementAAL/groups/MovementAAL_DatasetGroup.csv', header=0)

groups = groups.values[:,1]

我们将前两组的数据用于培训目的,第三组用于测试。

预处理步骤

由于时间序列数据的长度不同,我们无法直接在此数据集上构建模型。那么怎样才能决定一个系列的理想长度呢?我们可以通过多种方式处理它,这里有一些想法:

· 用零填充较短的序列,使所有序列的长度相等。在这种情况下,我们将向模型提供不正确的数据。

· 查找序列的最大长度,并使用最后一行中的数据填充序列。

· 确定数据集中序列的最小长度,并将所有其他序列截断为该长度。但是,这将导致数据的巨大损失。

· 取所有长度的平均值,截断较长的系列,并填充比平均长度短的序列。

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

len_sequences = []

for one_seq in sequences:

len_sequences.append(len(one_seq))

pd.Series(len_sequences).describe()

count 314.000000

mean 42.028662

std 16.185303

min 19.000000

25% 26.000000

50% 41.000000

75% 56.000000

max 129.000000

dtype: float64

大多数文件的长度在40到60之间。只有3个文件的长度超过100。因此,采用最小或最大长度没有多大意义。第90个四分位数为60,这被视为数据序列的长度。我们来编代码:

#Padding the sequence with the values in last row to max length

to_pad = 129

new_seq = []

for one_seq in sequences:

len_one_seq = len(one_seq)

last_val = one_seq[-1]

n = to_pad - len_one_seq

to_concat = np.repeat(one_seq[-1], n).reshape(4, n).transpose()

new_one_seq = np.concatenate([one_seq, to_concat])

new_seq.append(new_one_seq)

final_seq = np.stack(new_seq)

#truncate the sequence to length 60

from keras.preprocessing import sequence

seq_len = 60

final_seq=sequence.pad_sequences(final_seq, maxlen=seq_len, padding='post', dtype='float', truncating='post')

既然数据集已准备好,我们将根据组将其分开。准备训练、验证和测试集:

train = [final_seq[i] for i in range(len(groups)) if (groups[i]==2)]

validation = [final_seq[i] for i in range(len(groups)) if groups[i]==1]

test = [final_seq[i] for i in range(len(groups)) if groups[i]==3]

train_target = [targets[i] for i in range(len(groups)) if (groups[i]==2)]

validation_target = [targets[i] for i in range(len(groups)) if groups[i]==1]

test_target = [targets[i] for i in range(len(groups)) if groups[i]==3]

train = np.array(train)

validation = np.array(validation)

test = np.array(test)

train_target = np.array(train_target)

train_target = (train_target+1)/2

validation_target = np.array(validation_target)

validation_target = (validation_target+1)/2

test_target = np.array(test_target)

test_target = (test_target+1)/2

构建时间序列分类模型

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

model = Sequential()

model.add(LSTM(256, input_shape=(seq_len, 4)))

model.add(Dense(1, activation='sigmoid'))

model.summary()

我们现在将训练模型并监控验证的准确性:

adam = Adam(lr=0.001)

chk = ModelCheckpoint('best_model.pkl', monitor='val_acc', save_best_only=True, mode='max', verbose=1)

model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy'])

model.fit(train, train_target, epochs=200, batch_size=128, callbacks=[chk], validation_data=(validation,validation_target))

#loading the model and checking accuracy on the test data

model = load_model('best_model.pkl')

from sklearn.metrics import accuracy_score

test_preds = model.predict_classes(test)

accuracy_score(test_target, test_preds)

这里的准确度得分为0.78846153846153844。这是一个非常有前景的开始,但我们肯定可以通过使用超参数,改变学习速度和/或时代数来改善LSTM模型的性能。

总结

预处理步骤是所有部分中最复杂的。然而,它也是最重要的一个(否则整个时间序列数据将会失败)。在处理此类挑战时,向模型提供正确的数据同样重要。

python平均入门时间_理论+Python代码详解:入门时间序列分类相关推荐

  1. 从PointNet到PointNet++理论及代码详解

    从PointNet到PointNet++理论及代码详解 1. 点云是什么 1.1 三维数据的表现形式 1.2 为什么使用点云 1.3 点云上以往的相关工作 2. PointNet 2.1 基于点云的置 ...

  2. VINS理论与代码详解2——单目视觉跟踪

    VINS理论与代码详解2--单目视觉跟踪 一.Feature_tracker文件夹中 首先讲第一部分,也就是纯粹的图像处理部分内容,在论文中的第IV点观测值预处理的A部分视觉前端处理,为了更好的理解代 ...

  3. nodeJS入门——新建一个项目及代码详解

     nodeJS入门--新建一个项目及代码详解 有了解nodejs的童鞋们知道,nodejs有很多的依赖,那么我们在新建一个项目的时候,如何快速的导入这些依赖从而创建一个nodejs项目呢,接下来会 ...

  4. python 制作抽奖_python制作抽奖程序代码详解

    实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按钮添加到界面中去,想必这对于学过tkinter的同学应该不难 ...

  5. 寄存器(3)KDB入门+MIPS汇编及汇编代码详解

    KDB入门和MIPS汇编 1. KDB 介绍及进入退出命令 1.1 KDB 介绍 1.2 进入KDB及退出KDB 2. KDB 调试 2.1 断点类 2.2 内存操作类 md 2.3 堆栈跟踪类 2. ...

  6. python计算计算时间_用Python向孩子介绍计算思维

    python计算计算时间 底特律公共图书馆的帕克曼分馆在暑假期间被无聊的孩子拿走了所有计算机所淹没,图书馆认为这不是问题,而是机会. 他们成立了一个编码俱乐部, 帕克曼编码器 ( Parkman Co ...

  7. python获取计算机时间_在Python中获取计算机的UTC偏移量

    当年话下 time.timezone:import timeprint -time.timezone它以秒为单位打印UTC偏移量(考虑到夏令时(DST),请参见time.altzone:is_dst  ...

  8. python datetime库_python datetime库使用代码详解

    python 如何将字符串转化为datetime.date心总是在最痛时,复苏:爱总是在最深时,落下帷幕. 比较省事的办法是用time模块的strptime方法来解析日期字符串成为时间对象,然后再把年 ...

  9. Python文本特征提取 DictVectorizer CountVectorizer TfidfVectorizer 附代码详解

    文章目录 DictVectorizer 对使用字典储存的数据进行特征提取与向量化 CountVectorizer / TfidfVectorizer 处理无特殊数据结构存储的数据 词袋模型(Bag o ...

最新文章

  1. 2020 图算法工程师面试基础、要点
  2. BZOJ4573 : [Zjoi2016]大森林
  3. mysql 4G内存配置表
  4. 第十八章 20结构体与string
  5. php项目从本地apache移到linux的nginx上,遇到的一些访问权限和报错的问题。
  6. 单机mysql能支撑起10w的qps_高并发redis - 读写分离支撑qps10w+
  7. MathType可以编辑省略号吗
  8. idea for mac 控制台 mvn command not found
  9. python list,str的拼接与转换
  10. 人工智能发展及其伦理问题思考
  11. 如何在iOS 9中启用“应用程序传输安全性”的情况下加载HTTP URL? [重复]
  12. MySQL数据操作:增删改查
  13. iOS中 百度地图详解
  14. 计算机网络第七版答案
  15. 什么是零点漂移,怎么抑制零点漂移?(硬件每日一题)
  16. Android项目实战--手机卫士34--流量管理
  17. 华为HCNA实验操作之常用操作命令1-10
  18. 低温工作笔记本计算机,电脑低温自动关机
  19. 1w存银行一年多少利息_在银行存定期一万块一年有多少利息?
  20. 你还记得当年上课天天玩 JAVA游戏吗

热门文章

  1. 关于 Amazon Polly 语音合成
  2. uniapp 打包H5,打包小程序,打包app分享到微信聊天、朋友圈
  3. 极客战记怎么换成java_「网易官方」极客战记(codecombat)攻略-森林-矮人蜂拥而至-munchkin-swarm...
  4. 微信求职招聘小程序系统设计与实现
  5. 修改文件或者目录读写权限时,提示“拒绝访问”的解决办法
  6. 【转载】C#中AddRange方法往ArrayList集合末尾添加另一个集合
  7. Cisco 路由器1.5作业 OSPF
  8. mate20por3d人脸识别_华为厉害!Mate20Pro3D结构光支持两张面孔
  9. c语言递归算法老鼠走迷宫详解,递归算法求老鼠走迷宫(C语言)
  10. Javascript验证码绘制下载