Введение в наивный алгоритм Байеса

ML
алгоритм ML
классификация
Введение в наивный алгоритм Байеса cover image

Стол:

Вступление

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

Этот алгоритм называется «Наивным» из-за предположения, что все переменные набора данных независимы, что не всегда так.

Прежде чем углубляться в объяснение того, как работает Наивный Байес, давайте убедимся, что мы понимаем следующее:

Условная возможность

Наивный алгоритм Байеса основан на теореме Байеса, которая основана на условной вероятности: это вероятность возникновения события A при условии, что событие B уже произошло.

Пример:

Давайте возьмем две банки с цветными шариками:

  • В банке 1 есть 3 синих шара, 2 красных шара и 4 зеленых шара.

  • В банке 2 есть 1 синий шар, 4 красных шара и 3 зеленых шара.

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

equations

Это не что иное, как сумма вероятностей выбора синего шара из Jar1 или Jar2.

Теперь мы хотим вычислить вероятность выбора синего шара, учитывая, что мы выбрали Jar1:

equations

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

equations

equations

Наивная байесовская классификация

В наивном байесовском классификаторе мы хотим найти класс, который максимизирует условную вероятность с учетом входного вектора X; таким образом, наивный Байес можно сформулировать следующим образом:

equations

С использованием теоремы Байеса функция принимает вид:

equations

В этой формулировке легко вычислить P(Ci), которая есть не что иное, как вероятность класса Ci, и легко вычислить P(x), которая представляет собой вероятность наступления события x.

Что сложно вычислить, так это P(x|Ci); вероятность события x, заданного классом Ci. Чтобы еще больше упростить это, нам нужно предположить, что все входные переменные независимы; таким образом, мы можем написать:

equations

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

equations

Фактически, мы можем еще больше упростить эту формулировку, исключив P(x), поскольку она одинакова для всех классов:

equations

Теперь давайте посмотрим на пример:

| Погода | Время | День недели | Ужин |

| ------- | -------- | --------------- | ------ |

| Очистить | Вечер | Выходные | Повара |

| Облачно | Ночь | Будний день | Заказы |

| Дождливый | Ночь | Будний день | Заказы |

| Дождливый | Полдень | Будний день | Заказы |

| Облачно | Полдень | Выходные | Повара |

| Очистить | Ночь | Выходные | Повара |

| Снежный | Вечер | Выходные | Заказы |

| Очистить | Ночь | Будний день | Повара |

| Очистить | Полночь | Выходные | Заказы |

Здесь у нас есть небольшой набор данных, который содержит 3 входные переменные: погода, время и день недели, а также одну целевую переменную: «Ужин», которая указывает, готовит ли человек ужин или заказывает его. Нам нужно найти класс ввода x={Clear, Evening, Weekend}:

equations

Нам нужно вычислить условную вероятность для класса «Повара» и класса «Заказы» с учетом входных данных x={Ясно, Вечер, Выходные}. Прогнозируемый класс — это тот, который имеет наибольшую условную вероятность.

Начнем с расчета условной вероятности класса «Повара»:

equations

Теперь вычисляем каждую условную вероятность самостоятельно:

Вероятность погоды = «Ясно» при условии, что класс «Повара» — это количество строк с погодой «Ясно» и классом «Повара» от общего количества строк с классом «Повара».

equations

То же самое касается и других условных вероятностей:

equations

Теперь вероятность P(Повара) — это количество строк с классом «Повара» от общего количества строк:

equations

Теперь посчитаем произведение этих вероятностей:

equations

Это было для класса «Повара», теперь нам нужно сделать то же самое для класса «Заказы»:

equations

Рассчитаем отдельные вероятности:

equations

И наконец вычисляем произведение вероятностей:

equations

Наконец, мы берем класс с наибольшей вероятностью — класс «Повара»:

equations

equations

equations

equations

equations

equations

Преимущества и ограничения этого алгоритма

Преимущества:

  • Это очень быстрый классификатор.

  • Это легко реализовать.

  • Фазы обучения нет, это только умозаключения.

  • Чтобы сделать выводы, не требуется много данных.

Ограничения:

  • Наивный байесовский подход предполагает, что входные переменные независимы, что не всегда верно.

  • Наивный байес страдает от проблемы нулевой частоты: он присваивает входной переменной нулевую вероятность. Это обнулит всю условную вероятность P(C|x). Чтобы избежать этого, можно использовать минимальную частоту 1 (вместо 0) для всех переменных.

Упражнение

Вот кадр данных того же набора данных, который мы видели в примере.

Ваша задача — самостоятельно реализовать Наивный Байес с помощью Python:

import pandas as pd
dataset = pd.DataFrame()
dataset['Weather'] = ['Clear', 'Cloudy', 'Rainy', 'Rainy', 'Cloudy', 'Clear', 'Snowy', 'Clear', 'Clear']
dataset['Time'] = ['Evening', 'Night', 'Night', 'Midday', 'Midday', 'Night', 'Evening', 'Night', 'Midnight']
dataset['Day'] = ['Weekend', 'Weekday', 'Weekday', 'Weekday', 'Weekend', 'Weekend', 'Weekend', 'Weekday', 'Weekend']
dataset['Class'] = ['Cooks', 'Orders', 'Orders', 'Orders', 'Cooks', 'Cooks', 'Orders', 'Cooks', 'Orders']

def naive_bayes(weather, time, day):

# res_dict = {class1: probability of class 1, class1: probability of class 1
return res_dict

Решение


def naive_bayes(x_weather, x_time, x_day):
  TARGET = 'Dinner' # The name of the target variable
  CLASSES = list(dataset['Dinner'].unique()) # The classes of the target variable
len_dataset = len(dataset) # The length of the dataset
res_dict = {} # res_dict = {class1:probability1, ..., class_n:probability_n}

# for each class of the target classes, we calculate the it's conditional probability
for class_name in CLASSES:
# the number of lines that belong to the class "class_name"
len_c  = len(dataset[ (dataset[TARGET] == class_name) ])

# the number of lines that belong to the class "class_name" and have weather="x_weather"
n_weather = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Weather'] == x_weather) ])
# the number of lines that belong to the class "class_name" and have time="x_time"
n_time = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Time'] == x_time) ])

# the number of lines that belong to the class "class_name" and have day="x_day"
n_day  = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Day'] == x_day) ])

# We calculate the conditional probability:
# P(class|x) = P(weather|class) x P(time|class) x P(day|class) x P(class)
p = (n_weather / len_c) * (n_time / len_c) * (n_day / len_c) * (len_c / len_dataset)        res_dict[class_name] = p
return res_dict



Career Services background pattern

Карьерные услуги

Contact Section background image

Давай останемся на связи

Code Labs Academy © 2024 Все права защищены.