Вопрос или проблема
У меня есть набор данных со следующей структурой
[
[
[ продукт 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?
), вы можете сделать следующее:
- Соберите наблюдения для каждого продукта за 3 часа.
- Для каждой группы данных после 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'])
Заключение
Так вы сможете подготовить ваши данные для прогнозирования вероятности продажи новых продуктов на основе характеристик, собранных за прошедшие часы. Важно не забывать о различной обработке и кодировании данных в зависимости от их типа (категориальные или числовые) и о своевременной нормализации. Удачи с вашим проектом!