Табліца:
Уступ
Naive Bayes - гэта класіфікацыйны алгарытм машыннага навучання, які заснаваны на тэарэме Байеса. Гэта вельмі эфектыўна, асабліва пры працы з тэкставымі дадзенымі, такімі як: аналіз пачуццяў, выяўленне спаму і класіфікацыя тэксту.
Гэты алгарытм называецца «наіўным» з-за здагадкі, што ўсе зменныя набору даных незалежныя, што не заўсёды так.
Перш чым працягваць тлумачыць, як працуе Naive Bayes, давайце пераканаемся, што мы разумеем наступнае:
Умоўная верагоднасць
Наіўны алгарытм Байеса заснаваны на тэарэме Байеса, якая заснавана на ўмоўнай імавернасці: гэта імавернасць наступлення падзеі A пры ўмове, што падзея B ужо адбылася.
Прыклад:
У нас ёсць дзве слоікі з каляровымі шарыкамі:
-
У банку 1 ёсць 3 сінія шары, 2 чырвоныя і 4 зялёныя шары.
-
У банку 2 1 сіні шар, 4 чырвоныя і 3 зялёныя шары.
Мы хочам вылічыць верагоднасць выпадковага выбару сіняга шара з аднаго са слоікаў
Гэта не што іншае, як сума верагоднасцей выбару сіняга шара з Jar1 або Jar2.
Цяпер мы хочам вылічыць верагоднасць выбару сіняга шара, улічваючы, што мы выбралі Jar1:
Нарэшце, мы хочам вылічыць верагоднасць выбару Jar1, улічваючы, што мы намалявалі сіні шар. Тут мы выкарыстоўваем тэарэму Байеса, якая гучыць так:
Наіўная класіфікацыя Байеса
У наіўным класіфікатары Байеса мы хочам знайсці клас, які максімізуе ўмоўную імавернасць з улікам уваходнага вектара X; такім чынам, наіўны Байес можа быць сфармуляваны наступным чынам:
З выкарыстаннем тэарэмы Байеса функцыя становіцца:
У гэтай фармулёўцы лёгка вылічыць P(Ci), якое з'яўляецца не чым іншым, як імавернасцю класа Ci, і лёгка вылічыць P(x), якое з'яўляецца верагоднасцю наступлення падзеі x.
Цяжка вылічыць P(x|Ci); верагоднасць падзеі x з улікам класа Ci. Каб яшчэ больш спрасціць гэта, нам трэба выказаць здагадку, што ўсе ўваходныя зменныя незалежныя; такім чынам, мы можам напісаць:
І менавіта з-за гэтага здагадкі мы называем гэты класіфікатар "наіўным", таму што мы не заўсёды можам гарантаваць незалежнасць уваходных зменных. Класіфікатар Naive Bayes становіцца:
Фактычна, мы можам яшчэ больш спрасціць гэтую фармулёўку, выключыўшы P(x), таму што яна аднолькавая для ўсіх класаў:
Зараз давайце паглядзім на прыклад:
| Надвор'е | Час | Дзень тыдня | Вячэра |
| ------- | -------- | --------------- | ------ |
| Ачысціць | Вечар | Выхадныя | Кухары |
| Воблачна | Ноч | будні | Заказы |
| Дажджлівы | Ноч | будні | Заказы |
| Дажджлівы | Апоўдні | будні | Заказы |
| Воблачна | Апоўдні | Выхадныя | Кухары |
| Ачысціць | Ноч | Выхадныя | Кухары |
| Снежны | Вечар | Выхадныя | Заказы |
| Ачысціць | Ноч | будні | Кухары |
| Ачысціць | Поўнач | Выхадныя | Заказы |
Тут у нас ёсць невялікі набор даных, які змяшчае 3 ўваходныя зменныя: надвор'е, час і дзень тыдня, а таксама адну мэтавую зменную: «Вячэра», якая паказвае, гатуе чалавек або замаўляе абед. Мы хацелі б знайсці клас уводу x={Ясна, вечар, выхадныя}:
Нам трэба вылічыць умоўную імавернасць для класа «Кухары» і класа «Заказы» з улікам уводу x={Ясна, вечар, выхадны}. Прагназаваны клас - гэта той, які мае найбольшую ўмоўную верагоднасць.
Мы пачынаем з разліку ўмоўнай верагоднасці класа «Кухары»:
Цяпер разлічваем кожную ўмоўную верагоднасць самастойна:
Верагоднасць надвор'я = "Ясна", калі клас "Кухары" - гэта колькасць радкоў з надвор'ем "Ясна" і класам "Кухары" ад агульнай колькасці радкоў з класам "Кухары"
Тое ж самае і з іншымі ўмоўнымі верагоднасцямі:
Цяпер для імавернасці P(Cooks) гэта колькасць радкоў з класам "Cooks" на агульную колькасць радкоў:
Цяпер вылічым здабытак гэтых верагоднасцей:
Гэта было для класа «Кухары», цяпер нам трэба зрабіць тое ж самае для класа «Заказы»:
Мы разлічваем індывідуальныя верагоднасці:
І, нарэшце, мы вылічым здабытак верагоднасцей:
Нарэшце, мы бярэм клас з найбольшай верагоднасцю, які з'яўляецца класам «Кухары»:
Перавагі і абмежаванні гэтага алгарытму
Перавагі:
- Гэта вельмі хуткі класіфікатар.
— Гэта лёгка рэалізаваць.
-
Фазы навучання няма, гэта толькі высновы.
-
Для таго, каб зрабіць высновы, не патрабуецца шмат дадзеных.
Абмежаванні:
- Наіўны Байес мяркуе, што ўваходныя зменныя незалежныя, што не заўсёды дакладна.
- Наіўны Байес пакутуе ад праблемы нулявой частаты: гэта калі ён прысвойвае нулявую верагоднасць уваходнай зменнай. Гэта абнуліць усю ўмоўную верагоднасць 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