Может ли RNN обучаться для каждого t во времени на новом наборе данных (много записей)?

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

По сути, мой набор данных не является простым многомерным временным рядом, как это часто бывает (в какой-то степени).

На каждый месяц у меня есть N записей (не менее 3000). Может ли RNN любого сорта (пожалуйста, простите мою неосведомлённость, так как я новичок в глубоком обучении) запомнить то, что она узнала из i-го подмножества и продолжить обучение…

Данные выглядят следующим образом:

+======================================================================================================================================================================================+
| индекс, цель, признак1, признак2, признак3, признак4, признак5, признак6, признак7, признак8, признак9, признак10, признак11, признак12, признак13, признак14, признак15, признак16 |
+======================================================================================================================================================================================+
| 2013-01-01, 1, 12, 0.006750, 21.192372, 39.119279, 0, 0, 0, 0, 13.602740, 117691.0, 0.06, 17259.0, 61491.0, 10.960000, 44620.0,                                                      |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2013-01-01, 1, 12, 0.256899, 21.192372, 39.119279, 0, 0, 0, 0, 30.282192, 835.0, 0.06, 221.0, 344.0, 10.004412, 406.0,                                                               |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2013-01-01, 0, 12, 0.000500, 21.192372, 39.119279, 0, 0, 0, 0, 30.282192, 49292.0, 0.04, 10853.0, 22945.0, 10.004412, 20132.0,                                                       |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

и список продолжается для других месяцев.

ИЗМЕНЕНИЕ

Мой дата-фрейм с детскими криками, с повторяющимися многомерными временными рядами выглядит следующим образом:

индекс        признаки...
2013-01-01  
2013-01-01
2013-01-01
...
2013-02-01
2013-02-01
2013-02-01
...

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

Я получил что-то вроде:

многоуровневый_индекс   признаки...
1 2013-01-01
  2013-02-01
  2013-03-01
  ...   
2 2013-01-01
  2013-02-01
  2013-03-01
  ...
...

Могу ли я использовать все данные для обучения и подать их в решение LSTM Keras (или другое, но предпочтительно на Python)? Я следую подходу, который нашёл здесь

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

Обычная RNN имеет тенденцию к исчезновению или взрывам градиентов, особенно учитывая, что у вас такое большое количество временных меток. Я бы рекомендовал вам попробовать LSTM, чтобы избежать этого настолько, насколько это возможно. В идеале да, она должна помнить, что произошло ранее, и учиться на этом.

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

Конечно, давайте глубже разберемся с вашей задачей, где вы хотите использовать рекуррентные нейронные сети (RNN), прежде всего их варианты, такие как LSTM (Long Short-Term Memory), для обработки ваших многомерных временных рядов.

1. Постановка задачи

Вы хотите предсказать целевое значение (target) на основе множества признаков (features) и ранее наблюдаемых данных. Ваши данные содержат записи за каждый месяц, и вы имеете достаточно большой объем данных — минимум 3000 записей в месяц. С распределением данных по месяцам, вы можете столкнуться с проблемами, связанными с учетом временных зависимостей и последовательностей.

2. RNN и LSTM для обучения

Рекуррентные нейронные сети (RNN) предназначены для работы с последовательными данными. Однако, как вы упомянули, стандартные RNN могут сталкиваться с проблемами исчезающего и взрывающегося градиента, особенно при работе с длительными последовательностями. Здесь на помощь приходят LSTM, которые предназначены для решения этих проблем, сохраняя долгосрочные зависимости в данных.

3. Подготовка данных

Перед обучением модели необходимо тщательно подготовить данные:

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

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

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

4. Структура LSTM в Keras

Вот пример кода на Python с использованием Keras для создания LSTM модели, которая может быть применена к вашим данным:

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout

# Загрузка данных
# df = pd.read_csv('your_data.csv')

# Нормализуем данные
scaler = MinMaxScaler(feature_range=(0,1))
scaled_data = scaler.fit_transform(df.values)

# Подготовка данных для LSTM
def create_dataset(data, time_step=1):
    X, Y = [], []
    for i in range(len(data) - time_step - 1):
        X.append(data[i:(i + time_step), :-1])  # все признаки, кроме целевой переменной
        Y.append(data[i + time_step, -1])  # целевая переменная
    return np.array(X), np.array(Y)

time_step = 10  # количество временных шагов для входа
X, y = create_dataset(scaled_data, time_step)

# Изменение формы X для LSTM [samples, time steps, features]
X = X.reshape(X.shape[0], X.shape[1], X.shape[2])

# Создание модели LSTM
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(X.shape[1], X.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(1))  # предсказываем только одно значение

# Компиляция модели
model.compile(optimizer='adam', loss='mean_squared_error')

# Обучение модели
model.fit(X, y, epochs=100, batch_size=32)

5. Предсказания и постобработка

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

Заключение

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

Надеюсь, это поможет вам в вашем проекте! Если у вас возникнут дополнительные вопросы, пожалуйста, не стесняйтесь задавать их.

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

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