Зверніться до нашої нової Data Science & AI і Cybersecurity Заочні когорти

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

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

Таблиця:

Вступ

Naive Bayes — це алгоритм машинного навчання класифікації, який базується на теоремі Байєса. Це дуже ефективно, особливо при роботі з текстовими даними, такими як: аналіз настрою, виявлення спаму та класифікація тексту.

Цей алгоритм називають «Наївним» через припущення, що всі змінні набору даних є незалежними, що не завжди так.

Перш ніж далі пояснювати, як працює Naive Bayes, давайте переконаємося, що ми розуміємо наступне:

Умовна ймовірність

Наївний алгоритм Байєса базується на теоремі Байєса, яка базується на умовній ймовірності: це ймовірність появи події 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

І саме через це припущення ми називаємо цей класифікатор «Наївним», оскільки ми не завжди можемо гарантувати незалежність вхідних змінних. Класифікатор Naive Bayes стає:

equations

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

equations

Тепер давайте подивимося на приклад:

| Погода | Час | День тижня | Вечеря |

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

| Очистити | Вечір | Вихідні | Кухарі |

| Хмарно | Ніч | День тижня | Замовлення |

| Дощовий | Ніч | День тижня | Замовлення |

| Дощовий | Полудень | День тижня | Замовлення |

| Хмарно | Полудень | Вихідні | Кухарі |

| Очистити | Ніч | Вихідні | Кухарі |

| Сніжний | Вечір | Вихідні | Замовлення |

| Очистити | Ніч | День тижня | Кухарі |

| Очистити | Опівночі | Вихідні | Замовлення |

Тут ми маємо невеликий набір даних, який містить 3 вхідні змінні: погода, час і день тижня, а також одну цільову змінну: «Вечеря», яка вказує, готує людина чи замовляє вечерю. Ми хочемо знайти клас введення x={Ясно, вечір, вихідні}:

equations

Нам потрібно обчислити умовну ймовірність для класу “Кухарі” та класу “Замовлення” з урахуванням вхідних даних x={Ясно, вечір, вихідні}. Прогнозований клас – це той, що має найвищу умовну ймовірність.

Почнемо з обчислення умовної ймовірності класу «Кухарі»:

equations

Тепер розрахуємо кожну умовну ймовірність окремо:

Імовірність погоди = «Ясно», враховуючи, що клас «Кухарі» — це кількість рядків із погодою «Ясно» та класом «Кухарі» над загальною кількістю рядків із класом «Кухарі»

equations

Те саме стосується й інших умовних ймовірностей:

equations

Тепер для ймовірності P(Cooks) це кількість рядків із класом «Cooks» на загальну кількість рядків:

equations

Тепер обчислимо добуток цих ймовірностей:

equations

Це було для класу «Кухарі», тепер нам потрібно зробити те саме для класу «Замовлення»:

equations

Розраховуємо індивідуальні ймовірності:

equations

І нарешті ми обчислюємо добуток ймовірностей:

equations

Нарешті, ми беремо клас з найвищою ймовірністю, який є класом «Кухарі»:

equations

equations

equations

equations

equations

equations

Переваги та обмеження цього алгоритму

Переваги:

  • Це дуже швидкий класифікатор.

  • Це легко реалізувати.

  • Немає фази навчання, це лише висновок.

  • Щоб зробити висновки, не потрібно багато даних.

Обмеження:

  • Наївний Байєс припускає, що вхідні змінні незалежні, що не завжди вірно.

  • Наївний Байєс страждає від проблеми нульової частоти: це коли він призначає нульову ймовірність вхідній змінній. Це обнулить всю умовну ймовірність P(C|x). Щоб цього уникнути, можна використовувати мінімальну частоту 1 (замість 0) для всіх змінних.

Вправа

Ось фрейм даних того самого набору даних, який ми бачили в прикладі.

Ваше завдання — самостійно реалізувати Naive Bayes за допомогою 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 Всі права захищені.