Создание классификатора категории новостей с использованием LSTM - PullRequest
0 голосов
/ 27 апреля 2020

Я делаю модель классификации новостей, используя LSTM. Когда я тренирую модель, моя точность обучения продолжает улучшаться, но точность валидации не превышает 57%. У меня есть почти 200 тыс. Новостных параграфов, и я классифицирую их по 30 различным категориям.

Моя модель выглядит следующим образом:

model=Sequential()
model.add(Embedding(30000,64,input_length=X_train.shape[1],mask_zero=True))
model.add(Bidirectional(LSTM(64)))
model.add(Dropout(0.5))
model.add(Dense(64,activation='relu'))
model.add(Dense(30))
model.add(Activation(activation='softmax'))
model.compile(loss="categorical_crossentropy",optimizer='adam',metrics=['accuracy'])

1 Ответ

1 голос
/ 27 апреля 2020

Прежде всего, для 30 классов рандомизированная базовая точность равна (100/30) = 3,33% , поэтому ваша модель справляется достаточно хорошо.

Вы не предоставили больше такие детали, как длина ввода, длина абзацев, выполняете ли вы какую-либо предварительную обработку, например удаление стоп-слов, как урезать абзацы до одинаковой длины input_length.

быть дисбалансом классов, вероятно, для некоторых классов у вас слишком мало примеров. Попробуйте удалить их или расширить набор данных, чтобы сбалансировать классы.

Я решил похожую проблему, классификацию категорий новостей, но для Bangla классификация категорий новостей Bangla определенно более сложная, чем сделать это для Engli sh.

Я использовал модель BiLSTM, которая достигла 91% + точность теста без какой-либо серьезной настройки гиперпараметра.

Это модель, которую я использовал:

from keras.models import Sequential
from keras.layers import Embedding, CuDNNLSTM, Bidirectional, Dense

embedding_dim = 8

model = Sequential()
model.add(Embedding(input_dim=vocab_size, 
                           output_dim=embedding_dim, 
                           input_length=maxlen))
model.add(Bidirectional(CuDNNLSTM(128, return_sequences = True)))
model.add(Bidirectional(CuDNNLSTM(128))) 
model.add(Dense(9, activation='softmax'))
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

Полный код классификации категории новостей Bangla: https://github.com/zabir-nabil/bangla-news-rnn

Теперь вы не сделали т график вашей точности проверки против точности обучения, но я предполагаю, что ваша точность обучения выше. Итак, ваша модель перегружена. Возможно, уменьшите параметры в слое Embedding.

Вы можете использовать вложение Google News в качестве инициализатора веса для вашего слоя Embedding. https://github.com/mmihaltz/word2vec-GoogleNews-vectors

Наилучшим подходом было бы использование BERT-подобной языковой модели для получения действительно хорошей точности. https://github.com/huggingface/transformers

...