У вас все еще есть предсказанные значения около нуля? Вы делали пересчет данных?

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

Однако при проверке по тестовому набору (или даже обучающему набору) амплитуда прогнозируемого ряда отклоняется, а иногда смещается, чтобы быть всегда всегда положительной или всегда отрицательной, т. Е. Сдвигается от изменения 0%, которое я думаю, будет правильным для такого рода вещей.

Я придумал следующий минимальный пример, чтобы показать проблему:

df = pandas.DataFrame.from_csv('test-data-01.csv', header=0)
df['pct'] = df.value.pct_change(periods=1)

seq_len=48
vals = df.pct.values[1:] # First pct change is NaN, skip it
sequences = []
for i in range(0, len(vals) - seq_len):
    sx = vals[i:i+seq_len].reshape(seq_len, 1)
    sy = vals[i+seq_len]
    sequences.append((sx, sy))

row = -24
trainSeqs = sequences[:row]
testSeqs = sequences[row:]

trainX = np.array([i[0] for i in trainSeqs])
trainy = np.array([i[1] for i in trainSeqs])

model = Sequential()
model.add(LSTM(25, batch_input_shape=(1, seq_len, 1)))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')
model.fit(trainX, trainy, epochs=1, batch_size=1, verbose=1, shuffle=True)

pred = []
for s in trainSeqs:
    pred.append(model.predict(s[0].reshape(1, seq_len, 1)))
pred = np.array(pred).flatten()

plot(pred)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])

Как видите, я создаю последовательности обучения и тестирования, выбирая последние 48 часов и следующий шаг в кортеже, а затем продвигаясь вперед на 1 час, повторяя процедуру. Модель представляет собой очень простой 1 LSTM и 1 плотный слой.

Я бы ожидал, что график отдельных предсказанных точек довольно хорошо будет перекрывать график обучающих последовательностей (после всего того же набора, в котором они обучались), и своего рода совпадение для тестовых последовательностей. Однако я получаю следующий результат наданные обучения:

Оранжевый: достоверные данныеСиний: прогнозируемые данные

Есть идеи, что может происходить? Я что-то не так понял?

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

plot(pred*12-0.03)
plot([i[1] for i in trainSeqs])
axis([2500, 2550,-0.03, 0.03])

Как вы можете видеть, прогноз хорошо соответствует реальным данным, он просто как-то сдавлен и смещен, и я не могу понять, почему.

 milos.ai03 янв. 2018 г., 23:49
не могли бы вы поделиться test-data-01.csv?
 cdecker05 янв. 2018 г., 15:35
Конечно, я загрузил его здесьgist.github.com/anonymous/50dc9e36616605bfbf021642b47a4336
 cdecker02 янв. 2018 г., 15:53
Это все еще на тренировочных данных, поэтому я ожидаю "хорошей подгонки". Я бы полностью понял, что, если прогноз выполняется на новых данных, он может расходиться, но на тренировочном наборе я бы ожидал, что модель даст хорошее приближение без необходимости масштабирования и сдвига.

Ответы на вопрос(2)

Решение Вопроса

Я полагаю, вы переоснащение, поскольку размерность ваших данных равна 1, а LSTM с 25 единицами кажется довольно сложным для такого низкоразмерного набора данных. Вот список вещей, которые я бы попробовал:

Уменьшение размера LSTM.Добавление некоторой формы регуляризации для борьбы с переоснащением. Например,выбывать может быть хорошим выбором.Тренировка для большего количества эпох или изменение скорости обучения. Модель может нуждаться в большем количестве эпох или больших обновлениях, чтобы найти подходящие параметры.

ОБНОВИТЬ. Позвольте мне обобщить то, что мы обсуждали в разделе комментариев.

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

Еслимимо изменение цены само по себе не очень информативнобудущее изменение цены тогда:

Ваша модель научится прогнозировать среднее значение изменения цены (вероятно, около 0), поскольку именно это значение приводит к наименьшим потерям в отсутствие информативных функций.Прогнозы могут показаться слегка «смещенными», потому что изменение цены на временном шаге t + 1 слегка коррелирует с изменением цены на временном шаге t (но, тем не менее, предсказание чего-то близкого к 0 является самым безопасным выбором). Это действительно единственная модель, которую я, как неопытный, смог бы наблюдать (то есть, что значение на временном шаге t + 1 иногда похоже на значение на временном шаге t).

Если бы значения на временных шагах t и t + 1 оказались более коррелированными в целом, то я предполагаю, что модель будет более уверенной в этой корреляции, и амплитуда прогноза будет больше.

 cdecker02 янв. 2018 г., 13:17
Если функция не содержит достаточно информации, которая действительно указывает на то, что среднее значение является «хорошим» прогнозом. Однако это не объясняет, почему он сдвинут в ту или иную сторону. Как ни странно, если я умножу предсказанный ряд на 4 или 5 и переместу его обратно на реальные данные, это даст мне действительно хорошее соответствие (см. Отредактированный вопрос)
 rvinas01 янв. 2018 г., 23:09
