Naïve Bayes Algoritması ve R Uygulaması

tarihinde yayınlandıMachine Learning, R yazılımı, Veri Analizi içinde yayınlandı
Facebooktwittergoogle_plusredditpinterestlinkedinmail

Doç. Dr. Kutlu MERİH

DATALAB

 

Giriş

Naive Bayes Sınıflandırması Eğitimli (Supervised) ML algoritmalarının önde gelenlerindenedir. Hedef değişkeninin kategorik sınıflardan oluştuğu durumlarda kolay anlaşılır ve kolay uygulanır bir opsiyon sunar. Bu algoritma adını 18. yy İngiliz matematikçisi Thomas BAYES’ten ve O nun koşullu olasılıklarla ilgili teoreminden alır. Naïve sıfatı sınıflandırmayı etkileyen değişkenlerin birbirinden bağımsız olduğu kabulune dayanır. Gerçek dünyada pek de geçerli olmayan bu kabul algoritma için sorun oluşturmaz ve beklenmediği kadar etkili çözümler sağlar. Bu etkinliği matematik olarak karmaşık algoritmalarla eş düzeyde gibidir. Naive Bayes modeli, sadeliği, zerafeti ve dayanıklılığı nedeniyle ML analistleri için çekici bir alternatif oluşturur. En eski sınıflandırma algoritmalarından biridir ve en basit haliyle bile şaşırtıcı derecede etkilidir. Metin sınıflandırma ve spam filtreleme gibi alanlarda yaygın olarak kullanılmaktadır.

Koşullu Olasılıklar ve Bayes Teoremi

Naive Bayes tekniğinin adını Thomas BAYES ve O’nun koşullu olasılıklarla ilgili teoreminden aldığını belirtmiştik. Şimdi bu kavramlara kısaca göz atalım.

Koşullu Olaylar

Teorem: A ve B olayları bağımlı olaylar ise, bu iki olayın birlikte gerçekleşme olasılığı genel çarpım kuralı olarak adlandırılan aşağıdaki kurala göre belirlenir.
P(AÇB)=P(B) . P(A/B) burada P(B) >0
P(AÇB)=P(A) . P(B/A) burada P(A) >0
Bu teoreme göre, A ve B olaylarının her ikisinin birden meydana gelme olasılığı, bunlardan birinin meydana gelme olasılığı ile, biri meydana geldikten sonra diğerinin meydana gelme olasılığının çarpımına eşittir. Sol taraflar eşit olduğundan ilerde çok işe yarayacak genel bağıntıyı yazabiliriz.
P(A) . P(B/A) = P(B) . P(A/B)     burada P(A) >0, P(B) >0
Bu ilerde algoritmalarımızı geliştireceğimiz temel bağıntı olacak. Buradan;
P(B/A) = P(B) . P(A/B) / P(A)   veya
P(A/B) =  P(A) . P(B/A) /P(B) .
Yazabiliriz. Bu da Bayes Teoreminin başlangıç noktasıdır.
Olasılıkların Çarpımının Toplanması Kuralı ve Bayes Teoremi
Çoğu zaman son meydana gelen olay, daha önce bazı olayların meydana gelip gelmemesine dayanır. Mesela bir hastanın iyileşmesi olayı, hastalığın doğru teşhisi olayı ve uygun tedavinin tatbiki olayına dayanır. Bir cihazın güvenilir olarak çalışabilir olması, cihazın dizaynından, mamul hale gelene kadar geçirdiği safhaların başarılı bir şekilde neticelendirilmiş olmasına bağlıdır.
Teorem: (Olasılıkların çarpımlarının toplamı) Birbirlerini karşılıklı olarak engelleyen B1, B2,…., Bn olaylarının birleşimi S örnek uzayını teşkil ediyorsa ve bu olaylardan biri mutlaka meydana geliyorsa bu durumda bu olaylar vasıtasıyla meydana gelen herhangi bir A olayının olasılığı şöyle yazılır.
P(A) = P(B1).P(A/B1) + P(B2). P(A/B2) + … + P(Bk).P(A/Bk)
Bunu belirledikten sonra BAYES teoremini yazmak sadece tek adım.
P(Bi/A) = P(Bi).P(A/Bi) / P(A)
P(Bi/A) = P(Bi).P(A/Bi) / P(B1).P(A/B1) + P(B2). P(A/B2) + … + P(Bk).P(A/Bk)

 Bayes Teoremi ile Nedenlerin Olasılığı

