Способы повышения точности наивного классификатора Байеса?
Я использую наивный классификатор Байеса, чтобы классифицировать несколько тысяч документов на 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 его точность ухудшается,
выберите объекты, которые имеют меньшую корреляцию между ними. И попробуйте использовать различные комбинации функций одновременно.