使用 LSTM 对时间序列进行分类

Classification timeseries with LSTM

提问人:Дмитрий Прохоренко 提问时间:11/13/2023 最后编辑:Дмитрий Прохоренко 更新时间:11/14/2023 访问量:61

问:

我需要从多个 csv 文件中分类时间序列,并且文件中的每个数据都是 LSTM 的单独时间序列

链接到数据集 https://drive.google.com/file/d/1jN1Cr32jf3Z211I4sWJQhAkZsnq51d-m/view?usp=sharing

在每个文件中,我都有下一个数据 时间,A,B,C,D 1,3,0,2,0 2,0,1,0,0 3,0,0,0,0 4,1,0,0,0 5,0,2,0,3

我需要帮助解决一个问题,如何使用 LSTM 对这个数组中的每个对象进行分类

从数据集加载数据后,我有下一个 np 数组

X_train (21, 5, 5) y_train (21,) X_test (9, 5, 5) y_test (9,)

X_train:

[[[1 0 0 0 0]
  [2 0 1 0 0]
  [3 0 0 0 0]
  [4 1 0 1 0]
  [5 0 1 0 0]]

 [[1 1 0 0 0]
  [2 1 0 1 0]
  [3 0 1 0 0]
  [4 0 0 1 0]
  [5 1 1 0 0]]

 [[1 1 0 0 1]
  [2 0 0 0 0]
  [3 0 0 0 0]
  [4 1 1 1 0]
  [5 0 0 0 1]]

 [[1 0 0 0 0]
  [2 0 0 0 0]
  [3 0 0 0 0]
  [4 1 1 1 1]
  [5 0 1 1 0]]

 [[1 1 1 0 0]
  [2 1 1 0 0]
  [3 0 0 0 0]
  [4 1 0 0 0]
  [5 0 0 1 0]]

 [[1 1 1 0 0]
  [2 0 0 1 0]
  [3 0 0 1 0]
  [4 1 0 0 0]
  [5 0 1 1 1]]

 [[1 1 0 0 0]
  [2 1 1 0 1]
  [3 1 0 0 1]
  [4 1 0 1 1]
  [5 1 1 0 1]]

 [[1 2 0 0 0]
  [2 0 1 0 0]
  [3 2 2 0 0]
  [4 0 0 0 0]
  [5 2 2 0 0]]

 [[1 0 0 0 2]
  [2 0 0 0 0]
  [3 0 2 0 0]
  [4 2 0 2 0]
  [5 0 2 0 0]]

 [[1 2 0 0 0]
  [2 0 0 0 0]
  [3 0 2 0 0]
  [4 1 0 2 0]
  [5 0 0 0 0]]

 [[1 1 0 0 0]
  [2 0 0 0 0]
  [3 0 0 0 2]
  [4 0 0 0 2]
  [5 0 0 2 0]]

 [[1 2 2 2 0]
  [2 0 2 2 0]
  [3 0 1 1 0]
  [4 0 0 0 0]
  [5 2 0 0 0]]

 [[1 0 0 0 0]
  [2 0 0 0 0]
  [3 0 0 0 0]
  [4 0 0 0 2]
  [5 0 2 0 0]]

 [[1 2 2 2 0]
  [2 2 0 0 0]
  [3 2 0 0 0]
  [4 2 0 0 1]
  [5 0 2 2 0]]

 [[1 2 0 0 0]
  [2 0 1 0 0]
  [3 2 0 0 0]
  [4 1 1 1 2]
  [5 0 1 3 0]]

 [[1 3 0 0 0]
  [2 0 0 0 0]
  [3 0 2 0 0]
  [4 2 0 1 0]
  [5 0 1 0 0]]

 [[1 0 0 0 0]
  [2 0 0 0 3]
  [3 1 0 0 0]
  [4 0 0 1 0]
  [5 0 0 0 0]]

 [[1 2 1 0 0]
  [2 0 1 0 0]
  [3 0 3 0 0]
  [4 0 0 1 0]
  [5 0 1 1 0]]

 [[1 0 2 0 0]
  [2 0 3 0 0]
  [3 0 0 0 0]
  [4 0 0 1 0]
  [5 2 0 0 0]]

 [[1 0 0 0 0]
  [2 0 1 0 0]
  [3 0 0 0 0]
  [4 0 0 1 0]
  [5 3 2 0 0]]

 [[1 0 0 0 0]
  [2 3 2 2 2]
  [3 0 0 0 0]
  [4 1 0 0 0]
  [5 0 0 0 1]]]

y_train:

[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2]

X_test:

[[[1 0 1 0 0]
  [2 0 0 0 0]
  [3 0 0 0 0]
  [4 0 0 0 0]
  [5 0 1 0 0]]

 [[1 0 0 1 0]
  [2 0 0 0 0]
  [3 0 0 0 0]
  [4 0 0 0 0]
  [5 1 1 0 0]]

 [[1 0 0 0 1]
  [2 0 0 1 0]
  [3 0 1 0 0]
  [4 1 0 1 0]
  [5 0 1 0 0]]

 [[1 0 2 0 0]
  [2 1 0 0 0]
  [3 2 0 0 0]
  [4 0 0 0 0]
  [5 0 2 2 0]]

 [[1 2 0 0 2]
  [2 0 1 2 0]
  [3 0 2 0 0]
  [4 2 0 1 0]
  [5 0 2 0 0]]

 [[1 1 1 0 0]
  [2 0 2 2 2]
  [3 2 0 0 0]
  [4 0 2 0 0]
  [5 2 1 0 0]]

 [[1 0 3 0 0]
  [2 0 0 0 0]
  [3 0 2 0 0]
  [4 1 0 2 0]
  [5 0 0 0 2]]

 [[1 1 2 0 0]
  [2 2 2 0 0]
  [3 0 0 0 3]
  [4 0 0 1 0]
  [5 2 0 0 1]]

 [[1 3 0 2 0]
  [2 0 1 0 0]
  [3 0 0 0 0]
  [4 1 0 0 0]
  [5 0 2 0 3]]]

