Получение странной точности в анализе настроений с помощью keras - PullRequest
0 голосов
/ 28 августа 2018

Я работаю над проектом анализа настроений в python с word2vec в качестве метода встраивания. (в моем NON_ENGLISH корпусе я рассмотрел все отрицательные твиты с меткой 0, положительный = 1 и нейтральный = 2) У меня есть 2 вопроса. ** при условии, что мой корпус полностью сбалансирован, и я установил 9000 твитов для поезда и 900 для теста

1.8900 / 8900 [====================================] - 15 с 2 мс / шаг - потеря: 0,5896 - в соответствии с: 0,6330 - val_loss: 0,0000e + 00 - val_acc: 1,0000

Как видите, точность проверки (val_acc) составляет 1,0000 !!!!!!!!

2. Пока val_acc равен 1, моя модель предсказывает все предложения отрицательно! Как я могу решить это?

nb_epochs = 100
batch_size = 32
model = Sequential()
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same', input_shape=(max_tweet_length,vector_size)))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu', padding='same'))
model.add(Dropout(0.25))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu', padding='same'))
model.add(Dropout(0.25))
model.add(Dense(256, activation='tanh'))
model.add(Dense(256, activation='tanh'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(2, activation='softmax'))

спасибо

1 Ответ

0 голосов
/ 29 августа 2018

Есть несколько вопросов с вашим вопросом; здесь вы пытаетесь предложить общий ответ, поскольку некоторые части вашего процесса не отображаются.

при условии, что мой корпус полностью сбалансирован, и я установил 9000 твитов для поезда и 900 для теста

Это не то, что показывает ваш вывод; выход Keras во время тренировки

8900/8900

ясно говорит, что ваш тренировочный набор состоит из 8900 образцов, а не из 9000 - 900 = 8100, как вы утверждаете. Таким образом, если ваш начальный набор данных действительно 9000 выборок, у вас останется только 100 выборок для набора проверки. Очень маленькие наборы валидации не являются хорошей идеей, и в крайних случаях они могут привести к ложным сообщениям о точности, как здесь (обратите внимание, что не только ваша точность валидации является идеальной 1,0, она также значительно выше, чем ваша точность обучения).

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

Наконец, как отмечает @today в комментариях, поскольку у вас есть 3 класса, ваш выходной слой должен иметь 3 единицы, а не 2; это кажется не имеющим отношения к вашей проблеме, но я не уверен, что это действительно ...

...