Способы повышения точности наивного классификатора Байеса?

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

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

5 ответов


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

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

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

  • применить какой-то сочетание классификатор техника (например,, ensembling, повышение, bagging); или вы можете

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

w/r/t наивные байесовские классификаторы, настройка параметров ограничена; я рекомендую сосредоточиться на ваших данных-т. е. на качестве предварительной обработки и выборе функции.

Данные И. Синтаксический анализ (предварительная обработка)

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

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

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

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


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

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

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

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

Метод Фишера (вероятно, самый распространенный способ оптимизации наивного классификатора Байеса.) Ко мне, я думаю о Фишере как нормализующее (более правильно, стандартизация) входные вероятности NBC использует функцию вероятностей построить весь документ вероятность'. Метод Фишера вычисляет вероятность категории для каждого функция документа затем объединяет эти вероятности функций и сравнивает эту объединенную вероятность с вероятностью случайного набора функций.


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

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

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

  • во-вторых, настройте формулу TFIDF (например, сублинейный tf, smooth_idf).

  • нормализуют ваши образцы с нормализацией l2 или l1 (по умолчанию в Tfidfvectorization), потому что он компенсирует другой документ длины.

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

  • попытаться настройте регуляризацию L1/l2 / elasticnet. Это имеет огромное значение в SGDClassifier / SVM / логистическая регрессия.

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

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

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

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

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


использование коррекции Лапласа вместе с AdaBoost.

в AdaBoost сначала вес присваивается каждому кортежу данных в наборе данных обучения. Начальные веса устанавливаются с помощью init_weights метод, который инициализирует каждый вес должен быть 1/d, где d - это размер набора данных обучения.

затем generate_classifiers вызывается метод, который работает k раз, создавая k экземпляры наивного классификатора Байеса. Эти классификаторы после этого утяжелены, и тестовые данные выполняются на каждом классификаторе. Итоговую классификацию составляет сумма взвешенных" голосов " классификаторов.


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


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