Наивный байесовский классификатор (Naive Bayes)

Автор: Елена Капаца•

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

Наивный байесовский классификатор (Naive Bayes) — это семейство вероятностных алгоритмов машинного обучения, которые используют теорему Байеса для классификации объектов на основе их признаков. Naive Bayes вычисляет вероятность принадлежности объекта к каждому классу и выбирает класс с наибольшей вероятностью.

Алгоритм называется наивным (Naive), потому что предполагает условную независимость признаков друг от друга при известном классе. На практике это предположение часто не выполняется полностью, но алгоритм всё равно может показывать хорошие результаты.

Как работает Naive Bayes

Представим, что необходимо классифицировать электронные письма как спам или обычные сообщения. Модель анализирует признаки письма:

  • наличие слов «выигрыш», «бесплатно» или «скидка»;
  • количество ссылок;
  • наличие подозрительных вложений;
  • другие характеристики текста.

Для каждого класса алгоритм оценивает вероятность на основе двух типов информации:

  • Априорная вероятность (Prior Probability) — насколько часто класс встречается в обучающих данных.
  • Правдоподобие (Likelihood) — насколько вероятно встретить определённые признаки, если объект принадлежит этому классу.

Затем алгоритм использует теорему Байеса, чтобы оценить вероятность класса с учётом наблюдаемых признаков.

\(P(A|B) = \frac{P(B|A)P(A)}{P(B)}\)

\(P(A\mid B)=\frac{0,80(0,30)}{0,38}=0,63\)

\(P(A)\)

\(P(B\mid A)\)

\(P(B\mid \neg A)\)

\(P(B)\)= 0,38

\(P(B\cap A)\)= 0,24

\(P(B\cap \neg A)\)= 0,14

Оставить отзыв

Например, если слово «выигрыш» часто встречается в спам-письмах и редко — в обычных, его наличие увеличит вероятность того, что письмо является спамом.

Для нескольких признаков наивный байесовский классификатор объединяет их вероятности, предполагая условную независимость признаков.

Почему алгоритм называется наивным

Предположим, модель классифицирует сообщения по словам «бесплатно» и «подарок».

В реальных текстах эти слова могут часто встречаться вместе. Однако Naive Bayes предполагает, что при известном классе наличие одного слова не зависит от наличия другого.

Это упрощает вычисления и позволяет обучать модель даже на относительно небольших наборах данных.

Важно понимать: условная независимость признаков не означает, что они независимы вообще. Она предполагается именно при фиксированном классе.

Виды наивного байесовского классификатора

Разные варианты Naive Bayes подходят для разных типов данных.

  • Gaussian Naive Bayes: Для непрерывных числовых признаков, распределение которых внутри класса приближённо нормально
  • Multinomial Naive Bayes: Для частот признаков, например количества слов в документе
  • Bernoulli Naive Bayes: Для бинарных признаков, например наличия или отсутствия слова
  • Complement Naive Bayes: Для текстовой классификации, особенно при несбалансированных классах

Выбор варианта зависит от характера данных и задачи.

Преимущества Naive Bayes

  • Простая реализация и быстрое обучение
  • Низкие требования к вычислительным ресурсам
  • Хорошие результаты в задачах классификации текста
  • Возможность работы с небольшими обучающими выборками
  • Поддержка многоклассовой классификации
  • Естественная работа с вероятностными оценками классов

Ограничения

  • Предположение о независимости признаков часто не соответствует реальности
  • При сильной зависимости между признаками качество может снижаться
  • Вероятностные оценки могут быть плохо откалиброваны
  • Некоторые варианты требуют дополнительных предположений о распределении признаков
  • Без сглаживания модель может присвоить нулевую вероятность классу при встрече ранее не наблюдавшегося признака.

Для решения последней проблемы часто используется сглаживание Лапласа (Laplace Smoothing), которое позволяет учитывать признаки, отсутствовавшие в обучающей выборке.

Пример кода на Python

Для примера используем MultinomialNB из библиотеки scikit-learn, чтобы классифицировать короткие сообщения на спам и обычные письма.

Установка библиотеки:

pip install scikit-learn

Пример:

from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.pipeline import make_pipelinetexts = [    "вы выиграли бесплатный подарок",    "получите скидку прямо сейчас",    "встречаемся завтра в офисе",    "отправляю документы на проверку",    "бесплатный выигрыш только сегодня",    "совещание переносится на пятницу",]labels = [    "spam",    "spam",    "normal",    "normal",    "spam",    "normal",]model = make_pipeline(    CountVectorizer(),    MultinomialNB())model.fit(texts, labels)message = ["бесплатный подарок сегодня"]print(model.predict(message)[0])