Запуск model.fit несколько раз для LSTM?

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

У меня есть данные гистограмм временных рядов от множества отдельных запусков машин (подробности см. в этом посте).

Я работаю над обучением 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 на каждом прогоне данных

  1. Предварительная обработка данных:

    • Группирование данных по run_id, что позволяет учитывать данные от каждого прогона отдельно.
    • Создание входных данных X_train и целевых данных y_train для модели LSTM с использованием скользящего окна длиной n_timesteps.
  2. Циклический вызов model.fit():

    • В коде, представленном вами, происходит циклическое прохождение по набору данных, после чего модель обучается на каждом наборе данных отдельно.
    • Такой подход позволяет модели "перезапустить" процесс обучения и адаптироваться к уникальным паттернам каждого отдельного прогона.
  3. Понимание работы с потерей:

    • Видимое снижение потерь валидации может свидетельствовать о корректности подхода, поскольку модель адаптируется к данным каждого прогона.

Преимущества и возможные недостатки

  • Преимущества:

    • Более высокий контроль индивидуального обучения на каждом прогоне.
    • Возможность быстро адаптироваться к изменившимся данным от разных прогонов.
  • Недостатки:

    • Потребление большого количества ресурсов при каждом вызове model.fit(), что может быть неэффективно.
    • Потенциальная потеря общей информации, в случае изолированного обучения от прогонов.

Рассмотрение альтернативных вариантов

  1. Использование генераторов:

    • Генератор, подающий данные по run_id как батчи, может улучшить обучение модели, снижая издержки по ресурсам и время.
  2. Объединение данных:

    • Можно рассмотреть подход к объединению данных от всех прогонов и обучить модель на крупном наборе данных с использованием временной маркировки для различия отдельных сессий.

В зависимости от специфики задачи и ресурсов, доступных для обработки данных, выбор подхода может варьироваться. Важно постоянно оценивать метрики модели и добиваться наилучшего качества предсказания. Модель должна не только демонстрировать снижение потерь, но и быть устойчивой к переобучению, сохраняя общую структуру временных рядов.

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

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