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

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

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

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

時間序列分類介紹

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

可以想象,時間序列分類數據與常規分類問題不同,因爲屬性具有有序序列。 讓我們來看看一些時間序列分類用例,以瞭解這種差異。

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

心電圖或心電圖記錄心臟的電活動,廣泛用於診斷各種心臟問題。使用外部電極捕獲這些心電圖信號。

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

[圖片上傳失敗...(image-f419ea-1550147176398)]

從電極捕獲的數據將是時間序列形式,並且信號可以分類爲不同的類別。我們還可以對記錄大腦電活動的腦電信號進行分類。

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

2.圖像分類

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

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

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

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

設置問題陳述

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

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

[圖片上傳失敗...(image-a9d588-1550147176398)]

一個人可以沿着上圖中所示的六個預定義路徑進行任何移動。如果一個人走在路徑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

[圖片上傳失敗...(image-8afde3-1550147176398)]

df2.head

[圖片上傳失敗...(image-fc46f5-1550147176398)]

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]

[圖片上傳失敗...(image-f21f4f-1550147176398)]

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

[圖片上傳失敗...(image-710f90-1550147176398)]

我們現在將訓練模型並監控驗證的準確性:

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

總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章