Как исправить (сделать лучше) модель классификации текста с помощью word2vec - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в области машинного обучения и нейронной сети. У меня проблема с классификацией текста. Я использую систему архитектуры LSTM NN с библиотекой Keras. Моя модель каждый раз достигает результатов около 97%. Я получил базу данных с чем-то около 1 миллиона записей, из которых 600 тыс. Из них положительные, а 400 тыс. Отрицательные. Я также получил 2 помеченных класса как 0 (для отрицательных) и 1 (для положительных). Моя база данных разбита на учебную базу данных и тестирует базу данных в отношении 80:20. Для ввода NN я использую Word2Vec, обученный статьям PubMed. Моя сетевая архитектура:

model = Sequential()
model.add(emb_layer)
model.add(LSTM(64, dropout =0.5))
model.add(Dense(2))
model.add(Activation(‘softmax’)
model.compile(optimizer=’rmsprop’, loss=’binary_crossentropy’, metrics=[‘accuracy’])
model.fit(X_train, y_train, epochs=50, batch_size=32)

Как я могу исправить (сделать лучше) мою созданную NN модель в такой классификации текста?

1 Ответ

0 голосов
/ 05 июля 2018

Проблема, с которой мы имеем дело, называется переоснащением. Прежде всего, убедитесь, что ваши входные данные правильно очищены. Один из принципов машинного обучения: «Мусор на входе, мусор на выходе». Затем необходимо сбалансировать сбор данных, например, на 400 тыс. Положительных и 400 тыс. Отрицательных записей. По порядку набор данных должен быть разделен на набор обучения, тестирования и проверки (60%: 20%: 20%), например, с использованием библиотеки scikit-learn, как в следующем примере:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2)

Тогда я бы использовал другую архитектуру нейронной сети и попытался бы оптимизировать параметры. Лично я бы предложил использовать двухслойную нейронную сеть LSTM или комбинацию сверточной и рекуррентной нейронной сети (более быстрые и читающие статьи, которые дают лучшие результаты).

1) 2-х слойный LSTM:

model = Sequential()
model.add(emb_layer)
model.add(LSTM(64, dropout=0.5, recurrent_dropout=0.5, return_sequences=True)
model.add(LSTM(64, dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(2))
model.add(Activation(‘sigmoid’))

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

2) CNN + LSTM

model = Sequential()
model.add(emb_layer)
model.add(Convolution1D(32, 3, padding=’same’))
model.add(Activation(‘relu’))
model.add(MaxPool1D(pool_size=2))
model.add(Dropout(0.5))
model.add(LSTM(32, dropout(0.5, recurrent_dropout=0.5, return_sequences=True))
model.add(LSTM(64, dropout(0.5, recurrent_dropout=0.5))
model.add(Dense(2))
model.add(Activation(‘sigmoid’))

Вы можете попробовать использовать комбинацию CNN и RNN. В этой архитектуре модель учится быстрее (до 5 раз быстрее).

Тогда в обоих случаях вам нужно применить оптимизацию, функцию потерь.

Хорошим оптимизатором для обоих случаев является оптимизатор "Адам".

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

На последнем шаге мы проверяем нашу сеть на наборе проверки. Кроме того, мы используем обратный вызов, который остановит процесс обучения в сети, если, например, в течение еще 3 итераций не произойдет изменений в точности классификации.

from keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(patience=3)

model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_val, y_val), callbacks=[early_stopping])

Мы также можем контролировать переоснащение с помощью графиков. Если вы хотите узнать, как это сделать, отметьте здесь .

Если вам нужна дополнительная помощь, дайте мне знать в комментарии.

...