LSTM – Как подготовить обучение из набора данных, содержащего множественные наблюдения для различных событий.

Вопрос или проблема

Я использую LSTM в проекте, связанном с набором данных MobiFall, который содержит падения и повседневные активности – такие как ходьба, сидение и т. д. – измеренные с помощью акселерометра, гироскопа и датчиков ориентации по осям x, y, z.

Поэтому мне нужно модифицировать LSTM в многовариантной форме. Как это можно сделать?

После того как эта проблема будет решена, мне предстоит столкнуться с другой задачей: есть несколько временных рядов событий в разных файлах, которые были выполнены разными людьми. Например, у меня есть ADL_1_walking_1_.txt, ADL_1_walking_2.txt, ADL_2_jumping_3.txt (Конвенция наименования текстовых файлов – ActivityType_SubjectNo_ActivityName_SampleNo.txt), которые содержат данные acc-x, acc-y, acc-z, gyro-x, gyro-y, gyro-z, ori-x, ori-y, ori-z, где acc означает акселерометр, gyro означает гироскоп, а ori означает ориентацию.

Так как же мне тренировать свою модель? Должен ли я объединить все эти файлы? Но это приведет к тому, что модель будет считать, что все данные поступают из одного наблюдения, верно? Поэтому это может привести к неправильным вычислениям. Нужно ли готовить обучающую и тестовую выборки для каждого файла и повторно обучать модель? Так что мой вопрос в том, какие существуют общие решения для такого рода задач. Можете ли вы рассказать о некоторых из этих решений?

Это просто несколько временных рядов с одинаковыми данными. Вам нужно сделать предобработку (если это необходимо) и можно предоставить в качестве ввода просто для одного слоя RNN. Например:

model.add(GRU(units=512, return_sequence=True, input_shape=(None, number_of_inputs))

Ответ или решение

Для успешной работы с многомерными временными рядами, такими как набор данных MobiFall, необходимо подходить к подготовке данных и обучению модели LSTM структурированно. Вот полное руководство по подготовке данных и обучению вашей модели.

1. Подготовка данных

1.1 Объединение данных:
Основная идея заключается в том, что вы можете объединить все текстовые файлы в один общий набор данных, но вам нужно будет правильно маркировать данные, чтобы модель могла различать разные события и субъекты. Для этого вы можете добавить колонку, которая будет хранить информацию о названии файла или уникальном идентификаторе каждого события.

1.2 Предобработка данных:
Данные должны быть очищены и стандартизированы. Вот основные шаги:

  • Заполнение или удаление пропущенных значений.
  • Нормализация или стандартизация данных, чтобы все сигналы находились в одном диапазоне. Это может помочь модели быстрее сходиться.
from sklearn.preprocessing import StandardScaler
import pandas as pd

# Пример загрузки и объединения данных
dataframes = []
for filename in ['ADL_1_walking_1.txt', 'ADL_1_walking_2.txt', 'ADL_2_jumping_3.txt']:
    df = pd.read_csv(filename, sep=',')
    df['label'] = filename.split('_')[2]  # Добавляем метку события на основе названия файла
    dataframes.append(df)

data = pd.concat(dataframes)

# Нормализация
scaler = StandardScaler()
data[['acc-x', 'acc-y', 'acc-z', 'gyro-x', 'gyro-y', 'gyro-z', 'ori-x', 'ori-y', 'ori-z']] = scaler.fit_transform(data[['acc-x', 'acc-y', 'acc-z', 'gyro-x', 'gyro-y', 'gyro-z', 'ori-x', 'ori-y', 'ori-z']])

2. Формирование временных последовательностей

2.1 Создание слайдов:
Для подачи данных в LSTM необходимо создать временные последовательности (слайды) фиксированной длины из вашего набора данных. Например, если длина последовательности составляет 50, вы создаете многомерные массивы размером (N, 50, номер_входных_данных), где N — количество последовательностей.

import numpy as np

def create_dataset(data, time_step=50):
    X, Y = [], []
    for i in range(len(data) - time_step):
        X.append(data.iloc[i:(i + time_step), :-1].values)  # Все колонки, кроме последней
        Y.append(data.iloc[i + time_step, -1])  # Последняя колонка - это целевая переменная
    return np.array(X), np.array(Y)

X, Y = create_dataset(data)

3. Обучение модели

3.1 Структура LSTM:
Теперь вы можете создать модель LSTM, принимая многомерные данные как вход. Вы можете использовать одну LSTM-сеть или несколько, в зависимости от сложности задачи.

from keras.models import Sequential
from keras.layers import LSTM, Dense

model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X.shape[1], X.shape[2])))
model.add(LSTM(50))
model.add(Dense(1, activation='softmax'))  # Если классы, используйте softmax; для регрессии - линейная активация
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

3.2 Разделение данных:
Вместо того чтобы объединять все данные в одну выборку для обучения и проверки, рекомендуется разделять данные на обучающую и тестовую выборки, чтобы учесть различия между субъектами и событиями. Это обеспечит более обоснованное обобщение вашей модели.

from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
model.fit(X_train, Y_train, epochs=50, batch_size=32, validation_data=(X_test, Y_test))

4. Обобщение

  • Сохранение модели: После завершения обучения рекомендуется сохранить модель с помощью model.save(), чтобы можно было легко загрузить её позже.
  • Тестирование и оценка: Используйте тестовые данные для оценки производительности вашей модели. Вы можете использовать метрики, такие как точность, полнота и F1-меры для анализа качества модели.

Заключение

Таким образом, подготовка и обучение модели LSTM на данных MobiFall требует тщательной предварительной обработки, создания временных последовательностей и внимания к структуре вашей модели. Также важно проводить обучение и тестирование для каждого файла отдельно, чтобы избежать смещения в результатах. Успехов в вашем проекте!

Оцените материал
Добавить комментарий

Капча загружается...