Невозможно правильно определить входные данные LSTM для моделирования сценария «многие к одному» - PullRequest
0 голосов
/ 22 января 2019

Я новичок в Керасе и повторяющихся слоях, например LSTM.

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

Подробнее: у меня есть исторические данные о некоторых событиях. Последовательность состоит из N событий, где N не является фиксированным. Для каждой последовательности событий я хочу предсказать категорию (0, 1 или 2). У меня много коротких последовательностей для тренировок.

Чтобы выполнить эту задачу, я разрабатываю LSTM (много-к-одному) со слоем softmax для классификации нескольких классов.

Например, давайте представим, что у меня есть эти данные (пакеты из N событий):

1, 17 => 0
1, 18
0, 18

0, 18 => 1
1, 19
0, 19
0, 20

…

0, 11 => 1
1, 11

Приоритет событий в последовательности имеет большое значение. Если приоритет изменяется, то соответствующая категория также может измениться. Например, если первая последовательность, показанная выше, изменяется путем замены второй и третьей строк, то категория может измениться с 0 на 1:

1, 17 => 1
0, 18
1, 18

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

Это мой стартовый код:

import pandas as pd
from sklearn import model_selection

events = {
            'batch_id': [0,0,0,1,1,2,2,2,2,2],
            'phase': [1,0,1,1,0,0,1,0,0,1],
            'hour': [16,16,17,17,17,18,18,19,20,20],
            'event_category': [1,1,1,2,2,0,0,0,0,0]
        }

columns = ['batch_id', 'phase', 'hour', 'event_category']

df = pd.DataFrame(events, columns=columns)

X = df.drop('event_category',1).drop('batch_id',1)
y = df['event_category']
output_classes = y.nunique()

Моя самая большая проблема в том, что я не знаю, как смоделировать изменяющийся размер последовательностей. Я ввел колонку batch_id. Можно заметить, что у меня есть 3 последовательности размеров: 3, 2, 5.

Как я могу поместить эти данные в глубокую сеть? Должен ли размер последовательности быть всегда фиксированным?

Это мой черновик настройки модели. В этой настройке мне не хватает определения входных данных в виде последовательностей. Может мне стоит каким-то образом изменить формат events?

from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM

model = Sequential()
model.add(LSTM(
                units=1, 
                return_sequences=False, 
                input_shape=(None,X_train.shape[1])
              )
         )

model.add(Dropout(0.2))

model.add(Dense(activation='softmax', units=output_classes))

# Define a performance metric
model.compile(loss="categorical_crossentropy",
              optimizer='adadelta')

1 Ответ

0 голосов
/ 22 января 2019

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

  • последовательности пэдов одинаковой длины (например, с 0-векторами)
  • используйте сегментирование для размеров последовательности, если длины сильно различаются(с повторной инициализацией модели с теми же весами)
  • используйте PyTorch или любую другую библиотеку NN динамических графов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...