Вопрос или проблема
Я потратил несколько дней на это и начинаю думать, что мне не хватает очевидного решения, так как это не кажется очень редкой проблемой.
Как пример набора данных: у меня есть 100 измерений, каждое из которых имеет различную постоянную скорость в качестве цели и длину в 10000 точек данных. Каждое измерение имеет дополнительные 30 признаков, таких как температура, воздушный поток, влажность и т. д. Моя цель – предсказать скорость в зависимости от признаков/условий.
Мой первоначальный набор данных имеет форму (100, 10000, 30), как в (количество измерений, длина измерений, количество признаков), которую я бы преобразовал с помощью скользящего окна. Все решения, которые я нашел до сих пор, создают один большой набор данных, который (по моему пониманию) означал бы, что независимые измерения рассматриваются как одно единое измерение.
Так как жесткие переходы между измерениями ухудшают мои прогнозы: как я могу обучить сеть, не создавая одного большого измерения, которое включает эти ‘ошибки перехода’? Я хочу использовать большую часть для обучения и оценки, а затем протестировать несколько оставшихся измерений отдельно. Поэтому я полагаю, что моя input_shape должна соответствовать одному измерению (10000, 30), и целевая скорость имеет (10000, 1). Как мне трансформировать свои данные в форму окна, сохраняя измерения отдельно, и вставить их в свою сеть для обучения/тестирования?
Я пробовал использовать batch_input_shape, но не нашел решения, как включить это со скользящим окном и существующей input_shape, поэтому я не уверен, сможет ли это даже решить мою проблему. (Я также думал об обучении модели для каждого измерения и попытке их комбинирования, но это кажется слишком сложным для этой задачи.)
Думаю, что вы ищете способ преобразовать ваш набор данных в задачу с обучением под наблюдением. В Keras есть собственный TimeSeriesGenerator, но он не подойдет, так как он имеет только однократный вывод. Кто-то создал альтернативную версию TimeSeriesGenerator. С его помощью вы можете указать входные и выходные данные для каждого примера, чтобы преобразовать ваши данные в задачу с обучением под наблюдением, что затем можно будет без проблем интегрировать в вашу LSTM сеть.
Надеюсь, это поможет.
Ответ или решение
Если вы хотите использовать сети LSTM для регрессии с несколькими временными рядами в качестве входных данных, одной из ключевых задач будет правильная трансформация данных для обучения модели. Рассмотрим ваши данные: у вас есть 100 измерений, каждое из которых состоит из 10,000 точек данных и содержит 30 признаков, таких как температура, поток воздуха и влажность. Цель состоит в прогнозировании постоянной скорости на основе этих признаков.
Проблема объединения данных
Основная проблема, с которой вы столкнулись, заключается в нежелательном объединении всех измерений в один большой набор данных, что может привести к ошибкам при прогнозировании из-за жестких переходов между измерениями. Чтобы этого избежать, рекомендую рассмотреть вариант, при котором каждое измерение будет обрабатываться и использоваться независимо.
Конвертация набора данных в задачу с упорядоченным обучением
Наиболее подходящим решением будет преобразование вашего набора данных в задачу с упорядоченным обучением (Supervised Learning), сохраняя независимость каждого измерения. Прежде всего, нужно использовать технику скользящего окна для генерации входных и выходных выборок из каждого отдельного измерения.
Шаги по преобразованию данных:
-
Скользящее окно: Примените метод скользящего окна к каждому из 100 измерений. Это позволит вам создать наборы входных и выходных данных для обучения модели LSTM. Например, выберите размер окна 60, чтобы сформировать временные выборки размером (60, 30), где 60 — количество временных шагов, а 30 — количество признаков.
-
Формирование обучающего набора: Убедитесь, что для каждого окна из 60 временных шагов вы сможете предсказать следующую целевую скорость. Это изменит вашу зависимую переменную в массив с размером (60, 1).
-
Разделение данных: Разделите данные на обучающий и тестовый наборы, где каждое измерение служит собой как отдельная часть. Это позволит избежать нежелательных переходов между различными измерениями в момент обучения и тестирования.
Реализация в Keras
Хотя стандартный TimeSeriesGenerator из Keras не подходит для данного многовременного шага, вы можете рассмотреть альтернативные библиотеки или реализовать собственное решение на Python. Один из популярных пакетов — time-series-generator
, который позволяет более гибко определять входы и выходы за каждый образец.
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
# Пример формата данных (измерения, длина измер., число признаков)
data = np.random.rand(100, 10000, 30)
def create_sliding_windows(data, window_size):
X, y = [], []
for measurement in data:
for i in range(len(measurement) - window_size):
X.append(measurement[i:i+window_size])
y.append([measurement[i+window_size]])
return np.array(X), np.array(y)
window_size = 60
X, y = create_sliding_windows(data, window_size)
# Создание модели LSTM
model = Sequential([
LSTM(50, activation='relu', input_shape=(window_size, 30)),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
# Обучение модели
model.fit(X, y, epochs=10, batch_size=32)
Заключение
Данное решение позволяет моделировать данные временных рядов так, чтобы при обучении сети LSTM не нарушать границы между независимыми измерениями. Используя подход со скользящим окном отдельно для каждого измерения, вы обеспечите качество прогнозов и избежать ошибок, связанных со смешиванием данных.