Я новичок в Керасе и повторяющихся слоях, например 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')