Problem: Bir fabrikada yapılan üretimin; %55’i A   %30’u B, %15’i C makinesinde gerçekleştirilmektedir. Bu makinelerin kusurlu oranları sırasıyla %2, %3, %8 şeklindedir. Bu fabrikadaki üretimin kusurlu oranı ne olur?
Çözüm:
P(A) = 0,55   P(K/A) = 0,02
P(B) = 0,30   P(K/B) = 0,03
P(C) = 0,15   P(K/C) = 0,08
P(K ) = P(A) . P(K/A) + P(B) . P(K/B) + P(C) . P(K/C)
P(K) = 0,55 x 0,02+0,3 x0,03 + 0,15×0,08 Þ P(K)= 0,032
Böylece sistemde kusurlu üretim olasılığını belirledik. Şimdi Bayes Teoremi ile kusurla parçanın hangi makineden geldiğine bakalım. Örneğin 2. Makineden gelme olasılığı nedir?
P(B/K) = P(B).P(K/B) / P(K)
P(B/K) = 0.30 * 0.03 / 0.032 =  0.28125
Aynı işlemi diğer makineler için yaparsak;
P(A/K) = P(A).P(K/A) / P(K)
P(A/K) = 0.55 * 0.02 / 0.032 =  0.34375
P(C/K) = P(C).P(K/C) / P(K)
P(C/K) = 0.15 * 0.08 / 0.032 =  0.3750
Bu olasılıkları toplarsak:
P(A/K) + P(B/K) + P(C/K) = 0.28125 + 0.34375 + 0.37500 = 1
Elde ederiz. Yani kusurlu parça mutlaka makinelerin birinden gelecektir.

Naive Bayes Algoritması

Buraya kadarki açıklamalar Karşılıklı Dış (Mutually Exclusive) nedenler ve bu nedenlerin sonucu biro lay olduğunda, olayın gerçekleştiği bilindiğine gore bunun nedenini belirleyen olasılığı bulmaya yönelikti. Naïve Bayes algoritması bunun kontrastıdır. Karşıklı dış yani bağımsız olmayabilen bir X nedenler seti verildiğinde bunun sonucu olabilecek olayın olasılığını tesbit edebilmektir. Burada temel çıkış noktası yine Bayes Teoremidir.
Şimdi böyle bir X nedenler veriseti olsun. Sınıflama (Classification) problemi bir değer takımı verildiğinde bunun nedeni olan sınıfın olasılığını belirlemektir.
P(C|X)  = X olduğuna gore C sınıfının olasılığı;                                    X=<x1,…,xk> is of class C.
Burada temel fikir X setine P(C/X) olasılığı maksimum olan sınıfı tayin etmektir.  Şimdi tekrar Bayes theoremine dönersek:
P(C|X) = P(X|C)·P(C) / P(X)
P(X) bütün sınıflar için aynı olup sadece bir ölçek parametresidir. İhmal edilebilir.
P(C) = C sınıfının sınıflar içindeki bağıl frekansıdır. Bunu da belirlemek kolay.
MAP (maximum posteriori) hypothesis
C seçimi P(C|X) is maximum =
C seçimi P(X|C)·P(C) is maximum olacak şekildedir (MAP kriteri)
Burada problem: P(X|C) hesabı oldukça karmaşık! Bunun yerine X nedenler sınıfı değişkenlerinin bağımsız olduğunu Kabul edebiliriz. Bu Naïve Bayes algoritmasına yol açar. Gerçekçi değildir ama etkilidir.

Naïve Bayesian Classification

Nedenlerin bağımsızlığının Naïve kabulu:
P(x1,…,xk|C) = P(x1|C)·…·P(xk|C)
Şayet i-inci etki kategorik ise;
P(xi|C) C sınıfı içindeki xi lerin bağıl frekansı olarak hesaplanabilir.
Şayet i-inci etki sürekli ise :
P(xi|C) bir  Gauss yoğunluk fonksiyonu (normal dağılım) ile hesaplanır.
Her iki durumda da hesap tekniği oldukça kolaydır.

 

Örnek: Tenis Oynamak

Day  
Outlook
Temperature
Humidity
Wind
Play Tennis
1   
Sunny
Hot
High
Weak
No
2
Sunny
Hot
High
Strong
No
3
Overcast
Hot
High
Weak
Yes
4
Rain
Mild
High
Weak
Yes
5
Rain
Cool
Normal
Weak
Yes
6
Rain
Cool
Normal
Strong
No
7
Overcast
Cool
Normal
Strong
Yes
8
Sunny
Mild
High
Weak
No
9
Sunny
Cool
Normal
Weak
Yes
10
Rain
Mild
Normal
Weak
Yes
11
Sunny
Mild
Normal
Strong
Yes
12
Overcast
Mild
High
Strong
Yes
13
Overcast
Hot
Normal
Weak
Yes
14
Rain
Mild
High
Strong
No
 Bu tablonun verileri R ile datalabtr.com portalinden çekilebilir: 
