Жесткий анализ настроений IMDB

1

Я новичок в ML, и я пытаюсь использовать Keras для анализа настроений в наборе данных IMDB на основе учебника, который я нашел. Ниже приведен код и дает точность около 90% данных теста. Однако, когда я пытаюсь предсказать два простых предложения (один положительный, один отрицательный), он дает значение около 0,50 для положительного и 0,73 для отрицательного, где он должен давать 0,71 для положительного и меньше 0,1 для отрицательного, которые являются результатами, показанными в учебнике.

Есть идеи, в чем проблема?

from keras.datasets import imdb
from keras.preprocessing import sequence
from keras.models import *
from keras.layers import *
import numpy as np

top_words = 5000  # 5000
# first tuple is data and sentiment lists,
# the second is testing data with sentiment
# https://keras.io/datasets/
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=top_words)

# reverse lookup
word_to_id = imdb.get_word_index()
'''word_to_id = {k: (v + INDEX_FROM) for k, v in word_to_id.items()}'''
word_to_id["<PAD>"] = 0
word_to_id["<START>"] = 1
word_to_id["<UNK>"] = 2

# Truncate and pad the review sequences, to take only the first 500 words
max_review_length = 500
x_train = sequence.pad_sequences(x_train, maxlen=max_review_length)
x_test = sequence.pad_sequences(x_test, maxlen=max_review_length)

# Build the model

# embedding translates the words in a n dimensional
# space so "hi" becomes (0.2,0.1,0.5) in a 3 dimensional space
# it is the first layer of the network
embedding_vector_length = 32  # dimensions

# https://keras.io/getting-started/sequential-model-guide/
model = Sequential()  # sequential is a linear stack of layers

# layer of 500 x 32
model.add(
    Embedding(
        top_words,  # how many words to consider based on count
        embedding_vector_length,  # dimensions
        input_length=max_review_length))  # input vector
model.add(LSTM(100))  # the parameter are the memory units of the LSTM
# If you want you can replace LSTM by a flatten layer
# model.add(LSTM(100))
# model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))  # output 0<y<1 for every x
model.compile(
    loss='binary_crossentropy',
    optimizer='adam',
    metrics=['accuracy'])
print(model.summary())


# Train the model
model.fit(
    x_train,
    y_train,
    validation_data=(x_test, y_test),
    epochs=1)  # original epochs = 3, batch-size = 64

# Evaluate the model
scores = model.evaluate(x_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1] * 100))

# predict sentiment from reviews
bad = "this movie was terrible and bad"
good = "i really liked the movie and had fun"
for review in [good, bad]:
    tmp = []
    for word in review.split(" "):
        tmp.append(word_to_id[word])
    tmp_padded = sequence.pad_sequences([tmp], maxlen=max_review_length)
    print("%s. Sentiment: %s" % (
        review, model.predict(np.array([tmp_padded[0]]))))
# i really liked the movie and had fun. Sentiment: 0.715537
# this movie was terrible and bad. Sentiment: 0.0353295
Теги:
keras

1 ответ

1

"Есть идеи, в чем проблема?" Не может быть проблемы, как таковой. У меня есть несколько мыслей в порядке возможного влияния:

  1. Если ваши два предложения не являются репрезентативными для обзора IMDB, то можно ожидать, что модель будет прогнозировать плохо и беспорядочно.

  2. У вашей модели только одна эпоха, и у модели, возможно, не было достаточной возможности изучить надежное сопоставление от обзора до чувства (предполагая, что такое сопоставление возможно с учетом данных).

  3. Существует случайный элемент для нейронных сетей, и, как результат, модель, которую вы разработали, вероятно, не будет предсказывать идентично модели в учебнике.

  4. При "правильности порядка 90%" можно было бы ожидать (в зависимости от распределения классов) примерно 1 из 10 прогнозов, чтобы быть неверными. Небольшое количество экземпляров (два, в вашем случае), как правило, не очень хороший способ оценить производительность модели.

Когда я запустил ваш код, у меня была точность тренировки около 80% и точность теста составила около 85%, и "мне очень понравился фильм и было весело. Настроения: [[0.75149596]]" и "этот фильм был ужасным и плохим Настроения: [[0.93544275]] ".

  • 0
    Приведенные вами аргументы звучат разумно. Однако, как вы думаете, они могут способствовать такому большому расхождению между учебником и тем, что я получу? 0,75 для положительного и 0,93 для отрицательного, что вы также получаете, совершенно неправильно с точки зрения фактического настроения, которое должно приближаться к 0 для отрицательного и 1 для положительного. PS Я пробовал с большим количеством эпох, которые увеличивают точность, но предсказание для двух предложений все еще неверно.
  • 0
    Я так думаю. По моему опыту, модели НЛП могут быть чувствительны к тому, насколько близко тестовые предложения соответствуют обучающим данным. Я предполагаю, что код правильный, потому что он взят из учебника и работает и для меня. Может быть, добавить несколько предложений, похожих на два ваших тестовых предложения, в ваши тренировочные данные? Видишь что происходит?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню