Пути повышения точности наивного байесовского классификатора? - PullRequest
64 голосов
/ 13 августа 2010

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

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

Ответы [ 5 ]

100 голосов
/ 14 августа 2010

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

4 голосов
/ 24 ноября 2016

Я бы предложил использовать 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 /asticnet . Это имеет огромное значение в SGDClassifier / SVM / Logistic Regression.

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

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

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

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

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

0 голосов
/ 07 апреля 2017

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

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

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

0 голосов
/ 11 ноября 2016

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

0 голосов
/ 24 января 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...