Вероятность и классификация — один из наиболее важных аспектов машинного обучения. Они часто идут рука об руку друг с другом. Мы используем различные алгоритмы для классификации данных по различимым классам. Одним из таких алгоритмов является наивный алгоритм Байеса.
«Учащийся, который использует теорему Байеса и предполагает, что эффекты независимы, учитывая причину, называется наивным байесовским классификатором. Это потому, что это такое наивное предположение».
— Педро Домингос.
Основы наивного байесовского алгоритма
Чтобы понять наивный байесовский подход, нам потребуются некоторые базовые знания о вероятности и теореме Байеса. Чтобы понять это, давайте рассмотрим пример:
Кости и монета брошены. Какова вероятность 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}")
Эта документация дает представление о работе и математике, используемых в наивном байесовском алгоритме. Блог дает общее представление о различных типах вероятностей, связанных с процессом создания наивной байесовской модели с нуля. Рекомендуется больше узнать в Интернете о математике, лежащей в основе всех типов наивных байесовских алгоритмов.
Спасибо за прочтение.
Не забудьте нажать 👏!