Я работал над сайд-проектом, пытаясь самостоятельно изучить машинное обучение с Keras, и я думаю, что застрял здесь.
Мое намерение состоит в том, чтобы предсказать доступность велосипедов в общедоступной системе обмена, которая имеет 31 станцию,Пока я только тренирую свою модель, чтобы предсказать доступность только одной станции.Я хотел бы делать онлайн прогнозы с пакетным обучением.Я хотел бы начать давать ему несколько велосипедов, например, 00:00
с N заданными временными шагами плюс день года и день недели.
Входные данные таковы:
- День года, закодированный в виде целых чисел, 1-JAN равен 0, 2-JAN равен 1 ...
- Время в 5 'интервалах, закодированное в виде целых чисел, аналогично предыдущему, 00:00 - 0, 00:05 - 1 ...
- День недели, снова закодированный как int
Затем эти 3 столбца нормализуются, затем я добавляю столбцы, которые относятся к велосипедамони представляют собой одно горячее кодирование, если на станции имеется 20 байков, кодированный массив будет иметь длину 21. Затем данные преобразуются в контролируемую проблему более или менее в соответствии с этим руководством.
ТеперьЯ делю свой набор данных на обучающие (65%) и тестовые (35%) выборки.А затем определите нейронную сеть следующим образом:
model = Sequential()
model.add(LSTM(lstm_neurons, batch_input_shape=(1000, 5, 24), stateful=False))
model.add(Dense(max_cases, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy', 'mse', 'mae'])
Подходит для модели
for i in range(epochs):
model.fit(train_x, train_y, epochs=1, batch_size=new_batch_size, verbose=2, shuffle=False)
model.reset_states()
w = model.get_weights()
График точности выглядит хорошо, но потери приводят к странным вещам.
Когда тренировка заканчивается, я предсказываю значения, я изменяю состояние без состояния на состояние и изменяю размер пакета
model = Sequential()
model.add(LSTM(lstm_neurons, batch_input_shape=(1, 5, 24), stateful=True))
model.add(Dense(max_cases, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy', 'mse', 'mae'])
model.set_weights(w)
Теперь я прогнозирую, используя значения тестов, полученные ранее
for i in range(0, len(test_x)):
auxx = test_x[i].reshape((batch_size, test_x[i].shape[0], test_x[i].shape[1])) # (...,n_in,4)
yhat = model.predict(auxx, batch_size = batch_size)
Это результат, я его масштабируюнемного поближе, а не многолюдный сюжет.Он совсем не выглядит плохо, в нем есть некоторые ошибки, но в целом прогнозы выглядят достаточно хорошими.
После этого я создаю свой набор данныхсделать онлайн-прогнозирование и прогноз
for i in range(0,290):
# ...
predicted_bikes = model.predict(data_to_feed, batch_size = 1)
# ...
В результате получится непрерывная линия.
As I 'как мы видели на предыдущем графике, предсказанное значение перемещается как реальный интервал позже к реальному значению, что заставляет меня думать, что нейронная сеть научилась повторять предыдущие значения.Вот почему здесь я получил прямую линию.