Wprowadzenie do naiwnego algorytmu Bayesa

ML
algorytm ML
klasyfikacja
Wprowadzenie do naiwnego algorytmu Bayesa cover image

Tabela:

Wprowadzenie

Naive Bayes to algorytm uczenia maszynowego klasyfikacyjny oparty na twierdzeniu Bayesa. Jest bardzo wydajny, szczególnie w przypadku danych tekstowych, takich jak: analiza nastrojów, wykrywanie spamu i klasyfikacja tekstu.

Algorytm ten nazywany jest „naiwnym” ze względu na założenie, że wszystkie zmienne w zbiorze danych są niezależne, co nie zawsze ma miejsce.

Zanim przejdziemy dalej do wyjaśnienia, jak działa Naive Bayes, upewnijmy się, że rozumiemy następujące kwestie:

Warunkowe prawdopodobieństwo

Naiwny algorytm Bayesa opiera się na twierdzeniu Bayesa, które opiera się na prawdopodobieństwie warunkowym: jest to prawdopodobieństwo wystąpienia zdarzenia A przy założeniu, że zdarzenie B już nastąpiło.

Przykład:

Przygotujmy dwa słoiki zawierające kolorowe kulki:

  • W słoiku 1 znajdują się 3 kule niebieskie, 2 kule czerwone i 4 kulki zielone.

  • Słoik 2 ma 1 niebieską kulę, 4 czerwone kulki i 3 zielone kulki.

Chcemy obliczyć prawdopodobieństwo losowego wybrania niebieskiej kuli z jednego ze słoików

equations

To nic innego jak suma prawdopodobieństw wybrania niebieskiej kuli ze Słoika 1 lub Słoika 2.

Teraz chcemy obliczyć prawdopodobieństwo wybrania niebieskiej kuli, biorąc pod uwagę, że wybraliśmy Słoik1:

equations

Na koniec chcemy obliczyć prawdopodobieństwo wybrania Słoika1, biorąc pod uwagę, że wylosowaliśmy niebieską kulę. Tutaj używamy twierdzenia Bayesa, które jest sformułowane w następujący sposób:

equations

equations

Naiwna klasyfikacja Bayesa

W klasyfikatorze Naive Bayesa chcemy znaleźć klasę, która maksymalizuje prawdopodobieństwo warunkowe przy danym wektorze wejściowym X; zatem Naive Bayes można sformułować w następujący sposób:

equations

Korzystając z twierdzenia Bayesa, funkcja przyjmuje postać:

equations

W tym sformułowaniu łatwo jest obliczyć P(Ci), które jest niczym innym jak prawdopodobieństwem klasy Ci, a także łatwo obliczyć P(x), które jest prawdopodobieństwem wystąpienia zdarzenia x.

Trudno obliczyć P(x|Ci); prawdopodobieństwo zdarzenia x przy danej klasie Ci. Aby jeszcze bardziej to uprościć, musimy założyć, że wszystkie zmienne wejściowe są niezależne; zatem możemy napisać:

equations

I właściwie z powodu tego założenia nazywamy ten klasyfikator „naiwnym”, ponieważ nie zawsze możemy zagwarantować niezależność zmiennych wejściowych. Naiwny klasyfikator Bayesa staje się:

equations

W rzeczywistości możemy jeszcze bardziej uprościć to sformułowanie, eliminując P(x), ponieważ jest ono takie samo dla wszystkich klas:

equations

Teraz spójrzmy na przykład:

| Pogoda | Czas | Dzień tygodnia | Kolacja |

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

| Wyczyść | Wieczór | Weekend | Kucharze |

| pochmurno | Noc | Dzień powszedni | Zamówienia |

| Deszczowo | Noc | Dzień powszedni | Zamówienia |

| Deszczowo | Południe | Dzień powszedni | Zamówienia |

| pochmurno | Południe | Weekend | Kucharze |

| Wyczyść | Noc | Weekend | Kucharze |

| Śnieżny | Wieczór | Weekend | Zamówienia |

| Wyczyść | Noc | Dzień powszedni | Kucharze |

| Wyczyść | Północ | Weekend | Zamówienia |

Mamy tutaj mały zbiór danych zawierający 3 zmienne wejściowe: pogodę, godzinę i dzień tygodnia oraz jedną zmienną docelową: „Kolacja”, która wskazuje, czy dana osoba gotuje lub zamawia obiad. Chcielibyśmy znaleźć klasę wejścia x={Pogodnie, Wieczór, Weekend}:

equations

Musimy obliczyć prawdopodobieństwo warunkowe dla klasy „Kucharze” i klasy „Zamówienia”, biorąc pod uwagę dane wejściowe x={Pogodnie, Wieczór, Weekend}. Przewidywana klasa to ta, która ma najwyższe prawdopodobieństwo warunkowe.

Zaczynamy od obliczenia prawdopodobieństwa warunkowego klasy „Kucharze”:

equations

Teraz obliczamy każde prawdopodobieństwo warunkowe osobno:

Prawdopodobieństwo pogody = „Pogodnie”, biorąc pod uwagę, że klasa to „Kucharze”, to liczba wierszy z pogodą „Pogoda” i klasą „Kucharze” w stosunku do całkowitej liczby wierszy z klasą „Kucharze”

equations

To samo dotyczy innych prawdopodobieństw warunkowych:

equations

Teraz dla prawdopodobieństwa P(Cooks) jest to liczba linii z klasą „Cooks” w stosunku do całkowitej liczby linii:

equations

Teraz obliczamy iloczyn tych prawdopodobieństw:

equations

To było dla klasy „Kucharze”, teraz musimy zrobić to samo dla klasy „Zamówienia”:

equations

Obliczamy indywidualne prawdopodobieństwa:

equations

I na koniec obliczamy iloczyn prawdopodobieństw:

equations

Na koniec bierzemy klasę z największym prawdopodobieństwem, czyli klasę „Kucharze”:

equations

equations

equations

equations

equations

equations

Zalety i ograniczenia tego algorytmu

Zalety:

  • Jest to bardzo szybki klasyfikator.

  • Jest łatwy do wdrożenia.

  • Nie ma fazy szkolenia, jest to jedynie wnioskowanie.

  • Nie potrzeba wielu danych, żeby wyciągać wnioski.

Ograniczenia:

  • Naiwny Bayes zakłada, że ​​zmienne wejściowe są niezależne, co nie zawsze jest prawdą.

  • Naiwny Bayes cierpi na problem częstotliwości zerowej: występuje wtedy, gdy przypisuje zmiennej wejściowej zerowe prawdopodobieństwo. Spowoduje to wyzerowanie całego prawdopodobieństwa warunkowego P(C|x). Aby tego uniknąć, należy zastosować minimalną częstotliwość 1 (zamiast 0) dla wszystkich zmiennych.

Ćwiczenie

Oto ramka danych tego samego zbioru danych, który widzieliśmy w przykładzie.

Twoim zadaniem jest samodzielne zaimplementowanie Naive Bayes przy użyciu Pythona:

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

Rozwiązanie


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

Usługi związane z karierą

Contact Section background image

Pozostańmy w kontakcie

Code Labs Academy © 2024 Wszelkie prawa zastrzeżone.