Наивный байесовский классификатор для обзоров mov ie имеет очень низкую точность, несмотря на несколько попыток выбора признаков - PullRequest
0 голосов
/ 10 января 2020

Я довольно новичок в машинном обучении, и мне было поручено построить модель машинного обучения, чтобы предсказать, будет ли обзор хорошим (1) или плохим (0). Я уже пытался использовать RandomForestClassifier, который выдает точность 50%. Я переключился на наивный байесовский классификатор, но по-прежнему не получаю никаких улучшений даже после проведения поиска по сетке.

Мои данные выглядят так (я рад поделиться с кем-либо данными):

                                                 Reviews  Labels
0      For fans of Chris Farley, this is probably his...       1
1      Fantastic, Madonna at her finest, the film is ...       1
2      From a perspective that it is possible to make...       1
3      What is often neglected about Harold Lloyd is ...       1
4      You'll either love or hate movies such as this...       1
                                              ...     ...
14995  This is perhaps the worst movie I have ever se...       0
14996  I was so looking forward to seeing this film t...       0
14997  It pains me to see an awesome movie turn into ...       0
14998  "Grande Ecole" is not an artful exploration of...       0
14999  I felt like I was watching an example of how n...       0
[15000 rows x 2 columns]

Мой код для предварительной обработки, затем текст и использование TfidfVectorizer перед обучением классификатора таков:

vect = TfidfVectorizer(stop_words=stopwords, max_features=5000)
X_train =vect.fit_transform(all_train_set['Reviews'])
y_train = all_train_set['Labels']

clf = MultinomialNB()
clf.fit(X_train, y_train)

X_test = vect.transform(all_test_set['Reviews'])
y_test = all_test_set['Labels']

print(classification_report(y_test, clf.predict(X_test), digits=4))

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

              precision    recall  f1-score   support
           0     0.5000    0.8546    0.6309      2482
           1     0.5000    0.1454    0.2253      2482
    accuracy                         0.5000      4964
   macro avg     0.5000    0.5000    0.4281      4964
weighted avg     0.5000    0.5000    0.4281      4964

Сейчас я попытался следовать 8 различным учебным пособиям по этому поводу и пробовал разные способы кодирования, но, кажется, не могу получить его выше 50 %, который заставляет меня думать, что это может быть проблемой с моими функциями.

Если у кого-то есть какие-либо идеи или предложения, я был бы очень признателен.

РЕДАКТИРОВАТЬ: Хорошо, поэтому я добавил несколько предварительных обработок шаги здесь, включая удаление html тегов, удаление пунктуации и одной буквы и удаление нескольких пробелов из кода ниже:

TAG_RE = re.compile(r'<[^>]+>')

def remove_tags(text):
    return TAG_RE.sub('', text)

def preprocess_text(sen):
    # Removing html tags
    sentence = remove_tags(sen)
    # Remove punctuations and numbers
    sentence = re.sub('[^a-zA-Z]', ' ', sentence)
    # Single character removal
    sentence = re.sub(r"\s+[a-zA-Z]\s+", ' ', sentence)
    # Removing multiple spaces
    sentence = re.sub(r'\s+', ' ', sentence)
    return sentence

Я верю e TfidfVectorizer автоматически помещает все в нижний регистр и лемматизирует это. Конечный результат все еще только 0,5

1 Ответ

2 голосов
/ 10 января 2020

Здесь очень важна предварительная обработка текста. Удаление только стоп-слов недостаточно, я думаю, вам следует учесть следующее:

  • преобразование текста в нижний регистр
  • удаление пунктуации
  • Поиск апострофов (" 'll "->" will "'," ve "->" have ")
  • Удаление чисел
  • лемматизация и / или stemming для обзоров
  • et c.

Посмотрите на методы предварительной обработки текста.

...