Pull to refresh

Comments 11

UFO just landed and posted this here
— зачем вообще 3 класса (вместо двух)? Вы их размечали в зависимости от рейтинга или «вручную», прочитав каждый отзыв?

Я взял 3 класса, потому что на кинопоиске отзывы разделены на три группы. Отзывы были размечены самим кинопоиском в зависимости от рейтинга, которые пользователи давали фильму, сам я их не аннотировал конечно.

— вы не сравнивали результат с другими вариантами решения (моделями)?

Пробовал обучать еще SVM, но результат был хуже.
Наиболее популярные из них: TF-IDF, прямое и частотное кодирование. Я использовал частотное кодирование, суть которого представить каждый отзыв в виде вектора, элементы которого являются числом вхождения каждого слова из вокабуляра.

Наиболее популярны в 2019 году явно эмбединги, а не OHE/частотное кодирование.

В NLTK есть свои классификаторы, можно использовать и их, но работают они медленнее аналогов из scikit-learn и имеют меньше настроек.

Если потом использовать Naive Bayes, а не какой-нибудь нормальный современный алгоритм, то какая, в общем-то, разница?

В моем случае грид серч выдает оптимальное значение гиперпараметра равное 0 с точностью в 0.965. Однако такое значение явно не будет оптимальным для контрольного датасета, так как там будет большое число слов, не встречающихся ранее в обучающем наборе. Для контрольного набора данных эта модель имеет точность 0.598. Однако если увеличить alpha до 0.1, точность на обучающих данных упадет до 0.82, а на контрольных возрастет до 0.62.

Это оверфит под тестовый датасет.
На самом деле, нужно было убрать даталик из гридсерча (делать на каждом фолде энкодинг по тренировочной части).
Наиболее популярны в 2019 году явно эмбединги, а не OHE/частотное кодирование.

Да, конечно. Но как я понимаю, этот вид векторизации используется скорее для нейронных сетей, а не для поверхностных методов.

Если потом использовать Naive Bayes, а не какой-нибудь нормальный современный алгоритм, то какая, в общем-то, разница?

У Байеса из NLTK нет гиперпараметра alpha, да и к тому же обучается он гораздо медленнее, чем тот же алгоритм из scikit-learn. Видимо, хранение признаков в разреженной матрице гораздо эффективнее, чем сохранение их в словаре для NLTK.

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

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

Да нет, эмбединги можно использовать как фичи для любой адекватной модели в принципе.

У Байеса из NLTK нет гиперпараметра alpha, да и к тому же обучается он гораздо медленнее, чем тот же алгоритм из scikit-learn. Видимо, хранение признаков в разреженной матрице гораздо эффективнее, чем сохранение их в словаре для NLTK.

Своим комментарием я имел в виду, что использовать наивный Байес — в целом не лучшая идея.
Своим комментарием я имел в виду, что использовать наивный Байес — в целом не лучшая идея.

И тем не менее, если не брать в расчёт нейросети, из «традиционных алгоритмов» именно наивный Байес с текстами работает очень неплохо.
Ну, даже так бустинг всё равно будет получше, хотя он для этого и не предназначен, если судить по кагловским конкурсам.
Ну вот вы основываясь на чём так утверждаете? Я не спорю, что XGBoost хорош почти всегда (редкий кернел на Каггле обходится без него), но и судя по разным тестам моделей, которые я читал, и по личному опыту работы с текстами, NB как ни странно с текстами работает и быстро и достаточно качественно. Бустинги на больших объёмах текстов требуют очень много памяти и работают довольно медленно. И при этом дают качество не сильно то лучшее. Именно поэтому NB всё ещё актуален.
Ну вот вы основываясь на чём так утверждаете?

Основываясь на кагле, как и написал выше.
Во всех NLP -конкурсах есть хорошие кернелы на основе бустинга (ну, сейчас, конечно, все уже начали берты стакать, но я про чуть более ранний период), а вот приличный результат на NB (хотя бы сравнимый по уровню ошибки) я не видел.

Да, на очень больших данных, наверное, по перфомансу бустинг будет проседать.
Для русского языка есть лемматизатор pymorphy2. Чтобы ускорить работу стеммера/лемматизатора, работающего с отдельными словами, можно обернуть его вызов в функцию с декоратором @lru_cache, это часто даёт 10-кратный прирост скорости.
Но, конечно, сейчас чаще используются такие языковые модели как BERT, FastText и т.д. Эмбединнги (в том числе на буквах, а не только на словах) гораздо эффективнее, чем BoW, TF/IDF и прочие статистические текстовые модели.
Я уверен, что данная методика обработки безошибочно обрабатывает сарказм.
Sign up to leave a comment.

Articles