Как справиться с сущностями разной длины в Keras DataGenerator?

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

Я решаю задачу предсказания, в которой мне нужно предсказать спрос на несколько статей, основываясь на их производительности за последние 7 дней. Чтобы максимально эффективно использовать данные, я пытаюсь реализовать подход скользящего окна, где я использую 7 дней в качестве входных данных для обучения (x) и производительность 8-го дня в качестве метки для обучения (y).
Так как я использую Keras в качестве фреймворка глубокого обучения, как мне объединить этот подход скользящего окна с пользовательским генератором данных, который питает мою сеть во время обучения? Различные статьи имеют разную длину данных (например, у статьи A есть данные за 200 дней, у статьи B только за 10 дней).
Я реализовал версию, где использую только одну выборку на статью, но это резко уменьшает количество данных, которые у меня есть для обучения.

Я столкнулся с аналогичной проблемой, и быстрое решение, которое я придумал, было пройти по основному набору данных, создать экземпляр TimeseriesGenerator для каждого из подмножеств и передать его в модель. Так что в вашем случае это будет выглядеть так: пройти по коллекции статей, создать экземпляр TimeseriesGenerator для каждой статьи и передать выборки с окнами в вашу модель, например:

from keras.preprocessing.sequence import TimeseriesGenerator

# Задать параметры обучения
window_length = ...
ix0, ix1 = ...
batch_size = ...

for article in articles:
        # Вставьте ваш код для генерации признаков и целей статьи
        x, y = ...

        model.fit_generator(TimeseriesGenerator(
                        x,
                        y,
                        window_length,
                        batch_size=batch_size,
                        start_index=ix0,
                        end_index=ix1
                ),
                steps_per_epoch=int(np.ceil((x.shape[0] - ix0 - ix1 - window_length)/float(batch_size))),
                epochs=50,
                verbose=1
        )

Теперь в зависимости от размера и состава вашего набора данных, вы можете либо:

  • запустить несколько эпох на статью
  • или обучить одну статью на эпоху, но для этого вам понадобится еще один цикл.

Ответ или решение

Создание и управление генератором данных в Keras с различной длиной входных данных — задача, требующая точного подхода. В частности, при решении задачи прогнозирования спроса на основе предыдущих 7 дней существует необходимость использования адаптивного алгоритма, чтобы учитывать варьирующуюся длину данных для различных статей.

Решение с использованием TimeseriesGenerator

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

Шаг 1: Подготовка данных и понимание структуры

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

from keras.preprocessing.sequence import TimeseriesGenerator
import numpy as np

# Константы
window_length = 7
batch_size = 32

for article in articles:
    # Генерация признаков и целевых значений для каждой статьи
    x, y = generate_features_and_labels(article)

    # Учитываем минимум данных для применения подхода скользящего окна
    if len(x) < window_length + 1:
        continue

    # Создаем генератор временных рядов
    generator = TimeseriesGenerator(x, y, length=window_length, batch_size=batch_size)

    model.fit_generator(generator, steps_per_epoch=len(generator), epochs=50, verbose=1)

Шаг 2: Оптимизация процесса обучения

Для оптимизации, можно рассмотреть следующие стратегии:

  • Адаптация числа эпох. Рассматривая длину данных для каждой статьи, можно динамически варьировать число эпох для достижения лучших результатов, эффективно используя временные данные.
  • Обработка по частям данных. В случае больших объемов данных разумно рассматривать обучение по кускам данных, например, по десяткам или группам статей.

Шаг 3: Управление обучением

В зависимости от структуры данных:

  • Если статьи имеют похожую длину данных, все подходы будут одинаково эффективны.
  • Если же разброс значителен, необходимо реализовать динамическое управление шагами обучения и числом окон.

Заключение

Предложенный метод предоставляет гибкость для обучения модели с учетом различной длины данных статей. Он реализует использование временных рядов на основе TimeseriesGenerator, обеспечивая равномерное распределение обучающих данных для каждой статьи.

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

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

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