@saneok44

LSTM прогнозирование на 1 шаг, как спрогнозировать на N шагов?

Имеется датасет из 2 колонок в каждом по 4000 наблюдений. При тестовой валидации где окно состоит из 100 значений и предсказание на 1 шаг все работает отлично, но как предсказать на N шагов за пределы датасета?

Обучающая выборка 3500, Тестовая 500, окно включает 100 наблюдений
X_train.shape(3400, 100, 2) y_train.shape(3400,)
X_test.shape(400, 100, 2) y_test.shape(400,)

делил по стандартной схеме:
X = []
            y = []
            for i in range(self.__seq_length, train.shape[0]):
                X.append(train[i-self.__seq_length: i])
                y.append(train[i, 0])
            return np.array(X), np.array(y)

Предик по первой колонке одно значение.

Как предсказать за пределы датасета?
Ничего не придумал как двигать окна запустив цикл на 100 итераций, окно для второй колонки двигать влево, а окно для первой колонки вправо каждый раз дополняя новыми предиктами в итоге формировался нужный массив (1, 100, 2)

predicted = []

        for i in range(self.__seq_length + 1):
            p = None
            y = []
            if i == 0:
                window = self.__dataset[-(self.__seq_length + i):, 1]
                y = self.__dataset[-(self.__seq_length + i):, 0]
            else:
                window = self.__dataset[-(self.__seq_length + i):-i, 1]
                ls = -(self.__seq_length - i)
                y = []
                if ls < 0:
                    pred_next_window = self.__dataset[ls:, 0]
                    for j in range(pred_next_window.shape[0]):
                        val = pred_next_window[j]
                        y.append(val)
                    for j in range(len(predicted)):
                        val = predicted[j]
                        y.append(val)

                    y = np.array(y)
                else:
                    for j in range(len(predicted)):
                        val = predicted[j]
                        y.append(val)
                    y = np.array(y)

            new_seq = np.transpose(np.array((y, window)))

            print(str.format('iteration: {0}\n{1}', i + 1, new_seq))

            scale = MinMaxScaler()
            new_seq = scale.fit_transform(new_seq)

            new_seq = np.reshape(new_seq, (1, new_seq.shape[0], new_seq.shape[1]))
            output = self.__model.predict(new_seq)

            scale_ = self.__val_scale/scale.scale_[0]
            predict = output*scale_

            print(str.format('Next Value: {0}', predict))

            predicted.append(predict[0, 0])

        return np.array(predicted)


По итогу :
Пока предик тестовый красный график идет вместе с зеленым то что за зеленым графиком это уже манипуляции с перемещением окон, по итогу дичь как быть если я еще завишу от 2 колонки?
60c64c67c9abe362978521.png
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 2
@rPman
Боюсь у тебя предсказание не получается, твой алгоритм выдает усреднение, а значит эти данные нельзя смешивать с исходными чтобы попытаться предсказать следующие данные, ведь динамика поведения предсказанных данных отличается.

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

Избавляйся от вот таких лесенок, для любого алгоритма это хаос, а его не предугадаешь, преобразуй данные к другому виду, избавляйся от бесконечных значений первой производной. Предсказывай не сами значения а какие то вычисленные над ними, т.е. к примеру какие то оценки над данными в окне (мин/макс, матожидание и прочее прочее) выход за пределы, может интеграл (площадь под графиком) значений над и под некоторым средним, вероятности быть выше/ниже значения (в виде вектора для нескольких значений) или количества попаданий на интервалы и т.п.
Ответ написан
Комментировать
@dmshar
Мне кажется, что у вас какое-то недопонимание на самом базовом уровне.
Давайте разбираться. Начнем с начала. У вас датасет с двумя колонками. Т.е. у вас один объект, который последовательно во времени генерирует пары значений. И всего нагенерировал 4000 разных значений.
Вы делаете предсказание. Чего от чего? На графике показан один ряд чисел. И по оси Х очевидно номера наблюдений. Т.е. у вас график зависимости какого-то одного значения во-первых, от времени, а во-вторых, возможно, от второго значения. Т.е. по сути у вас многомерная (двумерная) регрессия. И а самом деле ваш датасет должен содержать не две, а три колонки (те что вы описали+ время).
Разумеется, при такой постановке для того, что-бы предсказать значение целевой переменной надо подать на вход значение времени для которого вы делаете прогноз (это просто) и значение второй переменной. А а его-то просто так ни откуда не возьмёшь.
Многомерная модель временного ряда, даже с помощью LSTM, обрабатывается уже по другой схеме чем обычные одномерные временные ряды. Там используются специальные многошаговые схемы решений и еще некоторые специальные ухищрения. Описать это все в одном сообщении на форуме дело сложное. Лучше я дам ссылочки на статьи, в которых подробно описывается, как эти задачи решаются, в том числе с помощью Keras.
https://www.machinelearningmastery.ru/multivariate...
https://www.machinelearningmastery.ru/how-to-devel...
https://habr.com/ru/post/495884/
https://habr.com/ru/post/505338/
Посмотрите, если разберетесь - то ваша задача может решится легко. Останутся вопросы - задавайте, попробуем помочь дальше.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы