Предобработка данных для прогнозирования временных рядов

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

У меня есть набор данных со следующей структурой

[
 [
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке, был продан?], # Час 1
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке, был продан?], # Час 2
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке, был продан?], # Час 3
                               :
 ],
 [
  [ продукт 2 , номер полки, позиция на подносе, время нахождения на полке, был продан?], # Час 1
  [ продукт 2 , номер полки, позиция на подносе, время нахождения на полке, был продан?], # Час 2
  [ продукт 2 , номер полки, позиция на подносе, время нахождения на полке, был продан?], # Час 3
                              :
 ],
                              :
]

Моя цель — предсказать для нового продукта, скажем product_n, будет ли он продан (за 3 часа до этого).

Мой вопрос в том, как обработать данные для рекуррентной нейронной сети, поскольку вектор предсказания был продан? доступен для каждый час.

Если сказать подробнее, поскольку

[
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке], # Час 1
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке], # Час 2
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке], # Час 3
                               :
 ],

является одним наблюдением для RNN, как мне назначить был продан? к этому? Поскольку len(X) должно быть равно len(y)

был продан? доступен для каждого наблюдения, следует ли брать максимум за 3 часа и назначать его наблюдению?

Как

X = [
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке], # Час 1
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке], # Час 2
  [ продукт 1 , номер полки, позиция на подносе, время нахождения на полке], # Час 3
                               :
 ],
и 
y = [max(был продан?)]

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

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

Во-вторых, несколько моментов:

  • Для категориальных признаков (например, конкретные продукты) мы обычно представляем их в виде векторов с одной единицей (one-hot encoding) (https://machinelearningmastery.com/why-one-hot-encode-data-in-machine-learning/).
  • Для числовых признаков (например, время нахождения на полке [минуты/часы и т. д.]) мы можем представить их в виде самих значений.

Затем, для ввода в вашу модель, просто объедините эти признаки, чтобы сформировать “длинный” n-мерный вектор.

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

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

Шаг 1: Структурирование данных

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

data = [
    [[product_1, shelf_number, position_on_tray, time_on_shelf, was_sold], ...],  #  ч.1
    [[product_2, shelf_number, position_on_tray, time_on_shelf, was_sold], ...],  #  ч.2
    ...
]

Шаг 2: Загрузка данных

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

Шаг 3: Кодирование категориальных данных

Для категориальных признаков, таких как product и shelf_number, вы можете использовать метод one-hot кодирования:

from sklearn.preprocessing import OneHotEncoder
import numpy as np

# Пример данных
products = ["product_1", "product_2", "product_3"]
shelf_numbers = [1, 2, 3]

encoder_product = OneHotEncoder(sparse=False)
encoded_products = encoder_product.fit_transform(np.array(products).reshape(-1, 1))

encoder_shelf = OneHotEncoder(sparse=False)
encoded_shelves = encoder_shelf.fit_transform(np.array(shelf_numbers).reshape(-1, 1))

Шаг 4: Поделите данные на X и y

Чтобы создать матрицы X и y, где X — это ваши входные данные, а y — целевая переменная (признак was sold?), вы можете сделать следующее:

  1. Соберите наблюдения для каждого продукта за 3 часа.
  2. Для каждой группы данных после 3 часов примите максимальное значение was sold? в качестве метки для y.
X = []
y = []

for product_data in data:
    product_sequence = []
    for hour_data in product_data:
        features = [
            hour_data[1:],  # исключаем 'was sold?' из признаков
        ]
        product_sequence.append(features)

        # В лейбл добавляем максимальное "was sold?" за предыдущие 3 часа
        if len(product_sequence) >= 3:
            target = max(hour_data[4] for hour_data in product_sequence[-3:])
            y.append(target)

    X.append(np.array(product_sequence[:-3]))  # Убираем последние 3 часа, т.к. их будем использовать для предсказания

Шаг 5: Нормализация числовых данных

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

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

Шаг 6: Подготовка данных для RNN

Теперь, когда у вас есть готовые X_scaled и y, вы можете преобразовать данные в формат, подходящий для RNN. Данные должны быть трехмерными (samples, time steps, features):

X_rnn = np.array(X_scaled).reshape((-1, time_steps, num_features))
y_rnn = np.array(y)

Шаг 7: Обучение и валидация модели

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

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

model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(time_steps, num_features)))
model.add(Dense(1, activation='sigmoid'))  # Для бинарной классификации
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

Заключение

Так вы сможете подготовить ваши данные для прогнозирования вероятности продажи новых продуктов на основе характеристик, собранных за прошедшие часы. Важно не забывать о различной обработке и кодировании данных в зависимости от их типа (категориальные или числовые) и о своевременной нормализации. Удачи с вашим проектом!

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

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