Naif Bayes Sınıflandırıcısı (Naive Bayes)

Yazan : Şadi Evren ŞEKER

Bu yazının amacı, literatürde naif Bayes (Naive Bayes) olarak bilinen algoritmanın, sınıflandırma (classification) için kullanılma şeklini açıklamaktır. Herhangi bir sınıflandırma probleminde olduğu gibi, amacımız birden fazla özelliği taşıyan bir yöney (vektör) kullanarak verilen bilgilerden bir eğitim oluşturmak ve bu eğitim neticesinde gelen yeni verileri doğru bir şekilde sınıflandırmaktır.

Sınıflandırma işlemi sırasında, nasıl bir yol izlendiğini bir örnek üzerinden açıklamaya çalışalım.

Örneğimiz, aşağıda verilen tablodaki verilerden bir sınıflandırıcı eğitimi olsun (train).

Kısım

Maaş

Yaş

İş Tecrübesi

Yazılım

3000

26

4

Muhasebe

1500

22

2

Yazılım

5000

30

9

Muhasebe

2000

30

7

Muhasebe

500

18

3

Yazılım

2000

20

2

Yazılım

7000

29

5

Muhasebe

6000

45

15

Yukarıda, sadece muhasebe ve yazılım kısımlarında çalışan kişilerin maaş, yaş ve iş tecrübelerini içeren temsili bir tablo verilmiştir. Buna göre aşağıdaki şekilde bize bir bilgi verilse:

Maaş : 3000, Yaş : 30, Tecrübe : 5yıl

Bu kişinin hangi kısımda çalıştığını acaba bulabilir miyiz?

Öncelikle eğitim ile işe başlayalım sonra da testimizi yaparız. Basitçe veri kümemizideki (data set) Yazılım ve Muhasebe kısımlarının ortalama ve varyans değerlerini hesaplıyoruz. Bu değerler aşağıdaki şekildedir:

Muhasebe

2500

28,75

6,75

Yazılım

4250

26,25

5

Muhasebe

5833333,333

142,25

34,91666667

Yazılım

4916666,667

20,25

8,666666667

Yukarıdaki ilk iki satır ortalama ve ikinci iki satır ise varyans değerleridir. Bu değerleri basitçe Excel ile hesapladık.

Şimdi beklenen değeri hesaplayacağız. Yani gelen test verimizin Muhasebe kısmında birisine ait olması veya Yazılım kısmından birisine ait olması için beklenen durum hesabı yapacağız.

Hesaplamaya geçmeden önce yazının konusu olan naive bayes kavramını hızlıca açıklayalım. Aslında naive bayes sınıflandırıcısı basiçte bütün koşullu olasılıkların çarpımıdır.

Aşağıdaki şekilde gösterilebilir:

Bu formülde görüleceği üzere s1’den sn’e kadar olan sınıflar arasından bir seçim yapılırken aslında bu sınıfın olasılık değeri ve bu sınıfları yerine getiren k koşulları için çarpımından bir farkı yoktur.

Yani diğer bir deyişle her sınıfın bir koşullu olasılık değeri vardır ve biz sınıflardan hangisine ait olduğunu bulmak için bu koşullu olasılık değerlerini çarparız.

Bu durumda bizim formülümüz aşağıdaki şekildedir denilebilir:

Yani bir kişinin yazılım kısmında olduğunu anlamak için öncelikle yazılım kısmında olan kişilerin oranını buluyoruz, P(Yazılım), ardından yazılım kısmındaki kişiler için verilen maaş, yaş ve iş tecrübesine göre koşullu olasılıklarını bulup bunu normalleştirme değerine bölüyoruz.

Benzer şekilde muhasebe kısmındaki kişilere ait beklenti de aşağıdaki gibi hesaplanabilir

Buradaki fark, verilen bilgilerin muhasebe kısmındaki kişilere göre koşullu olasılığının alınmasıdır.

Normalleştirme değeri ise sistemimizde bulunan bütün ihtimalleri içeren ve beklenti değerlerini normalleştiren değerdir. Aşağıdaki şekilde hesaplanabilir:

