Полиномиальная наивная байесовская модель с реализацией Python

Классификация - одна из наиболее часто используемых форм прогнозирования, цель которой - предсказать класс записи. Для бинарной классификации мы стремимся предсказать, имеет ли запись 1 или 0, например спам / не спам или отток / не отток, а для мультиклассовой классификации мы стремимся спрогнозировать класс записи, например, классифицировать почту как первичную / социальную / рекламную и т. д.

Помимо прогнозирования класса наших записей большую часть времени мы также хотим знать прогнозируемую вероятность принадлежности к интересующему классу. Эти значения вероятности также называются оценками склонности. Мы можем установить вероятность отсечения для интересующего класса, и для записей, имеющих показатель склонности ниже, мы считаем запись принадлежащей этому классу, и наоборот.

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

В этой статье мы увидим, как использовать наивный алгоритм Байеса для решения задачи мультиклассовой классификации, реализовав его на Python.

Я призываю всех заглянуть в Блокнот Jupyter на моем GitHub для полного анализа и кода.

Теорема Байеса

Теорема Байеса позволяет вычислить вероятность гипотезы с учетом наших предварительных знаний.

Априорная вероятность - это вероятность события до того, как будут собраны новые данные, то есть P (спам) - это вероятность появления спама до того, как будет обнаружено какое-либо новое письмо.

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

Вероятность - это вероятность того, что произойдет свидетельство при условии, что событие истинно, т. е. P (деньги | спам) - это вероятность того, что письмо содержит «деньги», учитывая, что оно является спамом.

Апостериорная вероятность - это вероятность исхода после включения доказательной информации, то есть P (спам | деньги) - это вероятность того, что письмо является спамом, учитывая, что письмо включает в себя слово «деньги» в тексте.

Мы видим, что мы вычисляем апостериорную вероятность P (спам | деньги) из априорной вероятности P (спам) с P (деньги) и P (деньги | спам).

Апостериорный максимум (MAP) - это гипотеза с наивысшей апостериорной вероятностью. После вычисления апостериорной вероятности для нескольких гипотез мы выбираем гипотезу с наибольшей вероятностью.

Пример: Если P (спам | деньги) ›P (не спам | деньги), то мы можем сказать, что письмо можно классифицировать как спам. Это максимально вероятная гипотеза.

Как мы можем использовать теорему Байеса в классификации?

Ответ - наивное решение.

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

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

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

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

Давайте посмотрим на пример 👀

1️⃣ Наивный байесовский классификатор для полиномиальных моделей

Полиномиальный наивный байесовский классификатор подходит для классификации с дискретными функциями, такими как количество слов для классификации текста. Это требует целочисленного подсчета функций, таких как набор слов или извлечение функций tf-idf, применяемых к тексту.

В этом примере я буду использовать набор данных под названием Двадцать групп новостей, который представляет собой собрание примерно из 20 000 документов групп новостей, равномерно распределенных по 20 различным группам новостей.

from sklearn.datasets import fetch_20newsgroups
# import dataset
data = fetch_20newsgroups()
data.target_names

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

# Selected categories
categories = ['talk.politics.misc', 'talk.religion.misc', 'sci.med', 'sci.space', 'rec.autos']
# Create train and test dataset 
train = fetch_20newsgroups(subset='train', categories=categories)
test = fetch_20newsgroups(subset='test', categories=categories)

Давайте посмотрим на пример данных:

print(train.data[5])
>>>
From: [email protected] (Ted Schreiber)
Subject: Opinions on recent Alfa Spiders
Nntp-Posting-Host: mac178.mech.nwu.edu
Organization: Mechanical Engineering
Lines: 15

Anyone have any opinions on fairly recent model Alfa Spiders (86-> ) 

Reliablilty for what their class ( I'm not talking Alfa vs. Toyota corrola which is more relaible ) 

As far as I can discern, in recent years, there are 3 levels with all basically the same mechanical aspects.

Please email any responses 

Ted Schreiber
Mechanical Enginering 
Northwestern University
Tel: 708.491.5386 FAX 708.491.3915 Email: [email protected]

Чтобы использовать текстовые данные для любой задачи машинного обучения, нам нужно преобразовать каждую строку в вектор чисел. Этот шаг называется разработка функций, и один из способов сделать это - использовать векторизатор tf-idf. Мы можем создать конвейер, который присоединяет вектор tf-idf к полиномиальному наивному байесовскому классификатору.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
# Create a pipeline
model = make_pipeline(TfidfVectorizer(), MultinomialNB(alpha=1))

📢 альфа в multinomialNB представляет собой параметр аддитивного сглаживания. Если он равен 0, то сглаживания не будет.

⚡ Почему сглаживание? Сглаживание решает проблему нулевой вероятности в наивном байесовском алгоритме, которая заключается в присвоении вероятности равной нулю для каждой новой точки данных в тестовом наборе.

# Fit the model with training set
model.fit(train.data, train.target)
#Predict labels for the test set
labels = model.predict(test.data)

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

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# Create the confusion matrix
conf_mat = confusion_matrix(test.target, labels, normalize="true")
# Plot the confusion matrix
sns.heatmap(conf_mat.T, annot=True, fmt=".0%", cmap="cividis", xticklabels=train.target_names, yticklabels=train.target_names)
plt.xlabel("True label")
plt.ylabel("Predicted label")

Из матрицы неточностей мы видим, что наивный байесовский классификатор достаточно хорошо работал для некоторых категорий новостей, таких как автомобили, медицина и космос, где истинные метки правильно предсказываются в 98%, 95% и 97% случаев. Однако он показал более низкие результаты для категорий политики и религии, как вы можете себе представить.

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



Заключение

Наивные байесовские классификаторы обычно хороши для исходной базовой классификации. Их легко реализовать и интерпретировать. При этом они не подходят для сложных моделей, таких как отсутствие четко разделенных категорий.

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

Подводя итог, можно перечислить несколько преимуществ и недостатков наивного байесовского метода.

✅ Быстро для обучения и прогнозирования

✅ Легко реализовать, имея всего несколько настраиваемых параметров, таких как альфа

✅ Легко интерпретировать, поскольку они обеспечивают вероятностный прогноз

❌ Наивное предположение о том, что все предикторы независимы, в реальной жизни не выполняется

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

❌ Это может привести к очень необъективным оценкам.

Надеюсь, вам понравилось читать эту статью и вы узнали о наивном байесовском алгоритме.

Если вам понравилась эта статья, вы можете прочитать другие мои статьи здесь и подписаться на меня на Medium. Дайте мне знать, если у вас есть вопросы или предложения.

Понравилась статья? Станьте участником и получите больше!