Naive Bayes
Классификаторы наивного Байеса применяют теорему Байеса и предполагают, что признаки независимы при заданном классе. Разбираем варианты, фильтрацию спама, ограничения и код на Python.
Наивный Байес — семейство вероятностных классификаторов, применяющих теорему Байеса при «наивном» предположении, что признаки независимы друг от друга, если известен класс. Это предположение позволяет модели отдельно обучаться распределению каждого признака внутри каждого класса, поэтому обучение сводится к одному проходу подсчёта по обучающим данным, а для предсказания нужно объединить несколько сохранённых вероятностей. Мехран Сахами и его коллеги применили этот метод к нежелательной почте в 1998 году; фильтры спама на основе Байеса получили широкое распространение в начале 2000-х, а сам метод по-прежнему остаётся быстрым и надёжным базовым вариантом для обучения с учителем на текстовых и других данных очень высокой размерности.
Как работает наивный Байес#
Теорема Байеса позволяет вычислить вероятность класса C при наличии признаков x₁ … xₙ: P(C | x) = P(C)·P(x | C) / P(x). Оценка P(x | C) для каждого сочетания значений признаков потребовала бы огромного набора данных, поэтому наивный Байес предполагает условную независимость признаков и раскладывает вероятность на множители P(x₁ | C)·P(x₂ | C)·…·P(xₙ | C). Классификатор выбирает класс с наибольшим произведением априорной вероятности P(C) и этих множителей, а P(x) отбрасывает, поскольку она одинакова для всех классов. Вместо перемножения вероятностей реализации складывают логарифмы вероятностей: произведение тысяч малых чисел приводит к потере точности при вычислениях с плавающей точкой.
Подсчёт порождает один тип ошибки: если слово ни разу не встретилось с каким-либо классом в обучающих данных, его вероятность становится равной нулю, что обнуляет вероятность этого класса для любого документа с таким словом — независимо от остальных свидетельств. Проблему решает аддитивное сглаживание, при котором к каждому подсчёту добавляется псевдосчёт α; α = 1 соответствует сглаживанию Лапласа и используется по умолчанию в scikit-learn.
Типы классификаторов наивного Байеса#
Варианты отличаются распределением, которое они предполагают для каждого признака внутри класса. Мультиномиальный наивный Байес моделирует количества, например частоту появления каждого слова в документе, и обычно используется для текста. Бернуллиевский наивный Байес моделирует наличие или отсутствие признака и также учитывает отсутствие слов, характерных для класса. Гауссовский наивный Байес подбирает нормальное распределение с собственными средним и дисперсией для каждого непрерывного признака в каждом классе. Комплементарный наивный Байес оценивает статистику слов для каждого класса по всем остальным классам, что подходит для несбалансированных текстовых наборов данных; категориальный наивный Байес работает с признаками, принимающими фиксированный набор категориальных значений.
В этом примере MultinomialNB из scikit-learn обучается на частотах слов в шести размеченных сообщениях, а затем оценивает два новых сообщения:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# Tiny labeled corpus: 1 = spam, 0 = legitimate
texts = [
"win a free prize now",
"free cash bonus click now",
"claim your free reward today",
"meeting moved to monday",
"lunch with the team today",
"project review notes attached",
]
labels = [1, 1, 1, 0, 0, 0]
# Count words, then learn class priors and per-class word probabilities (alpha=1 is Laplace smoothing)
vectorizer = CountVectorizer()
model = MultinomialNB(alpha=1.0)
model.fit(vectorizer.fit_transform(texts), labels)
new = vectorizer.transform(["free prize today", "notes from the monday meeting"])
print(f"P(spam): {model.predict_proba(new)[:, 1].round(3)}")Вероятность спама для первого сообщения равна 0,881, поскольку слова «бесплатно» и «приз» встречаются только в спаме; для второго она равна 0,053, поскольку слова «заметки», «понедельник» и «встреча» встречаются только в обычной почте. Без сглаживания вероятность слова «бесплатно» для обычной почты была бы равна нулю, и любое обычное сообщение с этим словом классифицировалось бы как спам с полной уверенностью.
Преимущества и ограничения#
Обучение и предсказание выполняются за время, линейно зависящее от числа примеров и признаков, поэтому наивный Байес обрабатывает миллионы документов с очень низкой задержкой вывода, а реализации scikit-learn обновляются на новых пакетах через partial_fit, поддерживая онлайн-обучение. Для обучения также нужно мало данных: Ng и Jordan (2001) показали, что наивный Байес приближается к своей асимптотической ошибке при меньшем количестве обучающих примеров, чем логистическая регрессия, которая достигает меньшей ошибки, когда данных становится достаточно. Предсказания классов часто точны даже при коррелирующих признаках, поскольку достаточно правильно ранжировать классы.
Однако сами вероятности калиброваны плохо. Коррелирующие признаки учитывают одни и те же свидетельства несколько раз, из-за чего оценки смещаются к 0 или 1; поэтому в приложениях, которым нужны надёжные значения уверенности, вероятности перекалибровывают на отложенных данных. Мешок независимых слов также не может представлять порядок слов или их взаимодействие, поэтому фраза «не хорошо» выглядит как сочетание отрицания и положительного слова, тогда как модели с механизмом внимания, например трансформеры, учитывают контекст.
Применение#
- Фильтрация спама: Почтовые фильтры оценивают каждое сообщение по содержащимся в нём словам, особенностям отправителя и ссылкам, а затем обновляют статистику слов, когда пользователи помечают сообщения как спам.
- Анализ тональности: Отзывы и обращения в службу поддержки помечают как положительные или отрицательные в зависимости от использованных слов; это распространённая базовая модель перед тонкой настройкой языковой модели.
- Маршрутизация документов: Новостные статьи, юридические документы и обращения в службу поддержки сортируются по темам или очередям; если одни категории встречаются намного реже других, часто используют комплементарный наивный Байес.
- Базовые модели для обработки естественного языка (NLP): Наивный Байес используют для быстрой оценки качества распознавания языка и классификации тем — более дорогие модели должны превосходить этот базовый результат.
Наивный Байес в компьютерном зрении#
Соседние пиксели сильно коррелируют, поэтому представление исходных пикселей в виде независимых признаков теряет информацию о границах и текстурах, определяющих объекты; свёрточные нейронные сети учитывают эту информацию, совместно обрабатывая соседние области. До появления глубокого обучения подход «мешок визуальных слов» применял наивный Байес к гистограммам локальных дескрипторов, например SIFT, сгруппированных в визуальные слова с помощью кластеризации k-средних — визуального аналога подсчёта слов. Количества классов объектов, обнаруженных YOLO26 с помощью обнаружения объектов, образуют такой же вектор количеств, поэтому мультиномиальная модель наивного Байеса может классифицировать сцену как улицу, кухню или офис, используя только результаты обнаружения.
Наивный Байес и связанные модели#
- Байесовские сети: Наивный Байес — простейшая байесовская сеть: класс является единственным родителем каждого признака, а связей между признаками нет. В общих байесовских сетях такие связи добавляют, чтобы моделировать зависимости.
- Байесовский вывод: «Байес» в наивном байесовском классификаторе отсылает к теореме Байеса. Стандартный наивный Байес оценивает каждую вероятность как сглаженную частоту — одну точечную оценку, тогда как полностью байесовские методы задают распределение для каждого параметра.
- Методы опорных векторов (SVM): Они напрямую обучают дискриминативную границу, но требуют больших затрат на обучение. Для классификации тональности Wang и Manning (2012) обнаружили, что наивный Байес точнее SVM на коротких фрагментах, а SVM точнее на полноразмерных отзывах.










