У меня огромный набор данных, и я хочу сделать мультиклассовую классификацию с помощью 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)