Подходящий способ добавления функции во входные данные модели прогнозирования временных рядов - PullRequest
0 голосов
/ 13 марта 2020

Я некоторое время работал над моделью прогнозирования спроса. Я использую модель LSTM, чтобы предсказать будущие потребности семейства продуктов компании. Чтобы закрепить и проиллюстрировать мои необработанные данные, приведем пример, приведенный ниже:


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

np.random.seed(1)

raw_data = pd.DataFrame({"product_type": ["A"]*3 + ["B"]*3 + ["C"]*3, "product_family": ["x", "y", "z", "t", "u", "y", "p", "k", "l"]})

for col in [str(x)+"-"+str(y) for x in range(2015, 2020) for y in range(1, 13)]:
    raw_data[col] = np.random.randint(10, 50, 9)

raw_data.head()

  product_type product_family  2015-1  ...  2019-10  2019-11  2019-12
0            A              x      47  ...       15       39       38
1            A              y      22  ...       37       28       29
2            A              z      18  ...       41       41       37
3            B              t      19  ...       32       44       29
4            B              u      21  ...       22       29       25
[5 rows x 62 columns]

Как видно выше, данные имеют две номинальные характеристики, а остальные это данные прошлых потребностей.


Сначала позвольте мне объяснить, что я делаю в моем случае:


Сначала я выбираю product_family для прогнозирования и позволяю этому product_family be "x":

prod_family_data = raw_data.loc[raw_data.product_family == "x", raw_data.columns[2:]].to_numpy()

Затем я создаю x и y обучающего набора:

x_train, y_train = [], []

for i in range(0, len(prod_family_data) - 12):
    x_train.append(prod_family_data[i: i + 12])
    y_train.append(prod_family_data[i + 12])

x_train = np.array(x_train)

y_train = np.array(y_train)

array([[47, 11, 21, 32, 34, 14, 35, 49, 44, 42, 31, 18],
       .  
       .
       .
       [14, 20, 45, 13, 48, 43, 45, 49, 49, 37, 15, 39]], dtype=object)

y_train

array([28, 38, 12, 12, 23, 29, 19, 23, 39, 38, 18, 40, 46, 48, 44, 27, 10,
       24, 25, 22, 15, 28, 44, 46, 22, 12, 45, 47, 38, 21, 46, 26, 12, 21,
       18, 14, 20, 45, 13, 48, 43, 45, 49, 49, 37, 15, 39, 38])

x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], 1)

x_train.shape

(48, 12, 1)

y_train.shape

(48,)

Затем я прогнозирую требование product_family с помощью LSTM модель, затем я go вернуться к началу, выберите другой product_family, промойте и повторите.

Интересно, есть ли способ добавить функцию product_family на вход (и может быть product_type и другими номинальными качествами продуктов в будущем) модели и сразу подавать ее в модель?

Кроме того, есть ли способ связать данные спроса с временными метками для ввода чтобы модель уловила тренд или сезонность данных /

1 Ответ

1 голос
/ 13 марта 2020

Сначала я бы порекомендовал вам переосмыслить форму вашего набора данных. Классифицированный набор данных «X» classi c time ser ie, поданный в сеть LSTM, будет иметь трехмерную форму:

  1. X.shape[0]: количество временных рядов (используется для обучения / тестирования )
  2. X.shape[1]: количество временных шагов во временном ряду
  3. X.shape[2]: количество признаков каждого временного ряда

В вашем примере, если вы иметь только один раз ser ie для уникальной пары (product_type, product_familly), группирование вашего временного ряда по семейству продуктов "x" должно переводиться в:

  1. X.shape[0]: номер product_type, включая "x "product_familly
  2. X.shape[1]: число временных шагов в" x "сумме продажи product_familly
  3. X.shape[2]: 1, поскольку ваша единственная функция - это сумма продажи

Вы можете добавить product_type или product_familly непосредственно в 3-е измерение (X.shape[2]) вашего набора данных.

Даже если информация никогда не меняется во временных шагах, она будет учитываться на этапе обучения и может использоваться при прогнозировании. Это хорошая идея, чтобы сделать это? Я не уверен в этом.

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

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

...