Учиться, кодировать и выполнять…
Наивный байесовский алгоритм - очень удобный, популярный и важный алгоритм машинного обучения, особенно для текстовой аналитики и общей классификации. Он имеет множество различных конфигураций, а именно:
- Гауссовский наивный байесовский
- Полиномиальный наивный байесовский
- Дополнение наивного Байеса
- Бернулли Наивный Байес
- Внеядерный наивный байесовский
В этой статье я собираюсь обсудить гауссовский наивный байесовский алгоритм: алгоритм, его реализацию и применение в миниатюрном наборе данных Википедии (набор данных приведен в Википедии).
Алгоритм:
Gaussian Naive Bayes - это алгоритм с вероятностным подходом. Он включает в себя предварительное и апостериорное вычисление вероятностей классов в наборе данных и тестовых данных для данного класса соответственно.
Априорные вероятности всех классов рассчитываются по одной и той же формуле.
Но, как получить условные вероятности характеристик тестовых данных для данного класса?
Это дается вероятностью, полученной из распределения Гаусса (нормального).
Наконец, условная вероятность каждого класса с учетом экземпляра (тестового экземпляра) вычисляется с помощью теоремы Байеса.
Уравнение 4) повторяется для всех классов, и класс, показывающий наивысшую вероятность, в конечном итоге объявляется прогнозируемым результатом.
Реализация на Python с нуля:
Как указано, реализация с нуля, никакая другая библиотека, кроме Numpy (которая предоставляет Python со средой типа Matlab) и библиотеки, относящиеся к списку / словарю, не использовалась при кодировании алгоритма. Наивный байесовский метод Гаусса реализован в 4 модулях двоичной классификации, каждый из которых выполняет разные операции.
= ›Pre_prob (): возвращает априорные вероятности 2 классов согласно eq-1), принимая набор меток y в качестве входных данных. Реализация pre_prob () приведена ниже:
# Importing necessary libraries... import collections import numpy as np def pre_prob(y): y_dict = collections.Counter(y) pre_probab = np.ones(2) for i in range(0, 2): pre_probab[i] = y_dict[i]/y.shape[0] return pre_probab
= ›Mean_var (): это функция, которая возвращает среднее значение и дисперсию всех характеристик для двух меток классов (двоичная классификация), учитывая набор характеристик X и набор меток y в качестве входных данных. Реализация mean_var () приведена ниже:
def mean_var(X, y): n_features = X.shape[1] m = np.ones((2, n_features)) v = np.ones((2, n_features)) n_0 = np.bincount(y)[np.nonzero(np.bincount(y))[0]][0] x0 = np.ones((n_0, n_features)) x1 = np.ones((X.shape[0] - n_0, n_features)) k = 0 for i in range(0, X.shape[0]): if y[i] == 0: x0[k] = X[i] k = k + 1 k = 0 for i in range(0, X.shape[0]): if y[i] == 1: x1[k] = X[i] k = k + 1 for j in range(0, n_features): m[0][j] = np.mean(x0.T[j]) v[0][j] = np.var(x0.T[j])*(n_0/(n_0 - 1)) m[1][j] = np.mean(x1.T[j]) v[1][j] = np.var(x1.T[j])*((X.shape[0]-n_0)/((X.shape[0] - n_0) - 1)) return m, v # mean and variance
= ›Prob_feature_class (): это функция, которая возвращает апостериорные вероятности тестовых данных x для данного класса c (eq-2), принимая в качестве входных данных среднее m, дисперсию v и тестовые данные x. Реализация prob_feature_class () приведена ниже:
def prob_feature_class(m, v, x): n_features = m.shape[1] pfc = np.ones(2) for i in range(0, 2): product = 1 for j in range(0, n_features): product = product * (1/sqrt(2*3.14*v[i][j])) * exp(-0.5 * pow((x[j] - m[i][j]),2)/v[i][j]) pfc[i] = product return pfc
= ›GNB (): это функция, которая суммирует 3 другие функции, используя возвращаемые ими сущности для окончательного вычисления условной вероятности каждого из 2 классов с учетом тестового экземпляра x (eq-4 ), взяв набор функций X, набор меток y и тестовые данные x в качестве входных данных, и возвращает
- Среднее значение 2 классов для всех функций
- Разница 2 классов по всем характеристикам
- Априорные вероятности двух классов в наборе данных
- Апостериорные вероятности тестовых данных для каждого класса из 2 классов
- Условная вероятность каждого из 2 классов с учетом тестовых данных
- Окончательный прогноз, полученный с помощью гауссовского наивного байесовского алгоритма
Ниже представлена реализация GNB ():
def GNB(X, y, x): m, v = mean_var(X, y) pfc = prob_feature_class(m, v, x) pre_probab = pre_prob(y) pcf = np.ones(2) total_prob = 0 for i in range(0, 2): total_prob = total_prob + (pfc[i] * pre_probab[i]) for i in range(0, 2): pcf[i] = (pfc[i] * pre_probab[i])/total_prob prediction = int(pcf.argmax()) return m, v, pre_probab, pfc, pcf, prediction
Применение гауссовского наивного байесовского метода к миниатюрному набору данных
Образец Gender-Dataset, приведенный в Википедии, был использован для применения реализованного Gaussian Naive Bayes.
Постановка проблемы: «Учитывая рост (в футах), вес (в фунтах) и размер стопы (в дюймах), предскажите, мужчина это или женщина»
= ›Чтение данных выполняется с помощью Pandas, поскольку набор данных содержит текстовые заголовки для столбцов. В последующих операциях и других манипуляциях с данными Pandas больше не повторялся.
import pandas as pd import numpy as np data = pd.read_csv('gender.csv', delimiter = ',') data.head()
= ›Выполнение 4-модульного гауссовского Наивного Байеса для тестового экземпляра, используемого в Википедии.
# converting from pandas to numpy ... X_train = np.array(data.iloc[:,[1,2,3]]) y_train = np.array(data['Person']) for i in range(0,y_train.shape[0]): if y_train[i] == "Female": y_train[i] = 0 else: y_train[i] = 1 x = np.array([6, 130, 8]) # test instance used in Wikipedia # executing the Gaussian Naive Bayes for the test instance... m, v, pre_probab, pfc, pcf, prediction = GNB(X_train, y_train, x) print(m) # Output given below...(mean for 2 classes of all features) print(v) # Output given below..(variance for 2 classes of features) print(pre_probab) # Output given below.........(prior probabilities) print(pfc) # Output given below............(posterior probabilities) print(pcf) # Conditional Probability of the classes given test-data print(prediction) # Output given below............(final prediction)
Наконец, результаты расчетов и прогнозов соответствуют показанным в Википедии с использованием того же набора данных.
Эту реализацию гауссовского наивного байесовского метода также можно использовать для мультиклассовой классификации, повторяя каждый раз для каждого из классов в стиле One-vs-Rest.
Вот и все о гауссовском Наивном Байесе !!!
Для личных контактов относительно статьи или обсуждений машинного обучения / интеллектуального анализа данных или любого отдела науки о данных, не стесняйтесь обращаться ко мне в LinkedIn