Вероятность и классификация — один из наиболее важных аспектов машинного обучения. Они часто идут рука об руку друг с другом. Мы используем различные алгоритмы для классификации данных по различимым классам. Одним из таких алгоритмов является наивный алгоритм Байеса.

«Учащийся, который использует теорему Байеса и предполагает, что эффекты независимы, учитывая причину, называется наивным байесовским классификатором. Это потому, что это такое наивное предположение».
— Педро Домингос.

Основы наивного байесовского алгоритма

Чтобы понять наивный байесовский подход, нам потребуются некоторые базовые знания о вероятности и теореме Байеса. Чтобы понять это, давайте рассмотрим пример:

Кости и монета брошены. Какова вероятность HEAD и 4?
Мы знаем, что вероятность P события E можно рассчитать как P(E) = количество благоприятных исходов / общее количество результатов. Таким образом, мы можем рассчитать вероятность для этого примера следующим образом: (1/2) * (1/6) = 1/12.

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

  • Условная вероятность:
    это мера вероятности наступления события A при условии, что произошло другое событие B.
  • Совместная вероятность:
    это мера двух или более событий, происходящих одновременно.
  • Предельная вероятность:
    это мера вероятности события независимо от исхода других событий.
  • Пропорциональность:
    это отношение между двумя величинами, которые мультипликативно связаны с константой.

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

Наивный байесовский классификатор основан на теореме Байеса с «наивным предположением» о том, что признаки независимы друг от друга. Чтобы понять это предположение, мы рассмотрим, что утверждает теорема Байеса:

  • Апостериорная вероятность:
    это вероятность наступления события А при условии, что событие Б уже произошло.
  • Априорная вероятность:
    это вероятность того, что событие А произойдет до того, как будут приняты во внимание какие-либо соответствующие доказательства.
  • Вероятность:
    это вероятность события B при условии, что событие A уже произошло.
  • Маргинализация:
    вероятность наступления события Б.

Учитывая вектор признаков X=(x₁,x₂,…,xₙ) и переменную классаCₖ, байесовский Теорема утверждает, что:

Здесь P(Cₖ|X) — апостериорная вероятность, P(X|Cₖ) — вероятность , P(Cₖ) – априорная вероятность и P(X) – фактор маргинализации или априорная вероятность Предиктор.

Используя цепное правило, мы можем рассчитать вероятность P(X|Cₖ)как:

P(X|Cₖ) = P(x₁,…,xₙ|Cₖ) = P(x₁|x₂,…,xₙ, Cₖ)*P(x₂|x₃,…,xₙ, Cₖ)*…*P(xₙ₋₁|xₙ, Cₖ)*P(xₙ|Cₖ)

Наивное предположение

Чрезвычайно сложно и дорого рассчитать P(X|Cₖ)с помощью приведенной выше формулы. Вместо этого Наивный Байес предполагает условную независимость каждого признака. Это упрощает нахождение апостериорной вероятности, поскольку:

Предполагая: P(xᵢ|xᵢ+₁,…,xₙ|Cₖ) = P(xᵢ|Cₖ)

Мы можем заключить: P(X|Cₖ) = P(x₁,…,xₙ|Cₖ) = ⁿ∏ᵢ₌₁ P(xᵢ|Cₖ)

Таким образом, апостериорную вероятность можно записать в виде:

Здесь P (X) — это априорная вероятность предсказателя, которая постоянна с учетом входных данных. Итак, мы можем сказать:

и, наконец, нам нужно найти максимум ⁿ∏ᵢ₌₁ P(xᵢ|Cₖ)для различных значений класса Cₖ:

Типы наивного Байеса

На практике используются 3 типа наивного байесовского алгоритма:

  • Полиномиальный наивный байесовский метод:
    предполагается, что каждое P(xₙ|Cₖ) подчиняется полиномиальному распределению. Он в основном используется в задачах классификации документов и рассматривает частоту слов.
  • Наивный байесовский метод Бернулли:
    он похож на полиномиальный наивный байесовский метод, за исключением того, что предикторы являются булевыми.
  • Гауссовский наивный байесовский метод:
    предполагается, что непрерывные значения выбираются из гауссовского распределения.

Реализация наивного Байеса с нуля

  • Импорт необходимых библиотек:
import numpy as np
import pandas as pd
  • Определите наивный байесовский класс и функции:
class NaiveBayes:
    def __init__(self, X, y):
        self.no_examples, self.no_features = X.shape
        self.no_classes = len(np.unique(y))
        self.eps = 1e-6
def fit(self, X):
        self.classes_mean = {}
        self.classes_variance = {}
        self.classes_prior = {}
        for c in range(self.no_classes):
            X_c = X[y == c]
            self.classes_mean[str(c)] = np.mean(X_c, axis=0)
            self.classes_variance[str(c)] = np.var(X_c, axis=0)
            self.classes_prior[str(c)] = X_c.shape[0] / X.shape[0]
def predict(self, X):
        probs = np.zeros((self.no_examples, self.no_classes))
        for c in range(self.no_classes):
            prior = self.classes_prior[str(c)]
            probs_c = self.density_function(X, self.classes_mean[str(c)], self.classes_variance[str(c)])
            probs[:, c] = probs_c + np.log(prior)
        return np.argmax(probs, 1)
# log of PDF used:
def density_function(self, x, mean, sigma):
        const = -self.no_features / 2 * np.log(2 * np.pi) - 0.5 * np.sum(np.log(sigma + self.eps))
        probs = 0.5 * np.sum(np.power(x - mean, 2) / (sigma + self.eps), 1)
        return const - probs

Примечание. Журнал функции распределения вероятностей используется здесь для масштабирования вероятности 0–1 до -∞-0 и преобразования операции умножения в сложение, что снижает стоимость алгоритма.

  • Загрузить набор данных:

Примечание. Используемый набор данных можно найти здесь. Загрузить данные, Загрузить цели.

X = np.loadtxt("/content/data.txt", delimiter=",")
y = np.loadtxt("/content/targets.txt") - 1
print(X.shape, y.shape)
  • Подогнать данные:
# Create an Object of Class NaiveBayes
NB = NaiveBayes(X, y)
# Fit the Data
NB.fit(X)
  • Прогнозируйте и проверяйте точность:
# Predict the Data
y_pred = NB.predict(X)
# Check Accuracy
print(f"Accuracy: {(sum(y_pred==y)/X.shape[0])*100}")

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

Спасибо за прочтение.
Не забудьте нажать 👏!