В этой статье мы говорим о наивном байесовском классификаторе — системе классификации первого поколения.
Примечание. Если у вас мало времени или вы лучше понимаете примеры, перейдите непосредственно к разделу «Наивный байесовский алгоритм — последовательность шагов», т. е. прокрутите до второго изображения.
Классификация всегда представляла интерес в индустриальном пространстве, будь то мошеннические транзакции, анализ обзоров/твитов или классификация запросов. Если подумать, даже языковое моделирование — это задача классификации, то есть выбор следующего слова из всех слов. Прежде чем я углублюсь в тему, системы классификации можно разделить на два типа. Генеративный и Дискриминативный.
Дискриминативный -> Присвоение категории на основе ввода
Генеративный -> Генерация входных данных (синтетических) на основе категории.
Наивный байесовский подход относится к разделу «Генеративный». Вкратце, Наивный Байес генерирует синтетическое предложение для каждого класса, а затем мы выбираем класс, который генерирует наиболее близкое к данному входу.
Почему он называется наивным байесовским?
Наивный байесовский классификатор — это вероятностный классификатор, который возвращает из классов C класс, генерирующий выборку, наиболее близкую к входным данным.
*Наивный*Байесовский метод
Он называется Наивным, потому что делает упрощенное предположение о том, как взаимодействуют функции. Предположение: данные входные данные рассматриваются как набор слов, т. е. неупорядоченный набор слов с игнорируемой информацией о местоположении, но с сохранением их частоты.
Наивный *байесовский*
Термин «Байес» происходит от теоремы Байеса. Если мы математически представим цель классификации, то получим вот что:
C¹ = argmax P(c|d)
где
P(c|d) = при наличии документа вернуть оценку класса. (обсуждается ниже)
C¹ = Наша цель. Из всех классов вернуть класс с наивысшим баллом
Вспомним теорему Байеса из нашей школы,
P(x|y) = P(y|x) * P(x)/P(y)
Теорема Байеса помогает нам разбить любую условную вероятность на 3 вероятности. Даже, в нашем случае, мы можем сделать это,
P (c|d) = P(d|c) * P(c)/P(d)
Итак, C¹ = argmax P(c|d) становится
C¹ = argmax P(d|c) * P(c)/P(d)
где
P(d|c) = Проверить релевантность этого документа сгенерированному документу класса c. Назовите его "Вероятность документа d", так как модель генерирует этот показатель путем аппроксимации обучающего корпуса.
P(c) = априорная вероятность самого класса. Не переусердствуйте с «приорой». Модель запоминает соотношение экземпляров этого класса и всех классов в обучающем корпусе.
d = данный документ.
Поскольку P(d) не зависит от класса и является общим для всех классов, мы игнорируем его. Теперь уравнение наивного Байеса сводится к
C¹ = argmax P(d|c) * P(c)
Интуитивно это уравнение делает следующее: оно сначала выбирает класс => P(c), а затем генерирует слова для этого класса для вычисления релевантности с документом d => P(d|c).
Документы как функции
Документы — это не что иное, как набор функций. В нашем случае это могут быть слова, позиции, триграммы и т.д. Для наивности и избегания огромных параметров мы предполагаем две вещи,
- Мешок слов предположение
- Учтите, что каждое слово/функция не зависит от следующего. Давайте разберемся с уравнениями:
P(d|c) = P(f₁ f₂ f₃…fₙ|c)
= P(w₁w₂w₃…wₙ|c)
Поскольку мы предположили, что признаки независимы, становится
= P(w₁|c)* P(w₂|c)*P(w₃|c)*..P(wₙ|c)
P(d|c) = P(w₁|c)* P(w₂|c)*P(w₃|c)*..P(wₙ|c)
C¹ = argmax P(d|c) * P(c)
C¹ = argmax (P(w₁|c)* P(w₂|c)*P(w₃|c)*..P(wₙ|c)) * P(c)
ОТЛИЧНЫЙ!! Мы знаем все переменные в уравнении. Теперь мы можем подсчитать баллы.
Наивный байесовский алгоритм — последовательность шагов
Вот интуитивно понятная диаграмма наивного Байеса, показывающая шаги, необходимые для расчета вероятностей из набора обучающих данных.
Шаги обучения
- Рассчитайте априорные классы P (c), разделив количество документов с классом c на общее количество документов.
- Вычислите P(wi|cj), разделив вхождение wi на общее количество слов в этом классе cj.
Шаги тестирования
Получив тестовое предложение, мы вносим значения, полученные на этапе обучения, в уравнение наивного Байеса.
Мы подсчитываем баллы для всех классов и выбираем тот, который имеет самый высокий балл. В данном случае это класс 2, т.е. отрицательный класс.
Предостережения и незначительные обновления
Если вы заметили расчеты, есть несколько проблем:
- Числовая шкала: даже для предложения из 3 слов десятичные значения огромны. Итак, чтобы избежать недополнения/переполнения цифр и для ускорения вычислений, мы меняем все на логарифмический масштаб.
- Вне словарного запаса: это разветвляется на два случая. Во-первых, если слово из проверочного предложения нигде не встречается в обучающем корпусе, то мы просто игнорируем его при расчете.
Во-вторых, предположим, что слово «спал» встречается не в классе-1, а в других классах. Итак, P(slept|c1) = 0. Это делает всю оценку P(d|c1) = 0, поскольку мы умножаем вероятности признаков. Чтобы справиться с этим, мы добавляем. Лапласово сглаживание, то есть добавление +1 к частоте каждого слова.
Итак, P(wi|c) = #(wi|c) + 1/ сигма #(wk|c) для всех V + |V|
Вот и все!!
Оптимизация наивного Байеса
Текущая версия отлично подходит для задачи анализа настроений, однако мы могли бы добиться большего.
Бинаризация
Для анализа настроений и некоторых других задач классификации существование слова важнее, чем его частотность. Это также ускоряет алгоритм. Это часто называют BinaryNB или Multinomial NaiveNB. Здесь мы обрезаем частоту любого слова до 1.
Бинаризация, о которой мы говорили, выполняется до объединения, то есть на уровне документа.
Например:
Перед бинаризацией:
1. Мы пошли в кинотеатр смотреть фильм
2. Фильм был великолепен. Игра тоже
После бинаризации
1. Мы пошли в кинотеатр смотреть фильм
2. Фильм был великолепен. Действуя слишком
И все остальные шаги остаются прежними.
Обращение с отрицанием
Даже самые продвинутые модели настроений терпят неудачу при отрицании. Например, модель может определить «Этот фильм был хорошим» как положительный, но может потерпеть неудачу в «Этот фильм был плохим». Отрицание, произведенное «не», изменяет настроение рецензии.
Другим примером может быть отрицание отрицания «Этот фильм был неплох».
Чтобы справиться со всеми такими случаями, простой прием состоит в том, чтобы отслеживать слова отрицания и добавлять знак отрицания к последующим словам, пока не появится слово отрицания.
Например,
Честно говоря, фильм мне не понравился, но...
Честно говоря, мне не понравился NEG_the NEG_movie, но я…
Этот простой трюк очень хорошо работает на практике. Если вы задумаетесь над этим, вы поймете, что мы сохраняем положительные слова, такие как «нравится», как «NEG_like», тем самым превращая их в отрицательные слова.