Дайте последовательность модели LSTM с генератором в керасе - PullRequest
0 голосов
/ 28 февраля 2019

У меня огромный набор данных, и я хочу сделать мультиклассовую классификацию с помощью LSTM.Набор данных создается пользователями во время курса MOOC.На основе их данных журнала я хочу предсказать их итоговую оценку (1,2, ... 5).Данные журнала содержат более 25000 пользователей с 161 типом событий.Пользователи создали другую длину последовательности, и я не хочу использовать отступы, поэтому я создал генератор, который будет предоставлять данные для fit_generator.

Этот скрипт работает, но очень медленно.У вас есть идея, почему?

Данные представлены следующим образом:

пользователь - уникальное имя пользователя, событие - событие, которое создал пользователь, время - продолжительность между последним и фактическим событием пользователя

User -+- event -+- time     
1454     play       0      (it is the first event so it has to be 0)    
1454     pause      10     (duration (second) between play and pause)   
1454     play       1      (duration (second) between pause and play)   
1454     stop       1      (duration (second) between play and stop)    
1000     play       0      (it is the first event so it has to be 0)    
1000     pause      455    (duration (second) between play and pause)   
1000     stop       1      (duration (second) between pause and stop)   
........

В качестве первого шага я сделал OneHotEncoder для столбца 'event' и целевое значение (y)

ohe = OneHotEncoder(sparse=False,handle_unknown="ignore")
ohe.fit(x.loc[:,['event']])

y = pd.get_dummies(df[1],prefix = None, columns=['pass'])
y.columns = ['user',0,1,2,3,4,5]    


y_train, y_test = train_test_split(y, test_size=0.25, random_state=42)

x_train = x.loc[x['user'].isin(y_train.user.unique())]
x_test = x.loc[x['user'].isin(y_test.user.unique())]

Затем я создал генератор

def generator_ohe(df_x,df_y,ohe):
    while True:
        # For item i in a range that is a length of l,
        for i in df_x.user.unique():
            df_o = ohe.transform(df_x.loc[df_x['user']==i,['event']])
            df_o = np.hstack((df_o,df_x.loc[df_x['user']==i,['time']].values)) 
            yield (np.reshape(df_o, (1,df_o.shape[0], df_o.shape[1])), df_y.loc[df_y['user'] == i,[0,1,2,3,4,5]])           


training_generator = generator_ohe(x_train,y_train,ohe)
validation_generator =generator_ohe(x_test,y_test,ohe)

modell

n_outputs = 6
features =161

model = Sequential()
model.add(LSTM(100, input_shape=(None,(features))))
model.add(Dropout(0.2))
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit_generator(training_generator,steps_per_epoch=19000, epochs=15,verbose = 1,
                    validation_data = validation_generator, validation_steps= 5000)
...