Naive Bayes Sınıflandırıcı. C++

    Naive Bayes sınıflandırıcı, Bayes karar teorisine dayanan basit bir olasılıksal sınıflandırıcıdır. Çok fazla teorik bilgiye girmeden, wikipedia üzerinde bayes sınıflandırcının anlatıldığı sayfada yer alan bir örnek için yazdığım uygulamayı paylaşmak istiyorum.Örnek başlığı Sex Classification olarak geçiyor.
    Elimizde 4 erkek, 4 bayana ait veriler var. Bu verilerden her birinin bayana mı ait yoksa erkeğe mi ait olduğunu biliyoruz. Amacımız bu verileri kullanarak bir sınıflandırıcı tasarlamak. Bu sınıflandırıcıyı kullanarak  kime ait olduğunu bilmediğimiz verilerin sahibinin cinsiyetini doğru olarak tahmin edebileceğiz.

    Bu veriler aşağıdaki şekilde verilmiştir;
cinsiyetboy (feet)ağırlık (lbs)ayak boyutu(inch)
erkek618012
erkek5.92 (5'11")19011
erkek5.58 (5'7")17012
erkek5.92 (5'11")16510
bayan51006
bayan5.5 (5'6")1508
bayan5.42 (5'5")1307
bayan5.75 (5'9")1509

    Etiketlerini(cinsiyetleri) bildiğimiz yukarıdaki veriler eğitim kümesi olarak adlandırılır. Gerçek hayat uygulamalarında geliştireceğimiz sınıflandırıcı için, çok büyük veri kümeleri gerekmektedir. Bu yazıda bu veri kümesi anlatımı kolaylaştırmak için seçilmiştir.

    Örneğimizde sınıflandırıcı geliştirirken; boy, ağırlık ve ayak boyutunu özniteliklerinin normal dağılım olarakta bilinen gauss dağılımına(çan eğrisi) uygun olarak dağıldığını varsayıyoruz. Bu varsayım da Bayes sınıflandırıcısının genel bir özelliği değildir. Burada işimizi kolaylaştırmak için bu şekilde bir kabul yaptık. Pek çok gerçek hayat uygulamasında da Bayes sınıflandırıcısı bu şekilde kullanılmaktadır.
Örneğimizde her bir öznitelik için erkek ve bayana ait olasılık dağılım fonksiyonu olarak ayrı bir çan eğrisi fonksiyonu olduğunu düşünüyoruz.

  Bu eğrileri oluşturmabilmek için her bir özniteliğin ortaması ve varyansı gereklidir. Yukarıdaki değerlere göre bu değerleri hesaplarsak aşağıdaki tabloyu elde ediyoruz;


sexortalama (boy)varyans (boy)ortalama (ağırlık)varyans (ağırlık)ortalama (ayak boyutu)varyans (ayak boyutu)
erkek5.8553.5033e-02176.251.2292e+0211.259.1667e-01
bayan5.41759.7225e-02132.55.5833e+027.51.6667e+00

    Yukarıdaki tabloda verilen bu bilgilerle her bir öznitelik için bayana ve erkeğe ait normal dağılım şeklinde olasılık yoğunluk fonksiyonu elde edilmektedir. Elimize   uzunluğu 6 feet, ağırlığı 130 lbs ve ayak boyutu 8 inc olan bir veri gelmiş olsun. Bu verininin sahibinin cinsiyetini tahmin etmek için aşağıdaki gibi bir yol izlenir.

    Her bir sınıf için öncü(prior) olasılık hesaplanır: Eğitim verileri ele alınarak gelecek test verisinin hangi kümeye hangi olasılıkla dahil olabilieceği özniteliklerine hiç bakılmnaksınız hesaplanır.    

                              prior erkek olma olasılığı = eğitim kümesinde erkek sayısı / eğitim kümesindeki tüm sayı

                              prior bayan olma olasılığı = eğitim kümesinde bayan sayısı / eğitim kümesindeki tüm sayı

 Örneğimizde her iki küme(erkek ve bayan) içinde prior olasılık:   4 / 8  = 0.5 dir.

    Daha sonra her bir özniteliğin o özniteliğe ait hesaplanmış olasılık dağılım fonksiyonları kullanılarak her bir sınıfa ait olma olasılı hesaplanır.  Bizim örneğimizde test verisinde ağırlık 130 lbs olarak belirtilmiş. Erkek ve bayan için hesaplanan ağırlık  olasılık yoğunluk fonksiyonlarında130 yerine koyularak 130 lbs ağırlığın % kaç olasılıkla erkek sınıfına ait olabilieceği, % kaç olasılıkla bayan sınıfına ait olacağı hesaplanır. Bu işlem her bir öznitelik için ayrı ayrı yapılır.

    Karar aşamasında ise erkek olma prior olasılığı ile özniteliklerin erkek sınıfına ait olma olasılıkları çarpılır. Bayan içinde aynı işlemler yapılarak posteriorProbabiltyBayan ve posteriorProbabiltyErkek hesaplanır.  Hangi sınıfa ait posterior olasılık daha büyükse örnek bu sınıftan kabul edilir.

          posteriorOlasilikBayan = priorBayanOlasılığı * P(uzunluk|bayan) * P(ağırlık|bayan) * P(ayak      boyutu|bayan)         
          posteriorOlasilikErkek =  priorErkekOlasılığı * P(uzunluk|erkek) * P(ağırlık|erkek) * P(ayak boyutu|erkek)

Wikipedia'dan hesaplanmış değerleri yazarsak;



P(uzunluk|erkek) = 1.5789
P(ağırlık|erkek) = 5.9881e-06
P(ayak bıyutu|erkek) = 1.3112e-3

 posterior numerator (erkek) = 6.1984e-09

P(uzunluk|bayan) = 2.2346e-1
P(ağırlık|bayan) = 1.6789e-2
P(ayak boyutu|bayan) = 2.8669e-1
 posterior numerator (bayan) = 5.3778e-05

   Toplam Posterior olasılık bayan için daha büyük elde edildiğinden test verimiz bayan olarak sınıflandırılır. Aşağıda bahsedilen örneği gerçekleştirmesi için yazdığım  C++  programını bulabilirsiniz.

Native Bayes Sınıflandırıcı örnek kod. (C++)

2 yorum - yorum yaz:

birol kuyumcu dedi ki...

eline sağlık

Adsız dedi ki...

teşekkürler

Yorum Gönder