Учиться, кодировать и выполнять…

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

  1. Гауссовский наивный байесовский
  2. Полиномиальный наивный байесовский
  3. Дополнение наивного Байеса
  4. Бернулли Наивный Байес
  5. Внеядерный наивный байесовский

В этой статье я собираюсь обсудить гауссовский наивный байесовский алгоритм: алгоритм, его реализацию и применение в миниатюрном наборе данных Википедии (набор данных приведен в Википедии).

Алгоритм:

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 в качестве входных данных, и возвращает

  1. Среднее значение 2 классов для всех функций
  2. Разница 2 классов по всем характеристикам
  3. Априорные вероятности двух классов в наборе данных
  4. Апостериорные вероятности тестовых данных для каждого класса из 2 классов
  5. Условная вероятность каждого из 2 классов с учетом тестовых данных
  6. Окончательный прогноз, полученный с помощью гауссовского наивного байесовского алгоритма

Ниже представлена ​​реализация 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