Tìm hiểu cơ bản về LSTM phân lớp cho dữ liệu time series

Posted by Hao Do on November 3, 2022

Tìm hiểu cơ bản về LSTM phân lớp cho dữ liệu time series

Kiến trúc cơ bản của LSTM

Kiến trúc của 1 cell trong lstm

img

Kiến trúc của mô hình lstm

img

Một số công thức toán biểu diễn từng thành phần của lstm

img

Source code ví dụ

Load thư viện

1
2
3
4
5
6
7
8
9
10
11
12
import keras
from keras.layers import LSTM, Dropout, Dense, SpatialDropout1D
import tensorflow as tf
import numpy as np
import pandas as pd
from keras.utils import to_categorical
from numpy import mean
from numpy import std
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import classification_report, confusion_matrix
import time

load data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
data_train = pd.read_csv(pathfile + '/data_train.csv')
data_test = pd.read_csv(pathfile + '/data_test.csv')
data_train['Class'] = data_train['Class'].astype(int)
data_test['Class'] = data_test['Class'].astype(int)

def generate_data(X, y, sequence_length = 1, step = 1):
    X_local = []
    y_local = []
    for start in range(0, len(X) - sequence_length, step):
        end = start + sequence_length
        X_local.append(X[start:end])
        y_local.append(y[end-1])
    return np.array(X_local), np.array(y_local)


trainX, trainy = generate_data(data_train.loc[:, "v1":"v4"].values, data_train.Class)
testX, testy = generate_data(data_test.loc[:, "v1":"v4"].values, data_test.Class)

trainy  = trainy.reshape((trainy.shape[0],1))
testy  = testy.reshape((testy.shape[0],1))

# zero-offset class values
#trainy = trainy - 1
#testy = testy - 1
# one hot encode y
trainy = to_categorical(trainy)
testy = to_categorical(testy)
print(trainX.shape, trainy.shape, testX.shape, testy.shape)

Output shape tương ứng tập train và test

(1065, 1, 4) (1065, 4) (935, 1, 4) (935, 4)

Model lstm dùng để phân lớp dữ liệu

1
2
3
4
5
6
7
8
9
10
verbose, epochs, batch_size = 0, 15, 64
n_timesteps, n_features, n_outputs = trainX.shape[1], trainX.shape[2], trainy.shape[1]
model = keras.Sequential()
model.add(LSTM(100, input_shape=(n_timesteps,n_features)))
model.add(Dropout(0.5))
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose)

model.summary()

img

confusion matrix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
_, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
start_time = time.time()

test_y = model.predict(testX)

print("--- %s seconds ---" % (time.time() - start_time))

testy_org = []
for x in testy:
  tmp = np.argmax(x)
  testy_org.append(tmp)

test_y_pred = []
for x in test_y:
  tmp = np.argmax(x)
  test_y_pred.append(tmp)
  
cm = confusion_matrix(testy_org, test_y_pred)
cm_df = pd.DataFrame(cm,
                     index = ['task1','task2','task3'], 
                     columns = ['task1','task2','task3'])

plt.figure(figsize=(5,4))
sns.heatmap(cm_df, annot=True)
plt.title('Confusion Matrix')
plt.ylabel('Actal Values')
plt.xlabel('Predicted Values')
plt.show()

Full ipynb

Tài liệu tham khảo

Machine learning cơ bản

Hết.