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
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:
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:
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:
Bayes Teoreminin kullanılmasıyla fonksiyon şu şekilde olur:
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:
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:
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:
Ş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:
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:
Ş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.
Aynı durum diğer koşullu olasılıklar için de geçerlidir:
Ş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:
Şimdi bu olasılıkların çarpımını hesaplıyoruz:
Bu “Aşçılar” sınıfı içindi, şimdi aynısını “Siparişler” sınıfı için de yapmamız gerekiyor:
Bireysel olasılıkları hesaplıyoruz:
Ve son olarak olasılıkların çarpımını hesaplıyoruz:
Son olarak en yüksek olasılığa sahip olan “Aşçılar” sınıfını alıyoruz:
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