Случайное лесное обращение с отрицанием

Я использую Случайный Лес, чтобы применить чувство к строке. Так что в основном после очистки отзывы, что по сути означает, что стоп-слова (nltk.corpus -> stopwords откуда я удаляю слова как нет, не, ни, выиграл, разве, когда-то) удаляются, а также не-буквенные символы, и все ставится в нижнем регистре. CountVectorizer с аргументами (analyzer = "word", tokenizer = None, preprocessor = None, ngram_range=(1, 3), stop_words = None, max_features = 5500) строит словарный запас и добавляет его к numpy массив. Также я использую 100 деревьев.

После разделения данных с test_size = .1 классификатор обучен, подогнан и оценен.

score = forest.score(X_test, y_test): 0.882180882181

Путаница с матрицей, без нормализации:

[[2256  503]
 [ 519 5269]]

Нормализованная запутанная матрица:

[[ 0.82  0.18]
 [ 0.09  0.91]]

Кривая ROC, показывающая Random Forest (RF) и Random Forest с LinearRegression(RF + LR):

введите описание изображения здесь

введите описание изображения здесь

Так что проблема в том, что хотя результаты выглядят очень хорошо, я получаю неправильные результаты, например:

"Фильм не годится" -> отрицательный

"Фильм не плохой" -> отрицательный

"Музыка и образы не хороши" -> положительный

"Фильм не имеет смысла" -> положительный

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

Не могли бы вы подсказать, что можно улучшить или изменить, чтобы отрицание классифицировалось правильно?

1 ответ

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

Есть несколько вещей, которые могут улучшить ваши результаты:

  1. Для анализа настроений нецелесообразно удалять отрицательные стоп-слова, такие как "нет", "не" и т. Д., Поскольку они могут полностью изменить положительное / отрицательное отношение предложения при построении n-граммы. В ваших примерах "не плохо", "не хорошо" и т. Д. Будет преобразовано в "плохо", "хорошо" и т. Д.

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

  3. Вместо непосредственного использования predictиспользовать predict_proba и попробуйте установить разные пороговые значения вероятности для отделения положительных и отрицательных примеров.

  4. Попробуйте метод повышения, такой как AdaBoost или Gradient Boosted Trees, который лучше подходит для изучения исключений. Например, для изучения того, что предложение со словом "плохо" обычно отрицательно, но если присутствует и "не плохо", оно положительно.

Другие вопросы по тегам