RandomForestКлассификатор только 50% для анализа настроений хороших и плохих отзывов mov ie - PullRequest
0 голосов
/ 08 января 2020

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

Мои тренировочные данные с именем all_train_set выглядят так:

                                                 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

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

from sklearn.feature_extraction.text import TfidfVectorizer
import nltk
from sklearn.metrics import classification_report, accuracy_score
from sklearn.ensemble import RandomForestClassifier as rfc

stopwords=set(nltk.corpus.stopwords.words('english'))



tfidfconverter = TfidfVectorizer(max_features=1500, min_df=5, stop_words=stopwords)
X = tfidfconverter.fit_transform(all_train_set['Reviews']).toarray()
X_train = X
y_train = all_train_set['Labels']

classifier = rfc(n_estimators=1000, random_state=0)
classifier.fit(X_train, y_train)

tfidfconverter = TfidfVectorizer(max_features=1500, min_df=5, stop_words=stopwords)
X = tfidfconverter.fit_transform(all_test_set['Reviews']).toarray()
X_test = X
y_test = all_test_set['Labels']

#predicting on the test set and printing results
y_pred = classifier.predict(X_test)

print(classification_report(y_test,y_pred))
print(accuracy_score(y_test, y_pred))

Моя общая точность равна 0,5, что кажется крайне плохим. После этого я попытался выполнить поиск по сетке, чтобы получить лучшие параметры, но общая точность снова составила точно 0,5. Результаты выглядят так:

              precision    recall  f1-score   support
           0       0.50      0.70      0.58      2482
           1       0.50      0.30      0.37      2482
    accuracy                           0.50      4964
   macro avg       0.50      0.50      0.48      4964
weighted avg       0.50      0.50      0.48      4964

0.5

Если кто-то может объяснить, является ли это ошибкой обучения или это просто плохой результат. Если последнее все равно есть, я могу знать, как его улучшить?

Я новичок в машинном обучении и поэтому извиняюсь, если что-то не понятно, я с удовольствием уточню / внесу изменения / приму совет о том, как улучшить мой вопрос.

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 08 января 2020

Прежде всего, как вы определяете:

X_train = X
X_test = X

Это неверно, контролируемый алгоритм обучения (проблема классификации) всегда имеет разделение поезда / теста. Итак, вы тренируете свой алгоритм, а затем проверяете его на невидимых данных! Функция scikit, которую вы можете найти здесь .

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

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

Чтобы понять, насколько хорош ваш результат, вы можете использовать Dummy Classifier , это всегда будет, например, предсказывать основной класс, так, например, если ваш ярлык 1 имеет только 10% ваших ярлыков, фиктивная оценка будет 90% (как это всегда будет предсказывать 0). Если ваш фиктивный счет близок или выше 0,5, у вас очень плохой алгоритм.

0 голосов
/ 08 января 2020

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

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

Вы можете проверить следующее:

https://medium.com/@MarynaL / analysis-mov ie -обзоры данных-с-естественным языком-обработки-7c5cba6ed922

https://github.com/deepakchaudhari705/Sentimental-Analysis-on-a-Movie-Data-/blob/master/sentiment-checkpoint.ipynb

0 голосов
/ 08 января 2020

Вы можете попробовать несколько вещей, таких как:

  1. Вы не должны fit_transform на тестовом наборе, просто transform. Не реинициализируйте tfidfconverter.

  2. Вы можете попробовать очистить ваши данные, настроить гиперпараметр , различные алгоритмы . Для текстовых данных отлично работают алгоритмы типа LinearSVC. Но вы можете поэкспериментировать с этим.

  3. Создание новых функций из текста. Для этого посмотрите примеры из ядер github или Kaggle.

...