О, я неправильно истолковал ваш сюжет. Вы правы, это должно соответствовать данным тренировки. У меня нет опыта работы с данными о запасах, но в таком случае, как вы думаете, возможно ли на самом деле предсказать будущее изменение цены из такого низкоразмерного набора данных? Другими словами, сможет ли эксперт предсказать будущее изменение цены только на основании прошлых изменений цены?
 cdecker01 янв. 2018 г., 20:16
Не приведет ли переоснащение к почти идеальному совпадению на тренировочных данных? Это на самом деле идет в противоположном направлении. Также я получаю этот результат для всех моделей, которые я пробовал до сих пор (простые и сложные)
 rvinas02 янв. 2018 г., 13:48
Ну, я думаю, что причина, по которой прогнозируемый ряд может быть «смещен», заключается в том, что целевое значение слегка коррелирует со значением прямо перед ним. То есть, если значение на временном шаге t равно 0,02, модель узнает, что маловероятно, что значение в момент времени t + 1 будет близко к 0,02. Однако этот эффект затем смягчается тем, что мы обсуждали ранее. Это действительно единственная модель, которую я, как неопытный, смог бы наблюдать (то есть, что значение на временном шаге t + 1 иногда похоже на значение на временном шаге t).
 rvinas01 янв. 2018 г., 23:20
Если ответ «нет», то ваш результат будет иметь для меня смысл. Если в данных нет четких закономерностей, ваша модель научится прогнозировать среднее изменение цен (вероятно, что-то очень близкое к 0, верно?), Поскольку именно это значение приводит к наименьшим потерям в отсутствие информативных функций. Тогда прогнозы могут показаться слегка «смещенными», потому что изменение цены на временном шаге t + 1 слегка коррелирует с изменением цены на временном шаге t (но, тем не менее, предсказание чего-то близкого к 0 является самым безопасным выбором).
Увеличьте количество эпох. Вы можете использовать EarlyStopping, чтобы избежать перегрузки.Как ваши данные масштабируются? Временные ряды очень чувствительны к выбросам в данных. Попробуйте, например, MinMax ((0,1, 0,9)), и тогда RobustScaler также будет хорошим выбором.Я не уверен, что LSTM (seq_len) действительно необходим, пока у вас нетмного данные. Почему бы не попробовать меньшее измерение?

я нареальный набор данных). Затем примените регуляризации.

ОБНОВИТЬ

Позвольте мне объяснить вам, почему вы прошли

plot(pred*12-0.03)

хорошо подходит.

Хорошо, давайте рассмотрим слой LSTM как черный ящик и забудем об этом. Возвращает нам 25 значений - и все. Это значение переходит к слою Dense, где мы применяем функцию вектора 25 значений:

y = w * x + b

Вотw а такжеb - векторы, которые определены NN и в начале обычно близки к нулю.x - ваши значения после слоя LSTM иy - цель (одно значение).

В то время как у вас есть только 1 эпоха: w и b вообще не соответствуют вашим данным (на самом деле они равны нулю). Но что, если вы подадите заявку

plot(pred*12-0.03)

к вашему прогнозируемому значению? Вы (как-то) применяете к целевой переменнойw а такжеb, В настоящее времяw а такжеb являются отдельными значениями, а не векторами, и они применяются к одному значению. Но они выполняют (почти) ту же работу, что и плотный слой.

Итак, увеличьте количество эпох, чтобы лучше подходить.

ОБНОВЛЕНИЕ2 Кстати, я вижу некоторые выбросы в данных. Вы также можете попробовать использовать MAE в качестве метрики потери / точности.

 avchauzov05 янв. 2018 г., 15:53
У вас все еще есть предсказанные значения около нуля? Вы делали пересчет данных?
 rvinas02 янв. 2018 г., 12:11
Я полагаю, что проблема здесь не в переоснащении (я также сначала подумал, что сюжет включает, проверяет набор данных проверки) и, если я правильно понимаю, данные уже находятся в разумных пределах (-1, 1), так как это процентное изменение цены. Я скорее думаю, что эта функция может быть недостаточно информативной, как я утверждаю в одном из моих комментариев.
 avchauzov02 янв. 2018 г., 15:30
Я согласен - в предоставленном коде есть переоснащение, потому что количество эпох = 1. Я только что упомянул это для TS. Проблема переоснащения возникнет на следующих этапах. По поводу масштабирования. Я снова согласен с масштабированием, но не уверен, что масштабирование не поможет. Просто не знаю. Возможно, очень маленькие входные значения могут быть плохими. Не знаю, и у меня в руках нет подходящего набора данных для проверки. Может быть, это шум. В этом случае прогнозировать практически бессмысленно.
 cdecker05 янв. 2018 г., 15:36
Спасибо за указатель на плотность, являющуюся функцией линейного приближения. К сожалению, бег с эпохами = 100 ничего не меняет.

Ваш ответ на вопрос