Таблица:
Intro
Naive Bayes - бул Байес теоремасына негизделген классификациялоочу машина үйрөнүү алгоритми. Бул өзгөчө тексттик маалыматтар менен иштөөдө абдан эффективдүү: Сезимди талдоо, Спамды аныктоо жана текстти классификациялоо.
Бул алгоритм "Наив" деп аталат, анткени бардык маалымат топтомунун өзгөрмөлөрү көз карандысыз деген божомол бар, бул дайыма эле боло бербейт.
Naive Bayes кантип иштээрин түшүндүрүп берүүдөн мурун, биз төмөнкүлөрдү түшүнгөнүбүздү текшерип көрөлү:
Шарттуу ыктымалдуулук
Naive Bayes алгоритми шарттуу ыктымалдуулукка негизделген Байес теоремасына негизделген: бул В окуясы болуп өткөн болсо, А окуясынын пайда болуу ыктымалдыгы.
Мисалы:
Түстүү шарларды камтыган эки банка болсун:
-
1 банкада 3 көк шар, 2 кызыл шар жана 4 жашыл шар бар.
-
2 банкада 1 көк шар, 4 кызыл шар жана 3 жашыл шар бар.
Биз банкалардын биринен көк шарды кокустан тандап алуу ыктымалдыгын эсептеп алгыбыз келет
Бул Jar1 же Jar2ден көк топту тандоо ыктымалдыктарынын суммасынан башка эч нерсе эмес.
Эми биз Jar1ди тандап алганыбызды эске алуу менен көк шарды тандоо ыктымалдыгын эсептеп алгыбыз келет:
Акырында, биз көк шар тартканыбызды эске алганда, Jar1ди тандоо ыктымалдыгын эсептеп алгыбыз келет. Бул жерде биз төмөндөгүдөй айтылган Байес теоремасын колдонобуз:
Naive Bayes классификациясы
Naive Bayes классификаторунда биз X киргизүү вектору берилген шарттуу ыктымалдуулукту максималдуу кылган классты тапкыбыз келет; Ошентип, Naive Bayes төмөнкүчө чагылдырууга болот:
Бейс теоремасын колдонуу менен функция төмөнкүдөй болот:
Бул формулада Ci классынын ыктымалдыгынан башка эмес P(Ci) эсептөө оңой, ал эми х окуясынын пайда болуу ыктымалдыгы болгон P(x) эсептөө оңой.
Эсептөө кыйын P(x|Ci); Ci классы берилген х окуясынын ыктымалдыгы. Муну дагы жөнөкөйлөтүү үчүн, биз бардык киргизилген өзгөрмөлөр көз карандысыз деп ойлошубуз керек; Ошентип, биз жаза алабыз:
Чындыгында, бул классификаторду "Наив" деп атаганыбыз ушул божомолдон улам, биз ар дайым киргизилген өзгөрмөлөрдүн көз карандысыздыгына кепилдик бере албайбыз. Naive Bayes классификатору төмөнкүдөй болот:
Чынында, биз P(x) жок кылуу менен бул формуланы дагы жөнөкөйлөштүрө алабыз, анткени ал бардык класстар үчүн бирдей:
Эми бир мисалды карап көрөлү:
| Аба ырайы | Убакыт | Аптанын күнү | Кечки тамак |
| ------- | -------- | --------------- | ------ |
| Таза | Кечки | Weekend | Ашпозчулар |
| Булуттуу | Night | Иш күнү | Заказдар |
| Жамгырлуу | Night | Иш күнү | Заказдар |
| Жамгырлуу | Түшкү | Иш күнү | Заказдар |
| Булуттуу | Түшкү | Weekend | Ашпозчулар |
| Таза | Night | Weekend | Ашпозчулар |
| Snowy | Кечки | Weekend | Заказдар |
| Таза | Night | Иш күнү | Ашпозчулар |
| Таза | Midnight | Weekend | Заказдар |
Бул жерде бизде 3 киргизүү өзгөрмөсүн камтыган кичинекей берилиштер топтому бар: Аба ырайы, Аптанын убактысы жана күнү жана бир Максаттуу өзгөрмө: "Кечки тамак" адам кечки тамагын бышырарын же буйрутмасын көрсөтөт. Биз x={Clear, Evening, Weekend} киргизүү классын тапкыбыз келет:
Биз x={Clear, Evening, Weekend} киргизүүнү эске алуу менен "Ашпозчулар" классы жана "Заказдар" классы үчүн шарттуу ыктымалдыкты эсептеп чыгышыбыз керек. Болжолдонгон класс шарттуу ыктымалдуулугу жогору класс болуп саналат.
Биз "Ашпозчулар" классынын шарттуу ыктымалдыгын эсептөө менен баштайбыз:
Эми биз ар бир шарттуу ыктымалдыкты өз алдынча эсептейбиз:
Аба ырайынын ыктымалдыгы = "Ашпозчулар" классы болсо, бул "Ашпозчулар" классы бар саптардын жалпы санына караганда "Ачык" жана "Ашпозчулар" классынын сызыктарынын саны.
Ошол эле башка шарттуу ыктымалдыктарга да тиешелүү:
Эми P (ашпозчулар) ыктымалдыгы үчүн, бул саптардын жалпы санынан "Ашпозчулар" классындагы саптардын саны:
Эми бул ыктымалдыктардын көбөйтүндүсүн эсептейбиз:
Бул "Ашпозчулар" классы үчүн болчу, эми биз "Буйруктар" классы үчүн да ушундай кылышыбыз керек:
Биз жеке ыктымалдыктарды эсептейбиз:
Акыры, биз ыктымалдыктардын продуктусун эсептейбиз:
Акыр-аягы, биз "Ашпозчулар" классы болгон ыктымалдыгы жогору классты алабыз:
Бул алгоритмдин артыкчылыктары жана чектөөлөрү
Артыкчылыктары:
-
Бул абдан тез классификатор.
-
Аны ишке ашыруу оңой.
-
Эч кандай машыгуу фазасы жок, бирок бул жөн гана тыянак.
-
Корутунду чыгаруу үчүн көп маалыматтарды талап кылбайт.
Чектөөлөр:
- Naive Bayes киргизүү өзгөрмөлөр көз карандысыз деп болжолдойт, бул дайыма эле туура эмес.
- Naive Bayes нөл жыштык көйгөйүнөн жабыркайт: ал киргизилген өзгөрмөгө нөл ыктымалдыкты дайындаганда. Бул бардык шарттуу ыктымалдык P(C|x) нөлгө барабар кылат. Мунун алдын алуунун бир ыкмасы - бардык өзгөрмөлөргө минималдуу 1 жыштыгын (0 ордуна) колдонуу.
Көнүгүү
Бул жерде биз мисалда көргөн ошол эле маалымат топтомунун маалымат фрейми.
Сиздин милдетиңиз Python аркылуу Naive Bayesти өзүңүз ишке ашыруу:
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