Вопрос или проблема
Я использую 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 требует тщательной предварительной обработки, создания временных последовательностей и внимания к структуре вашей модели. Также важно проводить обучение и тестирование для каждого файла отдельно, чтобы избежать смещения в результатах. Успехов в вашем проекте!