Τραπέζι:
Εισαγωγή
Το Naive Bayes είναι ένας αλγόριθμος μηχανικής μάθησης ταξινόμησης που βασίζεται στο θεώρημα Bayes. Είναι πολύ αποτελεσματικό ειδικά όταν ασχολείστε με δεδομένα κειμένου όπως: Ανάλυση συναισθήματος, ανίχνευση ανεπιθύμητων μηνυμάτων και ταξινόμηση κειμένου.
Αυτός ο αλγόριθμος ονομάζεται "Naive" λόγω της υπόθεσης ότι όλες οι μεταβλητές δεδομένων είναι ανεξάρτητες, κάτι που δεν συμβαίνει πάντα.
Πριν προχωρήσουμε περαιτέρω στο να εξηγήσουμε πώς λειτουργεί το Naive bayes, ας βεβαιωθούμε ότι κατανοούμε τα εξής:
Πιθανότητα υπό όρους
Ο αλγόριθμος Naive Bayes βασίζεται στο θεώρημα Bayes, το οποίο βασίζεται στην πιθανότητα υπό όρους: είναι η πιθανότητα εμφάνισης ενός γεγονότος Α, δεδομένου ότι ένα γεγονός Β έχει ήδη συμβεί.
Παράδειγμα:
Ας έχουμε δύο βάζα που περιέχουν χρωματιστές μπάλες:
-
Το βάζο 1 έχει 3 μπλε μπάλες, 2 κόκκινες και 4 πράσινες μπάλες.
-
Το βάζο 2 έχει 1 μπλε μπάλα, 4 κόκκινες και 3 πράσινες μπάλες.
Θέλουμε να υπολογίσουμε την πιθανότητα να επιλέξουμε τυχαία μια μπλε μπάλα από ένα από τα βάζα
Δεν είναι άλλο από το άθροισμα των πιθανοτήτων επιλογής μιας μπλε μπάλας από το Jar1 ή το Jar2.
Τώρα, θέλουμε να υπολογίσουμε την πιθανότητα επιλογής μιας μπλε μπάλας δεδομένου ότι επιλέξαμε το Jar1:
Τέλος, θέλουμε να υπολογίσουμε την πιθανότητα επιλογής Jar1 δεδομένου ότι σχεδιάσαμε μια μπλε μπάλα. Εδώ χρησιμοποιούμε το θεώρημα Bayes που δηλώνεται ως εξής:
Ταξινόμηση Naive Bayes
Στον ταξινομητή Naive Bayes, θέλουμε να βρούμε την κλάση που μεγιστοποιεί την υπό όρους πιθανότητα δεδομένου του διανύσματος εισόδου X. Έτσι, ο Naive Bayes μπορεί να διατυπωθεί ως εξής:
Με τη χρήση του Θεωρήματος Bayes, η συνάρτηση γίνεται:
Σε αυτή τη διατύπωση, είναι εύκολο να υπολογιστεί το P(Ci) που δεν είναι άλλο από την πιθανότητα της κλάσης Ci, και είναι εύκολο να υπολογιστεί το P(x) που είναι η πιθανότητα να συμβεί το γεγονός x.
Αυτό που είναι δύσκολο να υπολογιστεί είναι το P(x|Ci); την πιθανότητα του γεγονότος x δεδομένης της κλάσης Ci. Για να απλοποιηθεί περαιτέρω αυτό, πρέπει να υποθέσουμε ότι όλες οι μεταβλητές εισόδου είναι ανεξάρτητες. έτσι μπορούμε να γράψουμε:
Και είναι στην πραγματικότητα λόγω αυτής της υπόθεσης που ονομάζουμε αυτόν τον ταξινομητή "Αφελής", επειδή δεν μπορούμε πάντα να εγγυηθούμε την ανεξαρτησία των μεταβλητών εισόδου. Ο ταξινομητής Naive Bayes γίνεται:
Στην πραγματικότητα, μπορούμε να απλοποιήσουμε περαιτέρω αυτήν τη διατύπωση εξαλείφοντας το P(x), επειδή είναι το ίδιο για όλες τις κατηγορίες:
Τώρα, ας ρίξουμε μια ματιά σε ένα παράδειγμα:
| Καιρός | Χρόνος | Ημέρα της εβδομάδας | Δείπνο |
| ------- | -------- | --------------- | ------ |
| Καθαρός | Βράδυ | Σαββατοκύριακο | Μάγειρες |
| Συννεφιά | Νύχτα | Καθημερινή | Παραγγελίες |
| Βροχερό | Νύχτα | Καθημερινή | Παραγγελίες |
| Βροχερό | Μεσημέρι | Καθημερινή | Παραγγελίες |
| Συννεφιά | Μεσημέρι | Σαββατοκύριακο | Μάγειρες |
| Καθαρός | Νύχτα | Σαββατοκύριακο | Μάγειρες |
| Χιονισμένο | Βράδυ | Σαββατοκύριακο | Παραγγελίες |
| Καθαρός | Νύχτα | Καθημερινή | Μάγειρες |
| Καθαρός | Μεσάνυχτα | Σαββατοκύριακο | Παραγγελίες |
Εδώ, έχουμε ένα μικρό σύνολο δεδομένων που περιέχει 3 μεταβλητές εισαγωγής: Καιρός, Ώρα και Ημέρα της εβδομάδας και μία μεταβλητή Στόχος: "Δείπνο" που υποδεικνύει εάν ένα άτομο μαγειρεύει ή παραγγέλνει το δείπνο του . Θα θέλαμε να βρούμε την κλάση της εισόδου x={Clear, Evening, Weekend}:
Πρέπει να υπολογίσουμε την υπό όρους πιθανότητα για την κλάση "Μάγειρες" και την κλάση "Παραγγελίες" με την είσοδο x={Καθαρό, Βράδυ, Σαββατοκύριακο}. Η προβλεπόμενη κλάση είναι αυτή που έχει την υψηλότερη υπό όρους πιθανότητα.
Ξεκινάμε υπολογίζοντας την υπό όρους πιθανότητα της κλάσης «Μάγειρες»:
Τώρα υπολογίζουμε κάθε υπό όρους πιθανότητα από μόνη της:
Η πιθανότητα καιρού=”Clear” δεδομένου ότι η κλάση είναι “Cooks” είναι ο αριθμός των γραμμών με καιρό “Clear” και η κατηγορία “Cooks” σε σχέση με τον συνολικό αριθμό των γραμμών με την κατηγορία “Cooks”
Το ίδιο ισχύει και για τις υπόλοιπες πιθανότητες:
Τώρα για την πιθανότητα P(Cooks) είναι ο αριθμός των γραμμών με την κατηγορία "Cooks" σε σχέση με τον συνολικό αριθμό των γραμμών:
Τώρα υπολογίζουμε το γινόμενο αυτών των πιθανοτήτων:
Αυτό ήταν για την τάξη "Μάγειρες", τώρα πρέπει να κάνουμε το ίδιο για την τάξη "Παραγγελίες":
Υπολογίζουμε τις επιμέρους πιθανότητες:
Και τελικά υπολογίζουμε το γινόμενο των πιθανοτήτων:
Τέλος, παίρνουμε την τάξη με την υψηλότερη πιθανότητα που είναι η κλάση «Μάγειρες»:
Πλεονεκτήματα και περιορισμοί αυτού του αλγορίθμου
Φόντα:
-
Είναι ένας πολύ γρήγορος ταξινομητής.
-
Είναι εύκολο να εφαρμοστεί.
-
Δεν υπάρχει προπονητική φάση, αλλά είναι μόνο συμπέρασμα.
-
Δεν απαιτεί πολλά δεδομένα για να βγάλετε συμπεράσματα.
Περιορισμοί:
- Ο Naive Bayes υποθέτει ότι οι μεταβλητές εισόδου είναι ανεξάρτητες, κάτι που δεν είναι πάντα αληθές.
- Ο Naive Bayes πάσχει από το πρόβλημα της μηδενικής συχνότητας: είναι όταν εκχωρεί μηδενική πιθανότητα σε μια μεταβλητή εισόδου. Αυτό θα μηδενίσει όλη την υπό όρους πιθανότητα 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
Master Data Science and AI με τον Code Labs Academy! Εγγραφείτε στο διαδικτυακό μας Bootcamp – Διαθέσιμες ευέλικτες επιλογές μερικής και πλήρους απασχόλησης.