Вопрос или проблема
Я решаю задачу предсказания, в которой мне нужно предсказать спрос на несколько статей, основываясь на их производительности за последние 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
, обеспечивая равномерное распределение обучающих данных для каждой статьи.
Данный подход позволяет максимально эффективно использовать доступные данные, обеспечивая надежные прогнозы спроса. Подобная реализация не только решает проблему, но и может быть легко расширена для других задач прогнозирования.