Вопрос

Я использую классификатор Naive Bayes для классификации нескольких тысяч документов на 30 различных категорий. Я реализовал Naive Bayes Classifier и с некоторым выбором функций (в основном фильтровал бесполезные слова), я получил около 30% точности тестирования, с 45% точностью обучения. Это значительно лучше, чем случайный, но я хочу, чтобы это было лучше.

Я попробовал реализовать ADABOOST с NB, но он, по-видимому, не дает заметно лучшие результаты (литература кажется на этом, некоторые документы говорят, что Adaboost с NB не дает лучших результатов, другие делают). Знаете ли вы о любых других расширениях NB, которые могут дать лучшую точность?

Это было полезно?

Решение

По моему опыту правильно обученные Naive Bayes Classifiers обычно удивительно точны (и очень быстро на тренировку - заметно быстрее, чем любой классификатор-строитель, который у меня верит).

Поэтому, когда вы хотите улучшить прогноз классификатора, вы можете посмотреть в нескольких местах:

  • Настройте свой классификатор (регулировка перестраиваемых параметров классификатора);

  • Применить какой-то Техника комбинации классификатора (например, аннулирование, усиление, мешка); или вы можете

  • посмотри на данные ФЕДС на классификатор - либо добавьте больше данных, улучшите вашу базовое распределение или уточните функции, которые вы выбираете из данных.

W / T Naive Bayesian Classifiers, настройка параметров ограничена; Я рекомендую сосредоточиться на ваших данных - то есть качество вашей предварительной обработки и выбор функций.

I. Разбор данных (предварительная обработка)

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

  • stemming.: либо вручную, либо с помощью библиотеки stemming? Популярные с открытым исходным кодом являются Портер, Ланкастер и Снежный ком. Так, например, если у вас есть условия Программист, программа, прогмамирование, запрограммировано В данной точке данных stemmer уменьшит их на один стебель (возможно, программа) Итак, ваш термин вектор для этой точки данных будет иметь значение 4 для программы функции, которая, вероятно, вы хотите.

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

  • нейтральные слова: слова с аналогичными частотами в классах делают плохие особенности


II. Выбор функции

Рассмотрим прототипное использование корпуса для NBCS: фильтрующий спам; Вы можете быстро увидеть, как это терпит неудачу и так же быстро, вы можете увидеть, как его улучшить. Например, выше средние спам-фильтры имеют нюансы, такие как: частота слов во всех крышках, частота слов в заголовке и возникновение восклицательной точки в заголовке. Кроме того, Лучшие особенности часто не являются одинокими словами, но, например, пары слов, или большие словые группы.

III. Оптимизация определенного классификатора

Вместо 30 классов используют «Одна-против много» схемаДругими словами, вы начинаете с классификатора двух классов (класс A и «все остальное»), то результаты в классе «Все остальные» возвращаются в алгоритм классификации в класс B и «все остальное» и т. Д. Отказ

Метод Фишера (Вероятно, самый распространенный способ оптимизировать наивный байс классификатор.) Для меня я думаю о Фишере Нормализация (более правильно, стандартизация) Входные вероятности NBC использует вероятности функций для создания вероятности «целого документа». Метод Fisher рассчитывает вероятность категории для каждый Особенностью документа затем объединяет эти вероятности функций и сравнивает эту комбинированную вероятность с вероятностью случайного набора особенностей.

Другие советы

Я бы предложил использовать Sgdclassifier. как в это и настройте его с точки зрения прочности регуляризации.

Также попробуйте настроить формулу в TFIDF, вы используете путем настройки параметров Tfifvectorizer..

  • Я обычно вижу, что для текстовых классификаций SVM или логистический регрессион при обучении один по сравнению с одним превзойдем NB. Как вы можете видеть в Эта хорошая статья Стэнфорда Люди Для более длительных документов SVM превосходит NB. Код для бумаги, который использует комбинацию SVM и NB (NBSVM.) является здесь.

  • Во-вторых, настройте формулу TFIDF (например, Sublinear TF, Good_IDF).

  • Нормализировать Ваши образцы с нормализацией L2 или L1 (по умолчанию в TFIDFVectionation), поскольку он компенсирует разные длины документа.

  • Многослойный перцепртр, как правило, получает лучшие результаты, чем Nb или SVM из-за нелинейнойности, вводимых, что присуще многим проблемам классификации текста. Я внедрил очень параллельный, использующий Theano / Lasagne, который легко использовать и загружаемый здесь.

  • Попробуй Настройте вашу регуляризацию L1 / L2 / ELASTALTENT. Отказ Это имеет огромное значение в SGDClassifier / SVM / логистической регрессии.

  • Попробуй использовать N-граммс который настраивается в TFIDFVectorizer.

  • Если ваши документы имеют структуру (например, имеют заголовки) Рассмотрите возможность использования разных функций для разных частей. Например, добавьте Title_Word1 в свой документ, если Word1 происходит в заголовке документа.

  • Рассмотреть возможность использования Длина документа как функция (например, количество слов или символов).

  • Рассмотреть возможность использования Мета информация о документе (например, время создания, имени автора, URL документа и т. Д.).

  • Совсем недавно Facebook опубликовано их Классификационный код FastText который работает очень хорошо во многих задачах, обязательно попробуйте.

Используя лаплацкую коррекцию вместе с Adaboost.

В Adaboost сначала весит присваивается каждому кортелю данных в наборе данных тренировки. Iinial Weests устанавливаются с использованием init_weights метод, который инициализирует каждый вес, чтобы быть 1/d, куда d Размер набора учебных данных.

Затем generate_classifiers Способ называется, который работает k раз, создание k Экземпляры наивных байесов классификатора. Эти классификаторы затем взвешены, а тестовые данные выполняются на каждом классификаторе. Сумма взвешенных «голосов» классификаторов представляет собой окончательную классификацию.

Сохранение размера N Small также сделайте NB для обеспечения высокой точности результата. И в ядре, как размер N увеличивает свою точность ухудшения,

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top