Naive Bayes Algoritmasına Giriş

ML
ML algoritması
sınıflandırma
Naive Bayes Algoritmasına Giriş cover image

Masa:

Giriş

Naive Bayes, Bayes teoremini temel alan bir sınıflandırma makine öğrenme algoritmasıdır. Özellikle aşağıdaki gibi metinsel verilerle uğraşırken çok etkilidir: Duygu Analizi, Spam tespiti ve metin sınıflandırması.

Bu algoritmaya, tüm veri kümesi değişkenlerinin bağımsız olduğu varsayımından dolayı "Naif" adı verilir, ancak bu her zaman böyle değildir.

Naive bayes'in nasıl çalıştığını açıklamaya devam etmeden önce aşağıdakileri anladığımızdan emin olalım:

Koşullu olasılık

Naive Bayes algoritması, koşullu olasılığa dayanan Bayes teoremine dayanmaktadır: Bu, bir B olayının halihazırda meydana geldiği göz önüne alındığında, bir A olayının meydana gelme olasılığıdır.

Örnek:

Renkli topların bulunduğu iki kavanozumuz olsun:

  • Kavanoz 1'de 3 mavi top, 2 kırmızı top ve 4 yeşil top bulunur.

  • Kavanoz 2'de 1 mavi top, 4 kırmızı top ve 3 yeşil top bulunur.

Kavanozlardan birinden rastgele mavi bir top seçme olasılığını hesaplamak istiyoruz

equations

Bu, Kavanoz1 veya Kavanoz2'den mavi top seçme olasılıklarının toplamından başka bir şey değildir.

Şimdi Jar1'i seçtiğimize göre mavi top seçme olasılığını hesaplamak istiyoruz:

equations

Son olarak mavi bir top çektiğimize göre Jar1'i seçme olasılığını hesaplamak istiyoruz. Burada aşağıdaki şekilde ifade edilen Bayes Teoremini kullanıyoruz:

equations

equations

Naive Bayes sınıflandırması

Naive Bayes sınıflandırıcısında, X giriş vektörü verildiğinde koşullu olasılığı maksimuma çıkaran sınıfı bulmak istiyoruz; dolayısıyla Naive Bayes aşağıdaki gibi formüle edilebilir:

equations

Bayes Teoreminin kullanılmasıyla fonksiyon şu şekilde olur:

equations

Bu formülasyonda Ci sınıfının olasılığından başka bir şey olmayan P(Ci)’yi hesaplamak, x olayının gerçekleşme olasılığı olan P(x)’i hesaplamak kolaydır.

Hesaplanması zor olan P(x|Ci); Ci sınıfına göre x olayının olasılığı. Bunu daha da basitleştirmek için tüm girdi değişkenlerinin bağımsız olduğunu varsaymamız gerekir; böylece şunu yazabiliriz:

equations

Ve aslında bu varsayımdan dolayı bu sınıflandırıcıyı "Naif" olarak adlandırıyoruz çünkü girdi değişkenlerinin bağımsızlığını her zaman garanti edemeyiz. Naive Bayes sınıflandırıcısı şöyle olur:

equations

Aslında P(x)'i ortadan kaldırarak bu formülasyonu daha da basitleştirebiliriz çünkü bu tüm sınıflar için aynıdır:

equations

Şimdi bir örneğe bakalım:

| Hava Durumu | Zaman | Haftanın günü | Akşam Yemeği |

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

| Temizle | Akşam | Hafta Sonu | Aşçılar |

| Bulutlu | Gece | Hafta içi | Siparişler |

| Yağmurlu | Gece | Hafta içi | Siparişler |

| Yağmurlu | öğlen | Hafta içi | Siparişler |

| Bulutlu | öğlen | Hafta Sonu | Aşçılar |

| Temizle | Gece | Hafta Sonu | Aşçılar |

| Karlı | Akşam | Hafta Sonu | Siparişler |

| Temizle | Gece | Hafta içi | Aşçılar |

| Temizle | Gece yarısı | Hafta Sonu | Siparişler |

Burada, 3 giriş değişkeni içeren küçük bir veri kümemiz var: Hava Durumu, Saat ve Haftanın Günü ve bir Hedef değişkeni: Bir kişinin akşam yemeğini pişirip pişirmediğini veya sipariş edip etmediğini gösteren "Akşam Yemeği". x={Clear, Evening, Weekend} girişinin sınıfını bulmak istiyoruz:

equations

x={Clear, Evening, Weekend} girdisi verildiğinde “Aşçılar” sınıfı ve “Siparişler” sınıfı için koşullu olasılığı hesaplamamız gerekir. Tahmin edilen sınıf, en yüksek koşullu olasılığa sahip olan sınıftır.

“Aşçılar” sınıfının koşullu olasılığını hesaplayarak başlıyoruz:

equations

Şimdi her koşullu olasılığı kendi başına hesaplıyoruz:

Sınıfın “Aşçılar” olduğu göz önüne alındığında, hava durumu = “Temiz” olasılığı, “Aşçılar” sınıfına sahip toplam satır sayısı üzerinden hava durumu “Açık” ve “Aşçılar” sınıfına sahip satırların sayısıdır.

equations

Aynı durum diğer koşullu olasılıklar için de geçerlidir:

equations

Şimdi P(Aşçılar) olasılığı için, toplam satır sayısına göre “Aşçılar” sınıfına sahip satır sayısıdır:

equations

Şimdi bu olasılıkların çarpımını hesaplıyoruz:

equations

Bu “Aşçılar” sınıfı içindi, şimdi aynısını “Siparişler” sınıfı için de yapmamız gerekiyor:

equations

Bireysel olasılıkları hesaplıyoruz:

equations

Ve son olarak olasılıkların çarpımını hesaplıyoruz:

equations

Son olarak en yüksek olasılığa sahip olan “Aşçılar” sınıfını alıyoruz:

equations

equations

equations

equations

equations

equations

Bu algoritmanın avantajları ve sınırlamaları

Avantajları:

  • Çok hızlı bir sınıflandırıcıdır.

  • Uygulaması kolaydır.

  • Eğitim aşaması yoktur, yalnızca çıkarımdır.

  • Çıkarım yapabilmek için çok fazla veriye ihtiyaç duyulmaz.

Sınırlamalar:

  • Naive Bayes, girdi değişkenlerinin bağımsız olduğunu varsayar ki bu her zaman doğru değildir.

  • Naive Bayes sıfır frekans probleminden muzdarip: bu, bir giriş değişkenine sıfır olasılık atadığı zamandır. Bu, tüm koşullu olasılık P(C|x)'i sıfırlayacaktır. Bunu önlemenin bir yolu, tüm değişkenlere minimum 1 frekansı (0 yerine) kullanmaktır.

Egzersiz

Örnekte gördüğümüz aynı veri kümesinin veri çerçevesi buradadır.

Göreviniz Naive Bayes'i python kullanarak kendiniz uygulamak:

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

Çözüm


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

Kariyer Hizmetleri

Contact Section background image

İletişimde kalalım

Code Labs Academy © 2024 Her hakkı saklıdır.