Как обрабатывать сдвиг в прогнозируемой стоимости

Я реализовал модель прогнозирования, используя LSTM в Керасе. Набор данных разделен на 15 минут, и я прогнозирую на 12 будущих шагов.

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

 введите описание изображения здесь

Как справиться с этой проблемой.? Как данные должны быть преобразованы для решения этой проблемы.?

Модель, которую я использовал, приведена ниже

init_lstm = RandomUniform(minval=-.05, maxval=.05)
init_dense_1 = RandomUniform(minval=-.03, maxval=.06)

model = Sequential()

model.add(LSTM(15, input_shape=(X.shape[1], X.shape[2]), kernel_initializer=init_lstm, recurrent_dropout=0.33))

model.add(Dense(1, kernel_initializer=init_dense_1, activation='linear'))

model.compile(loss='mae', optimizer=Adam(lr=1e-4))

history = model.fit(X, y, epochs=1000, batch_size=16, validation_data=(X_valid, y_valid), verbose=1, shuffle=False)

Я сделал такие прогнозы

my_forecasts = model.predict(X_valid, batch_size=16)

Данные временных рядов преобразуются в контролируемые для подачи в LSTM с помощью этой функции

# convert time series into supervised learning problem
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    n_vars = 1 if type(data) is list else data.shape[1]
    df = DataFrame(data)
    cols, names = list(), list()
    # input sequence (t-n, ... t-1)
    for i in range(n_in, 0, -1):
        cols.append(df.shift(i))
        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
    # forecast sequence (t, t+1, ... t+n)
    for i in range(0, n_out):
        cols.append(df.shift(-i))
        if i == 0:
            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
        else:
            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
    # put it all together
    agg = concat(cols, axis=1)
    agg.columns = names
    # drop rows with NaN values
    if dropnan:
        agg.dropna(inplace=True)
    return agg

super_data = series_to_supervised(data, 12, 1)

Мои временные ряды разные. var2 - это то, что мне нужно прогнозировать. Я бросил будущее var1 как

del super_data['var1(t)']

Раздельный поезд и действительный как этот

features = super_data[feat_names]
values = super_data[val_name]

ntest = 3444

train_feats, test_feats = features[0:-n_test], features[-n_test:]
train_vals, test_vals = values [0:-n_test], values [-n_test:]

X, y = train_feats.values, train_vals.values
X = X.reshape(X.shape[0], 1, X.shape[1])

X_valid, y_valid = test_feats .values, test_vals .values
X_valid = X_valid.reshape(X_valid.shape[0], 1, X_valid.shape[1])

Я не сделал данные стационарными для этого прогноза. Я также пытался взять разницу и сделать модель как можно более стационарной, но проблема осталась прежней.

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

Other Things I have tried

=> Tried other optimizers
=> Tried mse loss and custom log-mae loss functions
=> Tried varying batch_size
=> Tried adding more past timesteps
=> Tried training with sliding window and TimeSeriesSplit

Я понимаю, что модель копирует на нее последнее известное значение, тем самым сводя к минимуму потери настолько, насколько это возможно

Проверка и потери при обучении остаются достаточно низкими в течение всего процесса обучения. Это заставляет меня задуматься, нужно ли мне придумать новую функцию потерь для этой цели.

Это необходимо? Если да, то на какую функцию потерь мне идти.?

Я перепробовал все методы, на которые наткнулся. Я не могу найти какой-либо ресурс, который указывает на такого рода проблемы. Это проблема данных.? Это потому, что LSTM очень трудно понять проблему?

7 голосов | спросил Sreeram TP 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 10 Sep 2018 09:48:48 +0300 2018, 09:48:48

2 ответа


0

вы попросили мою помощь по адресу:

прогноз акций: модель GRU прогнозирует те же заданные значения вместо будущей цены акций

Надеюсь, не поздно. Вы можете попробовать изменить числовую четкость своих функций . Позвольте мне объяснить:

Аналогично моему ответу в предыдущей теме; алгоритм регрессии будет использовать значение из временного окна, которое вы даете в качестве образца, чтобы минимизировать ошибку. Предположим, вы пытаетесь предсказать цену закрытия BTC в момент времени t. Одна из ваших функций состоит из предыдущих цен закрытия, и вы предоставляете окно временного ряда из последних 20 входных данных от t-20 до t-1. Регрессор, вероятно, научится выбирать значение закрытия на шаге времени t-1 или t-2 или значение закрытия в этом случае, обманывая. Подумайте так: если цена закрытия составляла 6340 долл. В момент t-1, прогноз 6340 долл. Или что-то близкое в момент t + 1 минимизировало бы ошибку при сильнейшем. Но на самом деле алгоритм не изучал никаких шаблонов; он просто реплицируется, так что в основном он выполняет только свои обязанности по оптимизации.

Подумайте аналогично из моего примера: отклоняя явность, я имею в виду следующее: не указывайте цены закрытия напрямую, а масштабируйте их или не используйте явные цены вообще. Не используйте какие-либо функции, явно показывающие цены закрытия для алгоритма, не используйте open, high, low и т. Д. Для каждого временного шага. Здесь вам нужно проявить творческий подход, спроектировать функции, чтобы избавиться от явных; Вы можете дать квадрат близких различий (регрессор все еще может украсть из прошлого с линейными различиями, с опытом), его отношение к объему. Или, может сделать функции категориальными, оцифровав их таким образом, который имеет смысл использовать. Суть в том, чтобы не давать прямого представления о том, что следует прогнозировать, а только предоставлять шаблоны для работы алгоритма.

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

Если что-то будет неправильно понято или отсутствует, я буду рядом. Надеюсь, я смогу помочь. Удачи.

ответил Ugur MULUK 4 72018vEurope/Moscow11bEurope/MoscowSun, 04 Nov 2018 16:53:13 +0300 2018, 16:53:13
0

Скорее всего, ваш LSTM учится угадывать, какое было его предыдущее входное значение (немного модулированное). Вот почему вы видите «сдвиг».

Допустим, ваши данные выглядят так:

x = [1, 1, 1, 4, 5, 4, 1, 1]

И ваш LSTM научился просто выводить предыдущий ввод для текущего временного шага. Тогда ваш вывод будет выглядеть так:

y = [?, 1, 1, 1, 4, 5, 4, 1]

Поскольку в вашей сети есть какой-то сложный механизм, это не так просто, но в принципе «сдвиг», который вы видите, вызван этим явлением.

ответил Alex 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 26 Sep 2018 05:48:59 +0300 2018, 05:48:59

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132