Разрыв задержки между реальностью и предсказанием

Используя машинное обучение (в качестве библиотеки я пробовал Tensorflow и Tflearn (которые, как я знаю, являются просто оболочкой Tensorflow)) я пытаюсь предсказать заторы в районе на следующую неделю (см. мои предыдущие вопросы, если вы хотите больше предысторию о нем). Мой тренировочный набор состоит из 400 000 записей с тегами (с датой и значением перегрузки для каждой минуты).

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

Если бы мне пришлось нарисовать диаграмму с реальностью и прогнозом, вы бы увидели, что мой прогноз, хотя и имеет ту же форму, что и реальность, находится заранее. Она увеличивается/уменьшается перед реальностью. Это начало заставлять меня думать, что, возможно, у меня были проблемы с тренировками. Казалось бы, мой прогноз не начался, когда моя тренировка закончилась.

Оба моих набора данных (обучение/тестирование) находятся в двух разных файлах. Сначала я тренируюсь на своем тренировочном наборе (для удобства скажем, он заканчивается на 100-й минуте, а мой тестовый набор начинается на 101-й минуте), как только моя модель сохранена, я делаю свои прогнозы, обычно она должна начать предсказывать 101 или я где-то ошибаюсь ? Потому что кажется, что он начинает предсказывать путь после того, как мое обучение остановилось (если я сохраню свой пример, он начнет, например, предсказывать значение 107).

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

Следуя некоторым советам, найденным на другом веб-сайте, кажется, что наличие пробела в моем наборе обучающих данных (в данном случае отсутствующая временная метка) может быть проблемой, учитывая, что некоторые из них были (всего отсутствовало от 7 до 9% всего набора данных) я Я использовал Pandas для добавления отсутствующих временных меток (я также дал им значение перегрузки последней известной временной метки), хотя я действительно думаю, что это, возможно, немного помогло (разрыв меньше), но не устранил проблему.

Я пробовал многошаговое прогнозирование, многомерное прогнозирование, LSTM, GRU, MLP, Tensorflow, Tflearn, но это ничего не меняет, заставляя меня думать, что это могло произойти из моего обучения. Вот мой модельный тренинг.

def fit_lstm(train, batch_size, nb_epoch, neurons):
    X, y = train[:, 0:-1], train[:, -1]
    X = X.reshape(X.shape[0], 1, X.shape[1])
    print X.shape
    print y.shape
    
    model = Sequential()
    model.add(LSTM(neurons, batch_input_shape=(None, X.shape[1], X.shape[2]), stateful=False))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    for i in range(nb_epoch):
        model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
        model.reset_states()
    return model

2 формы:

(80485, 1, 1)

(80485,)

(В этом примере я использую только 80 КБ данных для обучения скорости).

В качестве параметра я использую 1 нейрон, 64 размера партии и 5 эпох. Мой набор данных состоит из 2 файлов. Во-первых, это учебный файл с двумя столбцами:

отметка времени | ценности

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

У вас есть идея, что может быть причиной этой проблемы?

Изменить: в моем коде у меня есть эта функция:

# invert differencing
    yhat = inverse_difference(raw_values, yhat, len(test_scaled)+1-i)
# invert differenced value
def inverse_difference(history, yhat, interval=1):
    return yhat + history[-interval]

Предполагается инвертировать разницу (перейти от масштабированного значения к реальному). При использовании его, как в вставленном примере (используя тестовый набор), я получаю совершенство, точность выше 95% и отсутствие пробелов. Использование тестового набора для инверсии разницы

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

Почему это происходит? Есть ли объяснение этой проблеме?


person Eric Godard    schedule 31.08.2017    source источник


Ответы (1)


Нашел. Это была проблема с функцией "def inverse_difference(history, yhat, interval=1):". На самом деле, это делает мой результат похожим на мои последние тренировки. Вот почему у меня был пробел, поскольку в моих данных есть закономерность (пик всегда более или менее в один и тот же момент), я думал, что он делает прогноз, а он просто возвращает мне значения из обучения.

person Eric Godard    schedule 03.09.2017