normalleştirme = P(Muhasebe) p(maaş | Muhasebe) p (Yaş | Muhasebe) p (iş tecrübesi | Muhasebe) + {P(Yazılım) p(maaş | yazılım) p (Yaş | yazılım) p (iş tecrübesi | yazılım)

Şimdi iki sınıfımız olduğu ve aslında ikisi arasında seçim yapacağımız için, iki sınıfı da bölen ve pozitif çıkmasını beklediğimiz normalleştirme değerini göz ardı edebiliriz.

Sırasıyla olasılıkları hesaplayalım:

P(Yazılım) = 8 kişiden 4’ü yazılım kısmında

P(Yazıılm) = 0.5

Benzer şekilde,

P(Muhasebe) = 0.5

olarak buluruz. Ardından koşullu olasılık değerlerini hesaplayacağız. Bu aşamada gauss dağılımını kullanmak isteyelim (farklı dağılımlar kullanılabilir ve başarı bu dağılıma göre değişebilir) ve dağılım fonksiyonunu hatırlayalım:

varyans, maaş ve ortalama değerlerini yazacak olursak:

Yani sonuç olarak 0.0000000687’e yakın bir değer bulunuyor. Bunun anlamı, verilen 3000 lira maaş ile çalışan kişinin Gauss dağılımında (dağılımın toplam alanının 1 olduğunu hatırlayınız), yazılım kısmında çalışan birisi olması ihtimalinin 6.87E-7 olduğudur. Daha doğru bir ifadeyle, bir kişinin yazılımcı olduğunu kabul edersek (verilen koşul) bu kişinin 3000 lira maaş alma durumunu hesaplamış olduk. Şimdi aynı maaş değerine sahip kişinin muhsabe kısmında çalışma olasılığını hesaplayalım.

Yukarıdaki ikinci hesaplamanın sonucuna bakarak aslında bu maaşın, yazılım kısmındaki kişilere daha uygun olduğunu söyleyebiliriz.

Benzer hesaplamaları diğer koşullu olasılık durumları için de yaparsak aşağıdaki gibi bir tablo elde edebiliriz:

Maaş

Yaş

Tecrübe

Muhasebe

6,84074E-08

0,002805118

0,011414151

Yazılım

8,11614E-08

0,019705849

0,046043474

Sonuçta naive bayes yöntemine göre bu verilen olasılıkların çarpımlarını alacağız:

olduğunu hatırlayalım. Bu durumda beklenti(yazılım) aşağıdaki şekilde yazılabilir:

Burada normalleştirme değeri daha önce de belirtildiği üzere hesaba katılmamıştır. Benzer şekilde muhasebe kısmına ait beklenti de aşağıdaki şekilde hesaplanabilir.

Görüldüğü üzere muhasebe beklentisi, yazılım beklentisinin yaklaşık 20 misli daha yüksek çıkmıştır. Demek ki naive bayes sınıflandırmasına göre bu kişinin muhasebe kısmında çalıştığını söyleyebiliriz, en azından beklentimiz bu yönde olur.

Yorumlar

    1. Şadi Evren ŞEKER

      sanırım bilimsel gösterimi (scientific notation) kast ediyorsunuz. Bu e harfi ingilizce exponential (üssel) kelimesinin baş harfidir ve on üzeri olarak okunmalıdır. Yani mesela E6, anlam olarak on üzeri 6’dır. 2.4E5 ise mesela 2.4 x 10 5 olacak ve normal olarak 240000 şeklinde ikiyüz kırk bin olacaktır. Denklemlerde kullanılan bir gösterim şekli diyebiliriz.

  1. Ugur

    Sadi hocam tekrardan merhaba bir çalışma yapmaktayız veri madenciliği üzerine. Şimdi elimizde her bir örneğe ait şöyle özellikler var

    meslek, evlilik durumu, kampanya kontak süresi(integer), kontak kurulan gün(int), kampanyaya cevap( yes veya no)

    Bunlar sadece bir kısmı attributeların. Meslek ve evlilik durumu string olduğu için bunlar üzerinde gauss dağılımına değilde direk yes no oranına bakıyoruz. örneğin Mühendis mesleğinde toplam kişilerden kampanyaya 10 kişi evet dediyse evet oranı olarak 10/toplam kişi sayısını alıyoruz. Ama kontak süresi ve kontak kurulan gün integer olduğu için bunları sizin anlattığınız yöntemle yani gauss ile hesaplıyoruz yes’e ait sayıları ayrı bir dağılımla no’ya ait sayıları ayrı bir dağılımla ifade edeceğiz sonrada bu oranları çarpacağız. yani p(meslek/evet) * p(evlilik durumu/evet) * p(kontasuresi/evet) * p(kontakkurulangun/evet)
    Son iki olasılık sizin yönteminizle hesaplanmış olacak.
    Umarım derdimi anlatabilmişimdir. Siteniz bana çok yardımcı oluyor. Yöntemim sizce doğrumu ?

    1. Şadi Evren ŞEKER

      Sınıflandırma yöntemi olarak doğru. Ancak, öncelikle verilerinizin gauss dağılımına uygun olup olmadığına bakmak gerekir. Hatta daha önce sizin ne istediğinize bakmak gerekir. Yani bu yöntemi kullanmak istiyorsunuz ama sonuçta çıkmasını beklediğiniz sonuç nedir? Yani mesela sınıflandırma yapmak istiyorsunuz ama hangi alanda sınıflandıracaksınız, sınıf sayınız kaç, bu sınıflara göre kullanacağınız verilerin dağılımı nasıl (mesela dengesiz bir veri kümeniz varsa normalleştirme veya ön işleme gibi bazı adımlar gerekiyor mu). Bütün bunlara bakmak gerekir. Yani probleminizi anlayabildiğim kadarıyla bahsettiğiniz çözüm doğru gözüküyor (belki bir iki ufak farklı alternatif sunulabilir) ama genelde veri madenciliği işleri bir bütün olarak ele alınmalıdır.
      Başarılar

  2. Ugur

    Sadi hocam tekrardan merhaba size anlatmaya çalıştığım şeyi uyguladım açıkcası tam bir hayal kırıklığı yaşadım 🙂 Şimdi verim şöyle birşey resmi açarsanız : http://i.imgur.com/bNdrQjP.jpg
    Şimdi benim anlatmak istediğim şuydu verideki age,balance
    day,duration gibi sayısal örnekler için sizin yukarıda bahsettiğiniz gauss dağılımını uyguladım.

    job ve marital gibi string değerler için ise şöyle yaptım, atıyorum unemployed durumundaki kişi örneği için unemployed olup evet diyen sayısını toplam unemployed sayısına bölerek unemployed olup yes deme olasılığını buldum, aynı işlemi o satıra ait diğer stringler içinde yaptım bunları birbiriyle çarparak stringler için toplam yes ve no olasılığını buldum.

    Bu sonuçlarıda o satıra ait gauss dağılımdan gelen yes, no oranı ile çarpıp toplam yes,no oranını buluyorum. Fakat sonuç tam bi hayal kırıklığı 5400 kişilik test verisinde 12 tane yes oranı buluyor program, oysaki gerçekte 520 tane yes var.

    Ama bu stringler için yaptığımız işlemi çıkartırsak, yanı sizin yukarıda anlattığınız gibi sadece sayısal sütünlarla( sayısal özellikleri kullanarak gauss dağılımı ile) işlem yaptığımızda 480 tane yes oranı tahmin ediyoruz. Gerçeğe oldukça yakın %84 gibi bi başarı oranı oluyor.

    Ne yapmamızı önerirsiniz bu stringler için.

    1. Şadi Evren ŞEKER

      Anlayabildiğim kadarıyla sayısal veriler üzerinden naif bayes uyguladığınızda bir sorununuz yok. Sayısal olmayan verileri sayıya çevirerek uyguladığınızda ise başarı oranınız düşüyor. Bu durumda verilerin sayısallaştırılması sırasında bir hata var gibi duruyor.
      Yazdıklarınızdan anladığım kadarıyla başarıyı “yes oranı” olarak ölçüyorsunuz, bu durumda aslında verileri yes ve no olarak iki sınıfa ayırıyorsunuz diyebiliriz. Yapmanız gereken şey aslında sınıflandırma problemi olarak görerek hiç sayısal veriye dönüştürmeden doğrudan iki sınıfa ayırmaya çalışmak olabilir (tabi anlayabildiğim kadarıyla yazıyorum).

    1. Şadi Evren ŞEKER

      Uğur Bey, yukarıda anlatılan yöntemdeki sınıflandırma metodunu Beklenti(“yes) ve Beklenti(“no”) şeklinde düşünüp probleme uygularsanız çalışacaktır. Hesaplamalar aynı şekilde uygulanabilir (bayes). Şayet isterseniz mail ile verilerinizi ulaştırın sizin için metodu çalıştırıp yollayabilirim veya müsait bir zamanda üniversiteye uğrarsanız yüz yüze konuşup verilerinizi beraber inceler neler yapılabilir bakarız (tek ve en doğru yol naif bayes olmayabilir).

    1. Zafer

      Kısım sutununda yazılım ve muhasebe olmak üzere 2 seçenek var fakat bu 3 seçenek de olabilir mi?(yazılım,muhasebe,pazarlama kısımlar diye 3 kısım örnek olarak)

  3. Taha Ahıskalı

    Merhaba Hocam;

    Videonuzun 12:10’uncu dakikasında zero olma durumunu anlatırken 1003 elemanımız var demişsiniz şöyle dersek arkadaşların aklında soru işareti kalmayacağını umuyorum.

    Bizim income özelliğimiz için 3 ihtimal var (low,medium,high) ve toplam 1000 örneğimiz var. Eğer bunlardan birisinin payı 0 ise (low için verilmiş videoda) biz payı 1 artıyoruz ve bunu her bir örnek (low,medium,high) için yapıyoruz ve paydamız 3 artıyor 1003 olmasının sebebi toplam paydamızın da artması.

    İyi Günler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir