Introduktion till den naiva Bayes-algoritmen

ML
ML algoritm
klassificering
Introduktion till den naiva Bayes-algoritmen cover image

Tabell:

Intro

Naive Bayes är en klassificeringsalgoritm för maskininlärning som är baserad på Bayes sats. Det är mycket effektivt, särskilt när man hanterar textdata som: Sentimentanalys, skräppostavkänning och textklassificering.

Denna algoritm kallas "Naiv" på grund av antagandet att alla datasetvariabler är oberoende, vilket inte alltid är fallet.

Innan vi går vidare in på att förklara hur Naive bayes fungerar, låt oss se till att vi förstår följande:

Villkorlig sannolikhet

Naiv Bayes-algoritm är baserad på Bayes-satsen som bygger på betingad sannolikhet: det är sannolikheten för att en händelse A inträffar givet att en händelse B redan har inträffat.

Exempel:

Låt oss ha två burkar som innehåller färgade bollar:

  • Burk 1 har 3 blå bollar, 2 röda bollar och 4 gröna bollar.

  • Burk 2 har 1 blå boll, 4 röda bollar och 3 gröna bollar.

Vi vill beräkna sannolikheten för att slumpmässigt välja en blå boll från en av burkarna

equations

Det är inget annat än summan av sannolikheterna för att välja en blå boll från Jar1 eller Jar2.

Nu vill vi beräkna sannolikheten för att välja en blå boll med tanke på att vi valde Jar1:

equations

Slutligen vill vi beräkna sannolikheten för att välja Jar1 givet att vi ritade en blå boll. Här använder vi Bayes teorem som anges som följande:

equations

equations

Naiv Bayes-klassificering

I Naive Bayes klassificerare vill vi hitta den klass som maximerar den villkorade sannolikheten givet ingångsvektorn X; sålunda kan Naive Bayes formuleras på följande sätt:

equations

Med användning av Bayes teorem blir funktionen:

equations

I den här formuleringen är det lätt att beräkna P(Ci) som inte är något annat än sannolikheten för klassen Ci, och det är lätt att beräkna P(x) som är sannolikheten för att händelsen x inträffar.

Det som är svårt att beräkna är P(x|Ci); sannolikheten för händelsen x givet klassen Ci. För att ytterligare förenkla detta måste vi anta att alla indatavariabler är oberoende; så kan vi skriva:

equations

Och det är faktiskt på grund av detta antagande som vi kallar denna klassificerare "Naiv", eftersom vi inte alltid kan garantera indatavariablernas oberoende. Den naiva Bayes-klassificeraren blir:

equations

Faktum är att vi kan förenkla denna formulering ytterligare genom att eliminera P(x), eftersom det är samma för alla klasser:

equations

Låt oss nu ta en titt på ett exempel:

| Väder | Tid | Veckodag | Middag |

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

| Rensa | Kväll | Helg | Kockar |

| Molnigt | Natt | Vardag | Beställningar |

| Regnigt | Natt | Vardag | Beställningar |

| Regnigt | Middag | Vardag | Beställningar |

| Molnigt | Middag | Helg | Kockar |

| Rensa | Natt | Helg | Kockar |

| Snöig | Kväll | Helg | Beställningar |

| Rensa | Natt | Vardag | Kockar |

| Rensa | Midnatt | Helg | Beställningar |

Här har vi en liten datauppsättning som innehåller 3 indatavariabler: väder, tid och veckodag, och en målvariabel: "Middag" som indikerar om en person lagar mat eller beställer sin middag . Vi skulle vilja hitta klassen för ingången x={Clear, Evening, Weekend}:

equations

Vi måste beräkna den villkorade sannolikheten för klassen "Kockar" och klassen "Beställningar" givet ingången x={Clear, Evening, Weekend}. Den förutsagda klassen är den som har den högsta villkorade sannolikheten.

Vi börjar med att beräkna den villkorade sannolikheten för klassen "Kockar":

equations

Nu beräknar vi varje villkorad sannolikhet på egen hand:

Sannolikheten för väder=”Clear” givet att klassen är “Cooks” är antalet rader med väder “Clear” och klass “Cooks” över det totala antalet rader med klassen “Cooks”

equations

Detsamma gäller de andra villkorade sannolikheterna:

equations

Nu för sannolikheten P(Cooks) är det antalet rader med klassen "Cooks" över det totala antalet rader:

equations

Nu beräknar vi produkten av dessa sannolikheter:

equations

Det var för klassen "Kockar", nu måste vi göra samma sak för klassen "Beställningar":

equations

Vi beräknar de individuella sannolikheterna:

equations

Och slutligen beräknar vi produkten av sannolikheterna:

equations

Slutligen tar vi klassen med högst sannolikhet som är klassen "Kockar":

equations

equations

equations

equations

equations

equations

Fördelar och begränsningar med denna algoritm

Fördelar:

– Det är en väldigt snabb klassificerare.

– Det är lätt att genomföra.

– Det finns ingen träningsfas, utan det är bara slutsatser.

– Det krävs inte mycket data för att dra slutsatser.

Begränsningar:

– Naiv Bayes antar att indatavariablerna är oberoende, vilket inte alltid är sant.

  • Naive Bayes lider av nollfrekvensproblemet: det är när den tilldelar noll sannolikhet till en indatavariabel. Detta kommer att nollställa all villkorlig sannolikhet P(C|x). Ett knep för att undvika detta är att använda en minimal frekvens på 1 ( istället för 0 ) för alla variabler.

Träning

Här är dataramen för samma datauppsättning som vi har sett i exemplet.

Din uppgift är att implementera Naive Bayes själv med 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

Karriärtjänster

Contact Section background image

Låt oss hålla kontakten

Code Labs Academy © 2024 Alla rättigheter förbehållna.