Случайное лесное обращение с отрицанием
Я использую Случайный Лес, чтобы применить чувство к строке. Так что в основном после очистки отзывы, что по сути означает, что стоп-слова (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 ответ
Я считаю, что этот вопрос лучше подходит для обмена стеками с перекрестной проверкой, но в любом случае.
Есть несколько вещей, которые могут улучшить ваши результаты:
Для анализа настроений нецелесообразно удалять отрицательные стоп-слова, такие как "нет", "не" и т. Д., Поскольку они могут полностью изменить положительное / отрицательное отношение предложения при построении n-граммы. В ваших примерах "не плохо", "не хорошо" и т. Д. Будет преобразовано в "плохо", "хорошо" и т. Д.
Если вы считаете, что отрицательный класс недопредставлен в вашем тренировочном наборе, вы можете уравновесить его, занизив выборочный класс.
Вместо непосредственного использования
predict
использоватьpredict_proba
и попробуйте установить разные пороговые значения вероятности для отделения положительных и отрицательных примеров.Попробуйте метод повышения, такой как AdaBoost или Gradient Boosted Trees, который лучше подходит для изучения исключений. Например, для изучения того, что предложение со словом "плохо" обычно отрицательно, но если присутствует и "не плохо", оно положительно.