Вопрос или проблема
У меня есть данные гистограмм временных рядов от множества отдельных запусков машин (подробности см. в этом посте).
Я работаю над обучением LSTM с целью предсказать финальную гистограмму в запуске машины, основываясь на прошлых данных гистограммы. Мне сложно разобраться, как сделать это, разделяя данные запусков машин.
Думаю, может быть, решение состоит в том, чтобы просто запускать model.fit()
, перебирая каждый run_id
:
n_features = 42
n_timesteps = 9
groups = df.groupby(by="run_id")
for key, group in groups:
# обучающие признаки
group = group[moisture_dist_columns].to_numpy()
X_train = []
y_train = []
# Здесь я создаю массив X с последовательностями длины n_timesteps
for i in range(n_timesteps, len(group)):
X_train.append(group[i - n_timesteps : i])
y_train.append(group[i])
X_train, y_train = np.array(X_train), np.array(y_train)
X_train = X_train.reshape((-1, n_timesteps, n_features))
y_train = y_train.reshape((-1, 1, 42))
model.fit(X_train, y_train, epochs=100, batch_size=16)
Когда я это делаю, я вижу, что валидационные потери уменьшаются, так что, может быть, это работает? На основе этой короткой дискуссии я думаю, что это может быть нормально.
Является ли это разумным решением, если я хочу обучить LSTM с использованием информации от каждого run_id
машины?
Еще один вариант, о котором я думаю, помимо использования цикла for, это создать генератор, который передает каждый run_id в виде пакета.
Вместо того чтобы разделять данные каждого запуска машины, я перебираю каждый запуск машины, добавляя скользящие окна:
def split_sequences(df, n_timesteps_in, n_timesteps_out):
X, y = list(), list()
groups = df.groupby("user_id")
for _, group in groups:
for i in range(len(group)):
# находим конец этого шаблона
end_ix = i + n_timesteps_in
out_end_ix = end_ix + n_timesteps_out
# проверяем, не выходим ли за пределы набора данных
if end_ix + 1 > len(group):
break
# собираем входные и выходные части шаблона
seq_x, seq_y = (
group.iloc[i:end_ix][moisture_dist_columns].to_numpy(),
group.iloc[end_ix:out_end_ix][moisture_dist_columns].to_numpy(),
X.append(seq_x)
y.append(seq_y)
return np.array(X), np.array(y)
Ответ или решение
Понимание использования LSTM (долговременная кратковременная память) для прогноза временных рядов является важной задачей в современном анализе данных, включая обработку временных последовательностей, таких как гистограммы работы машин. Применение функции model.fit()
для обучения модели LSTM на отдельных наборах данных позволяет лучше контролировать процесс обучения и извлекать информацию из каждого конкретного прохода данных.
Обзор проблемы
Вы имеете дело с временными рядами данных гистограмм из различных машинных прогонов. Задача — обучить LSTM для прогноза конечной гистограммы на основе предыдущих данных. Для этого вы можете использовать несколько методов, начиная с простого подхода по обучению модели на каждом прогоне данных отдельно.
Объяснение подхода: Обучение LSTM на каждом прогоне данных
-
Предварительная обработка данных:
- Группирование данных по
run_id
, что позволяет учитывать данные от каждого прогона отдельно. - Создание входных данных
X_train
и целевых данныхy_train
для модели LSTM с использованием скользящего окна длинойn_timesteps
.
- Группирование данных по
-
Циклический вызов
model.fit()
:- В коде, представленном вами, происходит циклическое прохождение по набору данных, после чего модель обучается на каждом наборе данных отдельно.
- Такой подход позволяет модели "перезапустить" процесс обучения и адаптироваться к уникальным паттернам каждого отдельного прогона.
-
Понимание работы с потерей:
- Видимое снижение потерь валидации может свидетельствовать о корректности подхода, поскольку модель адаптируется к данным каждого прогона.
Преимущества и возможные недостатки
-
Преимущества:
- Более высокий контроль индивидуального обучения на каждом прогоне.
- Возможность быстро адаптироваться к изменившимся данным от разных прогонов.
-
Недостатки:
- Потребление большого количества ресурсов при каждом вызове
model.fit()
, что может быть неэффективно. - Потенциальная потеря общей информации, в случае изолированного обучения от прогонов.
- Потребление большого количества ресурсов при каждом вызове
Рассмотрение альтернативных вариантов
-
Использование генераторов:
- Генератор, подающий данные по
run_id
как батчи, может улучшить обучение модели, снижая издержки по ресурсам и время.
- Генератор, подающий данные по
-
Объединение данных:
- Можно рассмотреть подход к объединению данных от всех прогонов и обучить модель на крупном наборе данных с использованием временной маркировки для различия отдельных сессий.
В зависимости от специфики задачи и ресурсов, доступных для обработки данных, выбор подхода может варьироваться. Важно постоянно оценивать метрики модели и добиваться наилучшего качества предсказания. Модель должна не только демонстрировать снижение потерь, но и быть устойчивой к переобучению, сохраняя общую структуру временных рядов.