Уводзіны ў наіўны алгарытм Байеса

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 Усе правы абароненыя.