path<- http://datalabtr.com/wp-content/uploads/2017/03/TENIS.csv
 tenis<-as.data.frame(read.table(path, sep=”;”, dec=”,”, header=TRUE)) 
str(tenis)
 ‘data.frame’:   14 obs. of  5 variables:
 $ Outlook : Factor w/ 3 levels “Overcast”,”Rainy”,..: 2 2 1 3 3 3 1 2 2 3 …
 $ Temp    : Factor w/ 3 levels “Cool”,”Hot”,”Mild”: 2 2 2 3 1 1 1 3 1 3 …
 $ Humidity: Factor w/ 2 levels “High”,”Normal”: 1 1 1 1 2 2 2 1 2 2 …
 $ Windy   : Factor w/ 2 levels “False”,”True”: 1 2 1 1 1 2 2 1 1 1 …
 $ Play    : Factor w/ 2 levels “No”,”Yes”: 1 1 2 2 2 1 2 1 2 2 …
 print(tenis) 
    Outlook Temp Humidity Windy Play
1     Rainy  Hot     High False   No
2     Rainy  Hot     High  True   No
3  Overcast  Hot     High False  Yes
4     Sunny Mild     High False  Yes
5     Sunny Cool   Normal False  Yes
6     Sunny Cool   Normal  True   No
7  Overcast Cool   Normal  True  Yes
8     Rainy Mild     High False   No
9     Rainy Cool   Normal False  Yes
10    Sunny Mild   Normal False  Yes
11    Rainy Mild   Normal  True  Yes
12 Overcast Mild     High  True  Yes
13 Overcast  Hot   Normal False  Yes
14    Sunny Mild     High  True   No 

Şimdi tablodaki verisetini nasıl koşullu olasılıklara çevireceğimizi görelim;

Öğrenme Fazı

Outlook
Play = Yes
Play = No
Sunny
2/9
3/5
Overcast
4/9
0/5
Rain
3/9
2/5
Temparature
Play = Yes
Play = No
Hot
2/9
2/5
Mild
4/9
2/5
Cool
3/9
1/5
Humidity
Play = Yes
Play = No
High
3/9
4/5
Normal
6/9
1/5
Wind
Play = Yes
Play = No
Strong
3/9
3/5
Weak
6/9
2/5
P(Play = Yes) = 9/14
P(Play = No) = 5/14

Karar Fazı : Yeni bir durum verildiğinde sonucun tahmini

Şimdi öğrenme fazındaki tabloları kullanalım
Play = Yes için;
P(Outlook=Sunny|Play=Yes) = 2/9
P(Temperature=Cool|Play=Yes) = 3/9
P(Huminity=High|Play=Yes) = 3/9
P(Wind=Strong|Play=Yes) = 3/9
P(Play=Yes) = 9/14
 
Play = No için;
P(Outlook=Sunny|Play=No) = 3/5
P(Temperature=Cool|Play==No) = 1/5
P(Huminity=High|Play=No) = 4/5
P(Wind=Strong|Play=No) = 3/5
P(Play=No) = 5/14

Şimdi yeni bir durumu test edelim:  

     X =(Outlook=Sunny, Temperature=Cool, Humidity=High, Wind=Strong)
MAP kuralına göre karar verelim
P(Yes|x’) ≈ [P(Sunny|Yes)P(Cool|Yes)P(High|Yes)P(Strong|Yes)]P(Play=Yes) = 0.0053
 P(No|x’) ≈ [P(Sunny|No) P(Cool|No)P(High|No)P(Strong|No)]P(Play=No) = 0.0206
MAP kuralına gore  P(Yes|x’) < P(No|x’) olduğundan karar sınıfı “No”.
Bu örnekte bütün değişkenler kategorikti. Sürekli değişkenler halinde fazla bir sorun olmadan sınıflandırma Normal Dağılım yardımı ile de gerçekleştirilebiliyor.

Buna şimdilik girmeyip aynı problemin R paketleri ile nasıl çözümleneceğine bakalım.

#Bu algoritmanın popular paketi e1071 olarak bilinir
# e1071 Yüklü değilse
# install.packages(“e1071”)
# paketi yükle
library(e1071)
x =c(“Sunny”, “Cool”, “High”, “True”,NA)
tenis<-rbind(tenis,x)
#train model
traindata<-tenis[1:14,]
testdata<-tenis[15,]
m <- naiveBayes(traindata[,1:4], traindata[,5])
#evaluate testdata
pred<-predict(m,testdata[,1:4])
print(pred)
[1] Yes    # Algoritma Yes olarak tahmin etti
Levels: No Yes

 

 

 

Facebooktwittergoogle_plusredditpinterestlinkedinmail