sade bayes sınıflandırıcısı(naive bayes classifier)

Bayes teoremi olasılıklar hesabında önemli bir yere sahiptir. Bayes teoremine dayanarak sınıflandırma yapmak mümkündür.

Bayes sınıflandırıcıları istatistiksel sınıflandırma teknikleri arasında yer alır. Basit bir olasılıksal sınıflandırıcıdır. Daha detaylı bilgi almak için wikipedia sayfasını ziyaret edebilirsiniz.

Teorik bilgiden ziyade uygulamanın daha akılda kalıcı olacağını düşünüyorum.

Elimizde aşağıdaki tablo gibi bir eğitim kümesi olduğunu varsayalaım. 8 adet adayın eğitim, yaş ve cinsiyet bilgilerine göre kabul edilip edilmedikleri gösterilmiştir. Bizden istenen ise Sade Bayes Sınıflandırıcısı ile eğitim=yüksek, yaş=orta ve cinsiyet=kadın şartlarındaki bir isteğin kabul görüp görmeyeceğine karar verilmesidir.

Başvuru Eğitim Yaş Cinsiyet Kabul
1 orta yaşlı erkek evet
2 ilk genç erkek hayır
3 yüksek orta kadın hayır
4 orta orta erkek evet
5 ilk orta erkek evet
6 yüksek yaşlı kadın evet
7 ilk genç kadın hayır
8 orta orta kadın evet

Bayes sınıflandırması gerçekleştirmek için her bir hipotezin Bayes olasılıkları tek tek hesaplanır.

C1 : KABUL =  EVET
C1 : KABUL = HAYIR

olmak üzere

P(X | C1) * P(C1) ve P(X | C2) * P(C2) ifadelerini hesaplamamız gerekmektedir. İfadelerden büyük olanı örneğin sınıfını verecektir.

a ) P(X | C1) * P(C1) olasılığının hesaplanması

P(X1 | C1) = P(EĞİTİM=YÜKSEK | KABUL=EVET) = 1/5
P(X1 | C1) = P(YAŞ=ORTA | KABUL=EVET) = 3/5
P(X1 | C1) = P(CİNSİYET=KADIN | KABUL=EVET) = 2/5
olduğuna göre;
P(X | C1) = P(X | KABUL=EVET) = 1/5*3/5*2/5 = 6/125
olarak hesaplanır.
P(C1) = P(KABUL = EVET) = 5/8
olduğuna göre;
P(X | C1) * P(C1) = 6/125*5/8 = 0.03
olarak elde edilmiş olur.

b ) P(X | C2) * P(C2) olasılığının hesaplanması

P(X1 | C2) = P(EĞİTİM=YÜKSEK | KABUL=HAYIR) = 1/3
P(X1 | C2) = P(YAŞ=ORTA | KABUL=HAYIR) = 1/3
P(X1 | C2) = P(CİNSİYET=KADIN | KABUL=HAYIR) = 2/3
olduğuna göre;
P(X | C2 = P(X | KABUL=HAYIR) = 1/3*1/3*2/3 = 2/27
olarak hesaplanır.
P(C2) = P(KABUL=HAYIR) = 3/8
olduğuna göre;
P(X | C2) * P(C2) = 2/27 * 3/8 = 0.027
olarak elde edilmiş olur.

c) Sonuç
arg max{ (X | Ci) P(Ci)} = max{0.03, 0.027} = 0.03
Böylece verilen örneğin 0.03 olasılığı ile ilgili olan sınıfa yani EVET sınıfına ailt olduğu anlaşılmaktadır.

Örnek php kodu aşağıdadır:

<?php

/*
create sade-bayes.txt file and paste data list
----------------
orta,yaşlı,erkek,evet
ilk,genç,erkek,hayır
yüksek,orta,kadın,hayır
orta,orta,erkek,evet
ilk,orta,erkek,evet
yüksek,yaşlı,kadın,evet
ilk,genç,kadın,hayır
orta,orta,kadın,evet
*/