y_test:

[0, 0, 0, 1, 1, 1, 2, 2, 2]

但是,如果我把这个数组给 LSTM,它会尝试将所有这些数组用作一个时间序列 但我需要从文件中对每个包含的数组进行分类

我如何使用这个数组进行 LSTM 分类以及我需要为此使用的模型?

import pandas as pd
import numpy as np
# import plotly as tf
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from keras.optimizers import Adam
from keras.models import load_model
from keras.callbacks import ModelCheckpoint
# import plotly.graph_objects as go
import array


X_train = []
y_train = []
X_test = []
y_test = []

files_train = pd.read_csv('dataset/dataset_train.csv')

for i in files_train['filename']:
    a = np.array(pd.read_csv('dataset/train/'+i))
    X_train.append(a)

for i in files_train['feature']:
    y_train.append(i)

files_test = pd.read_csv('dataset/dataset_test.csv')

for l in files_test['filename']:
    b = np.array(pd.read_csv('dataset/test/'+l))
    X_test.append(b)

for i in files_test['feature']:
    y_test.append(i)


print(X_train)
print(y_train)
print(X_test)
print(y_test)

X_test = np.array(X_test)
X_train = np.array(X_train)

y_test = np.array(y_test)
y_train = np.array(y_train)

model = Sequential()

model.add(LSTM(128, input_shape=(5,5), activation='relu',
return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.1))

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(3, activation='softmax'))

opt = keras.optimizers.Adam(learning_rate=0.01)

# Compile model
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)

model.fit(X_train,
          y_train,
          epochs=12,
          validation_data=(X_test, y_test))


(21, 5, 5)
(21,)
(9, 5, 5)
(9,)
Epoch 1/12
1/1 [==============================] - 3s 3s/step - loss: 1.0939 - accuracy: 0.4286 - val_loss: 1.0917 - val_accuracy: 0.6667
Epoch 2/12
1/1 [==============================] - 0s 47ms/step - loss: 1.0741 - accuracy: 0.3810 - val_loss: 1.0730 - val_accuracy: 0.3333
Epoch 3/12
1/1 [==============================] - 0s 46ms/step - loss: 1.1335 - accuracy: 0.3333 - val_loss: 1.1097 - val_accuracy: 0.3333
Epoch 4/12
1/1 [==============================] - 0s 51ms/step - loss: 1.1399 - accuracy: 0.2857 - val_loss: 1.0743 - val_accuracy: 0.6667
Epoch 5/12
1/1 [==============================] - 0s 48ms/step - loss: 1.0948 - accuracy: 0.5714 - val_loss: 1.0509 - val_accuracy: 0.5556
Epoch 6/12
1/1 [==============================] - 0s 50ms/step - loss: 1.0255 - accuracy: 0.4286 - val_loss: 1.0155 - val_accuracy: 0.5556
Epoch 7/12
1/1 [==============================] - 0s 49ms/step - loss: 1.0266 - accuracy: 0.4762 - val_loss: 0.9607 - val_accuracy: 0.4444
Epoch 8/12
1/1 [==============================] - 0s 44ms/step - loss: 1.0367 - accuracy: 0.4286 - val_loss: 0.8943 - val_accuracy: 0.3333
Epoch 9/12
1/1 [==============================] - 0s 48ms/step - loss: 0.9418 - accuracy: 0.4286 - val_loss: 0.9485 - val_accuracy: 0.4444
Epoch 10/12
1/1 [==============================] - 0s 46ms/step - loss: 0.9855 - accuracy: 0.4286 - val_loss: 0.8503 - val_accuracy: 0.6667
Epoch 11/12
1/1 [==============================] - 0s 50ms/step - loss: 0.8922 - accuracy: 0.5714 - val_loss: 0.9614 - val_accuracy: 0.6667
Epoch 12/12
1/1 [==============================] - 0s 46ms/step - loss: 0.8229 - accuracy: 0.5714 - val_loss: 0.7544 - val_accuracy: 0.5556
a = np.array(pd.read_csv('up.csv'))
print (a.shape)
a = a.reshape(1, 5, 5)
print (a.shape)
predict = model.predict(a)
print (predict)
/usr/local/lib/python3.11/site-packages/keras/src/optimizers/legacy/adam.py:118: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  super().__init__(name, **kwargs)
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
(5,5)
(1, 5, 5)
1/1 [==============================] - 0s 431ms/step
[[0.5621749  0.17702557 0.26079956]]
up.csv

    time,A,B,C,D
    1,0,0,0,0
    2,0,0,0,0
    3,0,0,0,0
    4,1,1,1,1
    5,0,1,1,0


分类 LSTM

评论


答: 暂无答案