python绘制turtle⼼电图代码_Python代码详解:⼊门时间序列
分类
我们接触的⼤多数时间序列数据主要涉及产⽣预测的交易。⽆论是预测产品的需求还是销售额,航空公司的乘客数量或特定股票的收盘价,我们都习惯于利⽤久经考验的时间序列技术来预测需求。
但随着⽣成的数据量呈指数增长,尝试新想法和算法的机会也随之增加。使⽤复杂的时间序列数据集仍然是⼀个利基领域,扩展你的保留曲⽬以包含新想法总是有帮助的。
这就是本⽂的⽬的,向你介绍时间序列分类的新概念。我们将⾸先了解这个主题的含义以及它在⾏业中的应⽤。但是不会只停留在理论部分——我们将通过处理时间序列数据集并执⾏⼆进制时间序列分类来解决问题。边学边应⽤——这将有助于你以实际的⽅式理解这个概念。
时间序列分类介绍
时间序列分类实际上已经存在了⼀段时间。但到⽬前为⽌,它主要限于研究实验室,⽽没有进⾏⾏业应⽤。但是有很多研究正在进⾏,正在创建新的数据集并提出了许多新的算法。
可以想象,时间序列分类数据与常规分类问题不同,因为属性具有有序序列。 让我们来看看⼀些时间序列分类⽤例,以了解这种差异。
1.对⼼电图(ECG/EEG)信号进⾏分类
⼼电图或⼼电图记录⼼脏的电活动,⼴泛⽤于诊断各种⼼脏问题。使⽤外部电极捕获这些⼼电图信号。
例如,考虑以下信号样本,它代表⼀个⼼跳的电活动。左侧的图像表⽰正常⼼跳,⽽与其相邻的图像表⽰⼼肌梗塞。
从电极捕获的数据将是时间序列形式,并且信号可以分类为不同的类别。我们还可以对记录⼤脑电活动的脑电信号进⾏分类。
在学习的道路上肯定会遇到困难,没有好的学习资料怎么去学习呢?
如果你感觉学不会?莫慌,推荐你加
前⾯923中间414后⾯804 ,⾥有志同道合的⼩伙伴
互帮互助,还可以拿到许多视频教程!
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
dels import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.optimizers import Adam
dels 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):
font下载安卓版
file_path = path + str(i) + '.csv'
print(file_path)
df = pd.read_csv(file_path, header=0)
values = df.values
进去redis客户端命令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:
python入门教程资料
len_sequences.append(len(one_seq))
pd.Series(len_sequences).describe
count 314.000000
listview布局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:
nervous什么意思啊了
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.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)
modelpile(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')
ics import accuracy_score
html显示模式转换代码test_preds = model.predict_classes(test)
accuracy_score(test_target, test_preds)
这⾥的准确度得分为0.78846153846153844。这是⼀个⾮常有前景的开始,但我们肯定可以通过使⽤
超参数,改变学习速度和/或时代数来改善LSTM模型的性能。
总结
预处理步骤是所有部分中最复杂的。然⽽,它也是最重要的⼀个(否则整个时间序列数据将会失败)。在处理此类挑战时,向模型提供正确的数据同样重要。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。