Introduksjon til den naive Bayes-algoritmen

ML
ML-algoritme
klassifisering
Introduksjon til den naive Bayes-algoritmen cover image

Bord:

Intro

Naive Bayes er en maskinlæringsalgoritme for klassifisering som er basert på Bayes-teoremet. Det er veldig effektivt, spesielt når du arbeider med tekstdata som: Sentimentanalyse, Spam-deteksjon og tekstklassifisering.

Denne algoritmen kalles "naiv" på grunn av antagelsen om at alle datasettvariablene er uavhengige, noe som ikke alltid er tilfelle.

Før vi går videre inn på å forklare hvordan Naive bayes fungerer, la oss sørge for at vi forstår følgende:

Betinget sannsynlighet

Naiv Bayes-algoritme er basert på Bayes-teoremet som er basert på betinget sannsynlighet: det er sannsynligheten for forekomsten av en hendelse A gitt at en hendelse B allerede har skjedd.

Eksempel:

La oss ha to krukker som inneholder fargede kuler:

  • Krukke 1 har 3 blå kuler, 2 røde kuler og 4 grønne kuler.

  • Krukke 2 har 1 blå kule, 4 røde kuler og 3 grønne kuler.

Vi ønsker å beregne sannsynligheten for å tilfeldig velge en blå ball fra en av glassene

equations

Det er ikke annet enn summen av sannsynlighetene for å velge en blå ball fra Jar1 eller Jar2.

Nå ønsker vi å beregne sannsynligheten for å velge en blå ball gitt at vi valgte Jar1:

equations

Til slutt ønsker vi å beregne sannsynligheten for å velge Jar1 gitt at vi tegnet en blå ball. Her bruker vi Bayes-teoremet som er angitt som følgende:

equations

equations

Naiv Bayes-klassifisering

I Naive Bayes klassifikatoren ønsker vi å finne klassen som maksimerer den betingede sannsynligheten gitt inngangsvektoren X; dermed kan Naive Bayes formuleres som følger:

equations

Med bruk av Bayes-teorem blir funksjonen:

equations

I denne formuleringen er det lett å beregne P(Ci) som ikke er noe annet enn sannsynligheten for klassen Ci, og det er lett å beregne P(x) som er sannsynligheten for at hendelsen x inntreffer.

Det som er vanskelig å beregne er P(x|Ci); sannsynligheten for hendelsen x gitt klassen Ci. For å forenkle dette ytterligere, må vi anta at alle inngangsvariablene er uavhengige; dermed kan vi skrive:

equations

Og det er faktisk på grunn av denne antakelsen at vi kaller denne klassifikatoren "Naiv", fordi vi ikke alltid kan garantere uavhengigheten til inngangsvariablene. Den naive Bayes-klassifisereren blir:

equations

Faktisk kan vi forenkle denne formuleringen ytterligere ved å eliminere P(x), fordi den er lik for alle klasser:

equations

La oss nå se på et eksempel:

| Været | Tid | Ukedag | Middag |

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

| Fjern | Kveld | Helg | Kokker |

| Overskyet | Natt | Ukedag | Bestillinger |

| Regnfullt | Natt | Ukedag | Bestillinger |

| Regnfullt | Middag | Ukedag | Bestillinger |

| Overskyet | Middag | Helg | Kokker |

| Fjern | Natt | Helg | Kokker |

| Snøhvit | Kveld | Helg | Bestillinger |

| Fjern | Natt | Ukedag | Kokker |

| Fjern | Midnatt | Helg | Bestillinger |

Her har vi et lite datasett som inneholder 3 inngangsvariabler: Vær, klokkeslett og ukedag, og en målvariabel: "Middag" som indikerer om en person lager mat eller bestiller middagen sin. Vi ønsker å finne klassen for inngangen x={Klart, Kveld, Helg}:

equations

Vi må beregne den betingede sannsynligheten for klassen "Kokker" og klassen "Ordre" gitt inndata x={Klart, Kveld, Helg}. Den predikerte klassen er den som har høyest betinget sannsynlighet.

Vi starter med å beregne den betingede sannsynligheten for klassen "Kokker":

equations

Nå beregner vi hver betinget sannsynlighet for seg:

Sannsynligheten for vær = "Klar" gitt at klassen er "Kokker" er antallet linjene med vær "Klar" og klassen "Kokk" over det totale antallet linjer med klassen "Kokker"

equations

Det samme gjelder de andre betingede sannsynlighetene:

equations

Nå for sannsynligheten P(Kokker) er det antall linjer med klassen "Koker" over det totale antallet linjer:

equations

Nå beregner vi produktet av disse sannsynlighetene:

equations

Det var for klassen "Kokker", nå må vi gjøre det samme for klassen "Bestillinger":

equations

Vi beregner de individuelle sannsynlighetene:

equations

Og til slutt beregner vi produktet av sannsynlighetene:

equations

Til slutt tar vi klassen med høyest sannsynlighet som er klassen "Kokker":

equations

equations

equations

equations

equations

equations

Fordeler og begrensninger med denne algoritmen

Fordeler:

– Det er en veldig rask klassifisering.

– Det er enkelt å gjennomføre.

  • Det er ingen treningsfase, men det er bare slutninger.

  • Det krever ikke mye data for å trekke slutninger.

Begrensninger:

– Naive Bayes antar at inngangsvariablene er uavhengige, noe som ikke alltid stemmer.

  • Naive Bayes lider av nullfrekvensproblemet: det er når den tildeler null sannsynlighet til en inngangsvariabel. Dette vil nullstille all den betingede sannsynligheten P(C|x). Et triks for å unngå dette er å bruke en minimal frekvens på 1 ( i stedet for 0 ) til alle variabler.

Trening

Her er datarammen til det samme datasettet som vi har sett i eksemplet.

Din oppgave er å implementere Naive Bayes selv ved å bruke 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

Løsning


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

Karrieretjenester

Contact Section background image

La oss holde kontakten

Code Labs Academy © 2024 Alle rettigheter forbeholdes.