class Sade_Bayes {

	public $dataFile = 'sade-bayes.txt';
	private $arrValues = array();
	private $cKabulEvet = 0;
	private $cKabulHayir = 0;
	private $arrArgumans = array('egitim','yas','cinsiyet','kabul');
	private $toplamKayit = 0;
	private $kosulEvet = 0;
	private $kosulHayir = 0;

	function __construct()
	{
		header('Content-Type: text/html; charset=utf-8');
		$this->readDataFile();
	}

	function execute($egitim,$yas,$cinsiyet)
	{
		$this->getKabulOlasilik();
		$this->getOlasilikKabulEvet($egitim,$yas,$cinsiyet);
		$this->getOlasilikKabulHayir($egitim,$yas,$cinsiyet);
		return $this->result();
	}

	private function getOlasilikKabulEvet($egitim,$yas,$cinsiyet)
	{
		$pEgitim = 0;
		$pYas = 0;
		$pCinsiyet = 0;

		foreach ($this->arrValues as $var) {
			if ($var['egitim'] == $egitim && $var['kabul'] == 'evet') $pEgitim++;
			if ($var['yas'] == $yas && $var['kabul'] == 'evet') $pYas++;
			if ($var['cinsiyet'] == $cinsiyet && $var['kabul'] == 'evet') $pCinsiyet++;
		}

		$p1 = $pEgitim/$this->cKabulEvet;
		$p2 = $pYas/$this->cKabulEvet;
		$p3 = $pCinsiyet/$this->cKabulEvet;
		$this->kosulEvet = ($p1*$p2*$p3)*($this->cKabulEvet/$this->toplamKayit);
	}

	private function getOlasilikKabulHayir($egitim,$yas,$cinsiyet)
	{
		$pEgitim = 0;
		$pYas = 0;
		$pCinsiyet = 0;

		foreach ($this->arrValues as $var) {
			if ($var['egitim'] == $egitim && $var['kabul'] == 'hayır') $pEgitim++;
			if ($var['yas'] == $yas && $var['kabul'] == 'hayır') $pYas++;
			if ($var['cinsiyet'] == $cinsiyet && $var['kabul'] == 'hayır') $pCinsiyet++;
		}

		$p1 = $pEgitim/$this->cKabulHayir;
		$p2 = $pYas/$this->cKabulHayir;
		$p3 = $pCinsiyet/$this->cKabulHayir;
		$this->kosulHayir = ($p1*$p2*$p3)*($this->cKabulHayir/$this->toplamKayit);
	}

	private function readDataFile()
	{
		$f = fopen($this->dataFile, "r");

		$i = 0;
		$arrTemp = array();

		while ( $line = fgets($f) ) {

			$arrTemp = explode(',',$line);

			$j = 0;
			foreach ($arrTemp as $var) {
				$indis = $this->arrArgumans[$j];
				$this->arrValues[$i][$indis] = trim($var);
				$j++;
			}

			$i++;
		}

		$this->toplamKayit = $i;
	}

	private function getKabulOlasilik()
	{
		foreach ($this->arrValues as $var) {
			if ($var['kabul'] == 'evet') $this->cKabulEvet++;
			else $this->cKabulHayir++;
		}
	}

	private function result()
	{
		if ($this->kosulEvet > $this->kosulHayir) return 'EVET';
		else return 'HAYIR';
	}

	private function print_pre($data)
	{
		echo "<pre>";
		print_r($data);
		echo "</pre>";
	}
}

$sadeBayes = new Sade_Bayes();
echo $sadeBayes->execute('orta','genç','kadın');
echo "<br>";
echo $sadeBayes->execute('yüksek','orta','kadın');

Not: Uygulama ve anlatımda Dr. Yalçın ÖZKAN'ın Veri Madenciliği Yöntemleri kitabı esas alınmıştır. Hocamıza teşekkür ediyorum.

  1. Yorum yok.

  1. Geri İzleme yok.