Вопрос или проблема
Каков лучший/правильный способ предоставления метаинформации автоэнкодеру или любой модели прогнозирования временных рядов.
Пример
Предположим, у меня есть данные о машине, и я хочу обнаружить аномалии в компонентах автомобиля. Данные могут выглядеть следующим образом:
import pandas as pd
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
car_data = pd.DataFrame({
'engine_temperature': [50, 60, 70, 80, 85],
'engine_pressure': [400, 450, 500, 550, 580],
'engine_load': [70, 80, 90, 99, 99],
'air_temperature_c': [25, 25, 25, 25, 25],
}, index=pd.date_range(start="2020-01-01", freq="1s", periods=5))
Где я хочу предсказать температуру и давление двигателя, но мне не важна нагрузка двигателя (насколько сильно осуществляется ускорение) или температура воздуха – эти данные являются входными для компонентов двигателя.
Я мог бы настроить базовый автоэнкодер и восстановить входные последовательности:
time_steps = 5
num_features = 4
autoencoder = Sequential()
# энкодер
autoencoder.add(layers.LSTM(10, activation='relu', input_shape=(time_steps, num_features), return_sequences=False))
autoencoder.add(layers.RepeatVector(time_steps))
# декодер
autoencoder.add(layers.LSTM(10, activation='relu', return_sequences=True))
autoencoder.add(layers.TimeDistributed(layers.Dense(num_features)))
autoencoder.compile(
loss="mse", optimizer=Adam(clipvalue=0.001)
)
x_train = np.stack([car_data.values])
autoencoder.fit(x_train, x_train,
epochs=50,
)
Но я восстанавливаю две переменные, которые меня не интересуют. Это стандартный подход, как я понимаю. Я только включаю их для улучшения точности автоэнкодера, я верю, что, например, для температуры двигателя она предсказывает текущую последовательность, используя все предоставленные переменные – температура воздуха важна для предсказания температуры двигателя.
Я мог бы предоставить в качестве входных данных все переменные, но восстановить только те переменные, которые меня интересуют, например:
engine_components = car_data[['engine_temperature', 'engine_pressure']]
y_train = [engine_components.values]
y_train = np.stack(x_train)
autoencoder.fit(x_train, y_train,
epochs=50,
)
Но я не видел, чтобы кто-то использовал этот подход?
Вопросы
- Является ли это действительным подходом? Возможно, есть причина, по которой я не видел, чтобы кто-то другой его использовал.
- Есть ли лучший способ построить модель, где я могу указать зависимости между переменными? Например, сообщить, что одна переменная влияет на другую, но не наоборот? Это то, что я действительно хочу сделать.
- Существует ли лучший способ предоставить данные с низкой частотой (например, почасовая температура воздуха) модели с высокой частотой – например, данные о двигателе с интервалом в 1 секунду? Кажется неправильным, что одна переменная меняется только каждые 3600 строк (час в секундах), в то время как все остальные меняются в каждой строке.
Дополнение – на случай, если это сбивает с толку, но не стесняйтесь пропустить это
- Я использовал LSTM, но, я думаю, это не имеет значения для этого вопроса.
- Я не нормализовал данные – это было сделано, чтобы сократить пример.
- Эти данные похожи на те, что у меня есть, но у меня больше 50 миллиардов строк (и я могу получить больше), так что размер данных не проблема – не стесняйтесь предлагать методы, которые требуют много данных.
- Использована версия tensorflow==2.15.1.
- Я использовал tensorflow, но готов перейти на pytorch (или другие), если у вас есть решение в другой системе.
Ответ или решение
Вопрос, который вы подняли, является важным для проектирования моделей, использующих автоэнкодеры для анализа временных рядов. Ниже представлены рекомендации по каждой из озвученных вами проблем.
1. Использование метаинформации в автоэнкодере
Ваш подход к подготовке данных, где вы включаете переменные, влияющие на целевые переменные, но которые не являются целью (например, температура воздуха и нагрузка на двигатель), имеет смысл. Действительно, такие переменные могут улучшить качество прогнозирования, обеспечивая модель дополнительной контекстной информацией. Однако, чтобы избежать избыточной реконструкции информации, вы можете изменить архитектуру своей модели.
Рекомендация: Реконструкция только целевых переменных. Если ваша цель — реконструировать только ‘engine_temperature’ и ‘engine_pressure’, вы можете использовать маску или специальный выходной слой для автоэнкодера, который будет указывать, что эти переменные являются целевыми при обучении.
2. Указание зависимостей между переменными
Для указания направленных зависимостей между переменными вы можете использовать графовые нейронные сети или другие архитектуры, которые позволяют учитываться таким взаимодействиям. В Keras вы можете реализовать подобный подход через кастомный слой, который будет обрабатывать временные ряды, учитывая зависимости, например, с помощью сложных архитектур, таких как GRU или RNN с пользовательскими весами.
Кроме того, использование Keras API для создания многоуровневых моделей может позволить вам явно указывать, какие переменные влияют друг на друга. Рассмотрите возможность использования Attention-слоев, чтобы модель могла "смотреть" на важные временные точки в последовательности.
3. Работа с данными с низкой частотой
Чтобы правильно использовать данные с разной частотой (например, температурные данные, обновляющиеся раз в час, в то время как другие данные обновляются каждую секунду), вы можете применить следующие подходы:
-
Интерполяция: Можно интерполировать или экстраполировать данные с низкой частотой, чтобы привести их в соответствие с частотой других переменных. Например, каждый час можно использовать одно значение температуры, а для более частых значений можно использовать методы линейной интерполяции или другие техники временной интерполяции.
-
Сглаживание: Сглаживание временных рядов может помочь вам сделать более стабильные прогнозы, если это не существенно изменит значения.
-
Плинарные функции: Можно использовать модели, которые могут учитывать неравномерные временные ряды, например, модели, основанные на RNN, и встраивание информации о частоте данных в модель.
Резюме
Ваш подход к использованию автоэнкодера для обнаружения аномалий является обоснованным, и использование дополнительных переменных для улучшения качества предсказания — это распространенная практика. Рассмотрите возможность применения выделения целевых переменных при обучении автоэнкодера, а также изучение более сложных архитектур для моделирования направленных зависимостей. Обработка временных рядов с различной частотой может потребовать дополнительной предобработки, чтобы данные были согласованы по временным точкам.
Попробуйте реализовать предложенные подходы, и это должно помочь вам эффективно использовать автоэнкодеры для анализа временных рядов и уменьшения влияния ненужных переменных.