Как подать на вход исторические данные?

Никогда в жизни не писал нейронные сети, но встала задача и надо ее решить.
Мне нужно, чтобы нейросеть умела прогнозировать какое кол-во товара и в какой день некий клиент закажет, на основании его прошлых заказов. Т.е., анализировать интервалы между прошлыми заказами и заказываемое кол-во.

Реализовал следующим образом:
Для обучения беру по 10 заказов, сортирую по дате, и 1 следующий как правильный ответ. (в сумме 5400+ таких связок)
Дату привожу к UNIX таймстепму и делю на 10млрд, чтобы получить что-то вроде 0.1526995496.
Кол-во делю на 10000 (пока не придумал как более правильно нормализовать данные).
На вход подаю массив, где чередуются дата и кол-во по каждому заказу
[0.1526995496, 0.2, 0.1526995637, 0.4, 0.1526995809, 1.0...]

На выходе массив с датой и кол-вом [0.1536585814, 0.0001]

Активатор у первого слоя ReLu, у выходного Linear.
Оптимизатор Adam, лосс MAE
(пробовал всё подряд)

model = Sequential()
model.add(Dense(units=20, activation=act.relu))
model.add(Dense(units=2, activation=act.linear))
model.compile(optimizer=opt.Adam(), loss=ls.mae, metrics=['accuracy'])
history = model.fit(np_input, np_output, batch_size=1000, epochs=500, validation_split=0.2)


График обучения выдает полнейший бред вроде такого (синяя это history['loss'], желтая accuracy)
60a5751941f8e539938157.png

Результат тоже не удовлетворительный
Previous orders:
2019-12-06 12:14:27 - 4.0
2019-12-10 11:25:44 - 2.0
2019-12-16 14:24:47 - 4.0
2020-01-03 13:16:28 - 4.0
2020-01-17 13:04:57 - 10.0
2020-03-27 14:25:57 - 2.0
2020-10-30 14:57:39 - 2.0
2020-11-09 15:00:24 - 3.0
2020-11-20 11:30:43 - 2.0
2021-01-06 11:20:15 - 1.0

Answer:
Date: 2020-01-02 14:58:58.516617
Amount:  13.0

Это самый адекватный ответ. Но дата в прошлое ушла, кол-во аномальное какое-то.
Иногда говорит "Закажи -16000 товара в 2851 году".

В общем, вопрос то в чем. Как мне правильно подать на вход сети исторические данные? И вообще всё ли я правильно делаю?
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Я бы попробовал входные данные подавать по дням(неделям и так далее, насколько глубока у вас история). Условно на вход 30 чисел.
1) за 31 дней до дня Х, купил 0 / 1000
2) за 30 дней до дня Х, купил 1 / 1000
....
30) вчера купил 50 / 1000
Выход интерпретировал как softmax по вариантам + количества товара
1) позвонит сегодня, вероятность 0.1
2) позвонит завтра, вероятность 0.6
3) на этой неделе - 0.1
4) ушёл к конкурентам и не чего покупать не собирается - 0.2
А) закажет товара 8 / 1000

П.С. И что у вас сеть такая примитивная, диплёрнингом и не пахнет, ну добавьте ещё два скрытых слоя по 10-20 нейронов что ли.
П.П.С И батч на 1/5 всей выборки это такое себе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы