Подтвердить что ты не робот

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

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

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

Большое спасибо.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Ответ 2

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

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

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

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

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

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

  • Попробуйте настроить регуляцию l1/l2/elasticnet. Это сильно влияет на SGDClassifier/SVM/Logistic Regression.

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

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

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

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

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

Ответ 3

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

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

Затем вызывается метод generate_classifiers, который запускает k раз, создавая экземпляры k классификатора Naïve Bayes. Затем эти классификаторы взвешиваются, и тестовые данные запускаются на каждом классификаторе. Сумма взвешенных "голосов" классификаторов составляет окончательную классификацию.

Ответ 4

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

Ответ 5

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