Многомерный LSTM с пропущенными значениями - PullRequest
0 голосов
/ 29 сентября 2018

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

    Feature 1     Feature 2  ...  Feature n
 1    2               4             nan
 2    5               8             10
 3    8               8              5
 4    nan             7              7
 5    6              nan            12

Вместо интерполяции пропущенных значений, это может привести к смещению в результатах, потому что иногда существует много последовательных временных меток с пропущенными значениями нату же функцию, я хотел бы знать, есть ли способ позволить LSTM учиться с отсутствующими значениями, например, используя маскирующий слой или что-то в этом роде?Может кто-нибудь объяснить мне, что будет лучшим подходом для решения этой проблемы?Я использую Tensorflow и Keras.

1 Ответ

0 голосов
/ 29 сентября 2018

Как предполагает Франсуа Шоле (создатель Keras) в своей книге , один из способов обработки пропущенных значений - заменить их на ноль:

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

ИтакВы можете присвоить ноль элементам NaN, учитывая, что ноль не используется в ваших данных (вы можете нормализовать данные в диапазоне, скажем, [1,2], а затем присвоить ноль элементам NaN; или, наоборот, вы можетеможно нормализовать все значения в диапазоне [0,1] и затем использовать -1 вместо нуля для замены NaN элементов.)

Другой альтернативный способ - использовать Masking слой в керасе.Вы даете ему значение маски, скажем, 0, и оно отбрасывает любой временной шаг (т. Е. Строку), где все его функции равны значению маски.Тем не менее, все последующие слои должны поддерживать маскирование, и вам также необходимо предварительно обработать данные и назначить значение маски всем функциям временного шага, который включает в себя одну или несколько NaN функций.Пример из документа Keras:

Рассмотрим массив данных Numpy x формы (samples, timesteps,features), который будет подан на слой LSTM.Вы хотите замаскировать временные шаги № 3 и № 5, потому что у вас нет данных для этих временных шагов.Вы можете:

  • установить x[:, 3, :] = 0. и x[:, 5, :] = 0.

  • вставить маскирующий слой с mask_value=0. перед слоем LSTM:

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...