Python代碼詳解:入門時間序列分類

咱們接觸的大多數時間序列數據主要涉及產生預測的交易。不管是預測產品的需求仍是銷售額,航空公司的乘客數量或特定股票的收盤價,咱們都習慣於利用久經考驗的時間序列技術來預測需求。php

但隨着生成的數據量呈指數增加,嘗試新想法和算法的機會也隨之增長。使用複雜的時間序列數據集仍然是一個利基領域,擴展你的保留曲目以包含新想法老是有幫助的。python

這就是本文的目的,向你介紹時間序列分類的新概念。咱們將首先了解這個主題的含義以及它在行業中的應用。可是不會只停留在理論部分——咱們將經過處理時間序列數據集並執行二進制時間序列分類來解決問題。邊學邊應用——這將有助於你以實際的方式理解這個概念。算法

時間序列分類介紹數據庫

時間序列分類實際上已經存在了一段時間。但到目前爲止,它主要限於研究實驗室,而沒有進行行業應用。可是有不少研究正在進行,正在建立新的數據集並提出了許多新的算法。網絡

能夠想象,時間序列分類數據與常規分類問題不一樣,由於屬性具備有序序列。 讓咱們來看看一些時間序列分類用例,以瞭解這種差別。app

1.對心電圖(ECG/EEG)信號進行分類post

心電圖或心電圖記錄心臟的電活動,普遍用於診斷各類心臟問題。使用外部電極捕獲這些心電圖信號。性能

例如,考慮如下信號樣本,它表明一個心跳的電活動。左側的圖像表示正常心跳,而與其相鄰的圖像表示心肌梗塞。學習

http://image1.hipu.com/image.php?url=0LH1bbDLwG

從電極捕獲的數據將是時間序列形式,而且信號能夠分類爲不一樣的類別。咱們還能夠對記錄大腦電活動的腦電信號進行分類。測試

在學習的道路上確定會遇到困難,沒有好的學習資料怎麼去學習呢?
若是你感受學不會?莫慌,推薦你加羣
前面923中間414後面804 ,羣裏有志同道合的小夥伴
互幫互助,還能夠拿到許多視頻教程!

2.圖像分類

圖像也能夠是順序的時間相關格式。請考慮如下情形:

根據天氣條件、土壤肥力、水的可用性和其餘外部因素,農做物在特定的田地中生長。這塊田地被監測拍攝了5年,並標記在該字段上種植的做物的名稱。 你知道爲何要這麼作嗎?數據集中的圖像是在固定的時間間隔以後拍攝的,而且具備定義的序列,這多是對圖像進行分類的重要因素。

3.對運動傳感器數據進行分類

傳感器生成高頻數據,能夠識別其範圍內物體的移動。經過設置多個無線傳感器並觀察傳感器中信號強度的變化,能夠識別物體的運動方向。

設置問題陳述

咱們將致力於「室內用戶運動預測」問題。在該挑戰中,多個運動傳感器被放置在不一樣的房間中,而且目標是基於從這些運動傳感器捕獲的頻率數據來識別個體是否已經移動穿過房間。

兩個房間有四個運動傳感器(A1,A2,A3,A4)。請看下面的圖像,其中說明了傳感器在每一個房間中的位置。這兩個房間的設置是在3對不一樣的房間(group1,group2,group3)中建立的。

http://image1.hipu.com/image.php?url=0LH1bbP6C0

一我的能夠沿着上圖中所示的六個預約義路徑進行任何移動。若是一我的走在路徑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

http://image1.hipu.com/image.php?url=0LH1bb6NsH

df2.head

http://image1.hipu.com/image.php?url=0LH1bbn6lv

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]

http://image1.hipu.com/image.php?url=0LH1bbzwN4

如前所述,數據集是在三對不一樣的房間中收集的——所以有三組。此信息可用於將數據集劃分爲訓練集、測試集和驗證集。咱們如今將加載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

http://image1.hipu.com/image.php?url=0LH1bbXUQU

咱們如今將訓練模型並監控驗證的準確性:

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模型的性能。

總結

預處理步驟是全部部分中最複雜的。然而,它也是最重要的一個(不然整個時間序列數據將會失敗)。在處理此類挑戰時,向模型提供正確的數據一樣重要。

相關文章
相關標籤/搜索