Классификация документов с использованием наивного байеса в питоне
Я делаю проект по классификации документов с использованием наивного байесовского классификатора в Python. Я использовал для этого модуль Python nltk. Документы взяты из набора данных Reuters. Я выполнил этапы предварительной обработки, такие как устранение стоп-слов и стоп-слов, и приступил к вычислению tf-idf индексных терминов. Я использовал эти значения для обучения классификатора, но точность очень низкая (53%). Что я должен сделать, чтобы улучшить точность?
4 ответа
Несколько моментов, которые могут помочь:
- Не используйте стоп-лист, он снижает точность (но удаляет пунктуацию)
- Посмотрите на особенности слова и возьмите, например, только 1000 лучших. Уменьшение размерности значительно улучшит вашу точность;
- Используйте как биграммы, так и униграммы - это немного повысит точность.
Вы также можете найти альтернативные методы взвешивания, такие как log(1 + TF) * log(IDF)
улучшит точность. Удачи!
Может быть много причин, по которым классификатор не работает, и существует множество способов его настройки.
- Вы тренировали это с достаточным количеством положительных и отрицательных примеров?
- как ты тренировал классификатор? Вы дали ему каждое слово в качестве функции, или вы также добавили больше возможностей для обучения (например, длина текста)?
- что именно вы пытаетесь классифицировать? имеет ли указанная классификация конкретные слова, связанные с ней?
Так что вопрос довольно широкий. Может быть, если вы дадите больше деталей, вы можете получить более актуальные предложения.
Если вы используете наивный байесовский классификатор nltk, скорее всего, вы фактически используете сглаженную текстовую классификацию наивных байесовских многовариантных чисел Бернулли. Это может быть проблемой, если ваша функция извлечения объектов сопоставляется с набором всех значений с плавающей запятой (что звучит так, как если бы вы использовали tf-idf), а не с набором всех логических значений.
Если ваш экстрактор функций возвращает значения tf-idf, то я думаю, что nltk.NaiveBayesClassifier проверит, верно ли, что
tf-idf(word1_in_doc1) == tf-idf(word1_in_class1)
а не соответствующий вопрос для любого непрерывного распределения, подходящего для tf-idf.
Это может объяснить вашу низкую точность, особенно если одна категория встречается в вашем тренировочном наборе 53% времени.
Возможно, вы захотите проверить многочленный наивный байесовский классификатор, реализованный в scikit-learn.
Для получения дополнительной информации о полиномиальных и многомерных классификаторах Бернулли см. Эту очень удобочитаемую статью.
Как и то, что говорил Маус, NLTK Наивный Байес (NB) использует модель Бернулли и сглаживание для контроля условных вероятностей объектов ==0(для объектов, не виденных классификатором в обучении). Обычный метод сглаживания - это сглаживание Лапласа, в которое вы добавляете 1 к числителю условной вероятности, но я полагаю, что NLTK добавляет 0,5 к числителю. Модель NLTK NB использует логические значения и на основании этого вычисляет свои условные выражения, поэтому использование tf-idf в качестве функции не даст хороших или даже значимых результатов.,
Если вы хотите остаться в пределах NLTK, то вы должны использовать сами слова как функции и биграммы. Прочтите эту статью Джейкоба Перкинса об обработке текста с помощью NB в NLTK: http://streamhacker.com/tag/information-gain/. Эта статья отлично объясняет и демонстрирует некоторые вещи, которые вы можете сделать для предварительной обработки ваших данных; он использует корпус рецензий на фильмы из NLTK для классификации настроений.
Существует еще один модуль Python для обработки текста, называемый scikit-learn, в котором есть различные модели NB, например, Multinomial NB, который использует частоту каждого слова вместо вхождения каждого слова для вычисления его условных вероятностей.
Вот некоторая литература по NB и о том, как работают модели Мультивина и Бернулли: http://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html; перемещаться по литературе с помощью кнопок "предыдущий / следующий" на веб-странице.