LSTM – Внедрить векторизацию слов в слой с несколькими записями в одной дате

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

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

У меня есть 3 входных признака: фраза, стоимость и вес. Моя цель – предсказать ‘Стоимость’. Я использовал Keras texts_to_sequences для работы с текстовым входом в колонке ‘фраза’.

У меня есть следующие вопросы:

  1. как включить колонку Фраза в модель LSTM
  2. как обработать несколько записей за одну дату
  3. какая будет форма входных данных
  4. как мне структурировать модель, чтобы 1-й слой был слоем Embedding, 2-й – Dense и так далее.

Вот пример данных:

введите описание изображения здесь

Вот обработанные данные:

введите описание изображения здесь

Пожалуйста, помогите мне.

  1. Ваши фразы очень короткие, вам будет достаточно кодирования “мешка слов” вместо последовательности.

2-3. Если вы хотите прогнозировать общую стоимость за день, вы можете просто суммировать все признаки, включая BoW, за дату, а затем сделать предсказание временного ряда на полученных данных.

  1. Попробуйте просто LSTM, предсказывающий следующую дату на основе последовательности прошлых дат.

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

Вопрос: Использование LSTM с встраиванием слов и множественными записями за один день

Введение

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

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

1. Включение столбца phrase в модель LSTM

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

После этого целесообразно применить слой встраивания (Embedding Layer) для преобразования индексов слов в более низкоразмерные векторные представления. Это улучшает представление текстовых данных, добавляя контекст к словам.

Пример кода для предварительной обработки текста:

from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences

tokenizer = Tokenizer()
tokenizer.fit_on_texts(phrases)  # phrases - ваш столбец с фразами
sequences = tokenizer.texts_to_sequences(phrases)
max_sequence_length = max(len(seq) for seq in sequences)
padded_sequences = pad_sequences(sequences, maxlen=max_sequence_length)

2. Работа с множественными записями за один день

Для обработки нескольких записей с одной и той же датой, можно применить агрегацию данных. Это например может быть сумма или среднее значение затрат и веса. Кроме того, вы можете объединить встраивания фраз, используя подход "мешка слов" (Bag of Words), или представление TF-IDF (Term Frequency-Inverse Document Frequency), если текстовая информация является слишком короткой.

Пример кода для агрегации данных:

import pandas as pd

aggregated_data = data.groupby('date').agg({
    'cost': 'sum', 
    'weight': 'mean', 
    'phrase': ' '.join
}).reset_index()

3. Формат входных данных

Форма входных данных будет определяться выбранным подходом к обработке текстовых данных. Если вы используете встраивание для фраз, форма ввода будет (число_документов, max_sequence_length), где число_документов – это количество записей, подаваемых в модель.

  • Для признаков cost и weight вы можете использовать дополнительно другие входные данные, если потребуется, например, в сочетании с LSTM.

4. Структура модели

Структура вашей модели может быть простой, но эффективной, включающей слой встраивания, LSTM слой и полносвязный слой. Вот один из примеров:

from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense

model = Sequential()
model.add(Embedding(input_dim=num_words, output_dim=embedding_dim, input_length=max_sequence_length))
model.add(LSTM(100))
model.add(Dense(1, activation='linear'))  # Если предсказываем стоимость
model.compile(loss='mean_squared_error', optimizer='adam')

Заключение

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

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

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