Naive Bayes Sınıflandırıcı adını İngiliz matematikçi Thomas Bayes’ten alır. Naive Bayes Sınıflandırıcı Örüntü tanıma problemine ilk bakışta oldukça sınırlayıcı görülen bir önerme ile kullanılabilen olasılıkçı bir yaklaşımdır. Bu önerme, örüntü tanıma da kullanılacak her bir tanımlayıcı nitelik ya da parametrenin istatistiksel açıdan bağımsız olması gerekliliğidir. Bu önerme her ne kadar Naive Bayes Sınıflandırıcısının kullanım alanını sınırlasa da, genelde istatistik bağımsızlık koşulu esnetilerek kullanıldığında da daha karmaşık Yapay sinir ağları(YSA) gibi metotlarla karşılaştırabilir sonuçlar vermektedir. Naive Bayes, Veri madenciliğinde en çok kullanılan sınıflandırma tekniklerinden biridir.
Her bir sınıfın tek tek olasılıkları hesaplanmaktadır. Hesaplama sonucu oluşan her bir sınıfın olasılıkları kendi aralarında çarpılır. Bu uygulamada kullanılan veri seti http://archive.ics.uci.edu/ml/datasets/Car+Evaluation adresinden seçilmiştir. «Car Evaluation» veri seti, 4 sınıf etiketinden oluştuğundan, 4 çarpım sonucu arasında karşılaştırma yapılır ve en yüksek seçilir.
Naive Bayes Teoreminin olasılık hesabı;
- P(H|X) = (P(X|H)xP(H))/P(X) şeklinde hesaplanır.
- P(X): Veriler doğrultusunda X olayının olasılık hesabı
- P(H): Hipotezin gerçekleşme olasılığı
- P(X|H): H hipotezi doğrultusunda X’in gerçekleşme olasılığı
Bu uygulamada veriler öncelikle belirtilen siteden text dosyasına, daha sonra programın “Form_Load” kısmından DataGridView’e aktarılmıştır. Ve bu text dosyası projenin “bin” klasörü içerisindeki “debug” klasörü içinde yer almaktadır. “combobox”lardan veriler seçilmektedir. Veriler seçildikten sonra “Tahmin Yap” butonuyla birlikte “P(X|Ci)”, “P(X|Ci)*P(Ci)” değerleri ve sınıf etiketi karşımıza gelmektedir. Hesaplanan “P(X|Ci)*P(Ci)” değerleri, “MaksimumBul” fonksiyonuna gönderilerek en büyük değer bulunup, sınıfı tahmin edilmektedir.
“Car Evaluation” veri setini oluşturan özellikler:
- Buying : Araba ücreti Low(düşük) – Med(orta) – High(yüksek) – Vhigh(çok yüksek) olmak üzere 4 farklı durum ile ifade edilmiştir.
- Maint: Aracın bakım zorluğu Low(düşük) – Med(orta) – High(yüksek) – Vhigh(çok yüksek) olmak üzere 4 farklı durum ile ifade edilmiştir.
- Doors: Aracın kapı sayısı 2 – 3 – 4 – 5more olmak üzere 4 farklı durum ile ifade edilmiştir.
- Persons: Aracın alabileceği insan sayısı 2 – 4 – More olmak üzere 3 farklı durum ile ifade edilmiştir.
- Lug_Boot: Aracın bagaj boyutu Small(küçük) – Med(orta) – Big(büyük) olmak üzere 3 farklı durum ile ifade edilmiştir.
- Safety: Aracın güvenlik seviyesi Low(düşük) – Med(orta) – High(yüksek) olmak üzere 3 farklı durum ile ifade edilmiştir.
- Tag: Tag, sınıf etiketidir. Unacc(kabul edilemez) – Acc(kabul edilebilir) – Good(iyi) – Vgood(çok iyi) olmak üzere 4 farklı durum ile ifade edilmiştir.
Uygulama arayüzü şekildeki gibidir ve kodlar, “region” etiketleri ile açıklanmıştır. Bununla birlikte bazı değerlerin “0” olmaması için özelliklere “+1”, sınıf etiketlerinin toplamına ise “+4” eklenmiştir. Böylelikle bölme işlemlerinde paydanın “0” gelmesi engellenmiştir.
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace NaiveBayes
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.VerilerGrd.DefaultCellStyle.ForeColor = Color.DarkBlue;
this.VerilerGrd.DefaultCellStyle.BackColor = Color.White;
}#region değişkenler
public static double TagUnaccOran, TagAccOran, TagGoodOran, TagVgoodOran;
public static int TagUnaccSayac = 0, TagAccSayac = 0, TagGoodSayac = 0, TagVgoodSayac = 0;
public static int BuyingSayacUnacc = 0, BuyingSayacAcc = 0, BuyingSayacGood = 0, BuyingSayacVgood = 0;
public static int MaintSayacUnacc = 0, MaintSayacAcc = 0, MaintSayacGood = 0, MaintSayacVgood = 0;
public static int DoorsSayacUnacc = 0, DoorsSayacAcc = 0, DoorsSayacGood = 0, DoorsSayacVgood = 0;
public static int PersonsSayacUnacc = 0, PersonsSayacAcc = 0, PersonsSayacGood = 0, PersonsSayacVgood = 0;
public static int Lug_BootSayacUnacc = 0, Lug_BootSayacAcc = 0, Lug_BootSayacGood = 0, Lug_BootSayacVgood = 0;
public static int SafetySayacUnacc = 0, SafetySayacAcc = 0, SafetySayacGood = 0, SafetySayacVgood = 0;
public static double BuyingOranUnacc, BuyingOranAcc, BuyingOranGood, BuyingOranVgood;
public static double MaintOranUnacc, MaintOranAcc, MaintOranGood, MaintOranVgood;
public static double DoorsOranUnacc, DoorsOranAcc, DoorsOranGood, DoorsOranVgood;
public static double PersonsOranUnacc, PersonsOranAcc, PersonsOranGood, PersonsOranVgood;
public static double Lug_BootOranUnacc, Lug_BootOranAcc, Lug_BootOranGood, Lug_BootOranVgood;
public static double SafetyOranUnacc, SafetyOranAcc, SafetyOranGood, SafetyOranVgood;
public static double UnaccCarpim, AccCarpim, GoodCarpim, VgoodCarpim;
public static double SonUnaccCarpim, SonAccCarpim, SonGoodCarpim, SonVgoodCarpim;
#endregion
private void Form1_Load(object sender, EventArgs e)
{
#region text’ten verileri çekme
string[] DataSetText = System.IO.File.ReadAllLines(“DataSet.txt”);
string[] headers = DataSetText[0].Split(‘,’);
DataTable dataTable1 = new DataTable();
foreach (string header in headers)
dataTable1.Columns.Add(header, typeof(string), null);
for (int i = 1; i < DataSetText.Length; i++)
dataTable1.Rows.Add(DataSetText[i].Split(‘,’));
VerilerGrd.DataSource = dataTable1;
this.Controls.Add(VerilerGrd);
#endregion
UnaccSonucLbl.Visible = false;
AccSonucLbl.Visible = false;
GoodSonucLbl.Visible = false;
VgoodSonucLbl.Visible = false;
LblEnBuyuk.Visible = false;
}
private void TahminBtn_Click(object sender, EventArgs e)
{
try
{
#region sıfırlama
TagUnaccOran = 0;
TagUnaccSayac = 0;
TagAccOran = 0;
TagAccSayac = 0;
TagGoodOran = 0;
TagGoodSayac = 0;
TagVgoodOran = 0;
TagVgoodSayac = 0;
BuyingSayacAcc = 0;
BuyingSayacGood = 0;
BuyingSayacVgood = 0;
BuyingSayacUnacc = 0;
BuyingOranAcc = 0;
BuyingOranUnacc = 0;
BuyingOranVgood = 0;
BuyingOranGood = 0;
MaintSayacAcc = 0;
MaintSayacUnacc = 0;
MaintSayacVgood = 0;
MaintSayacGood = 0;
MaintOranAcc = 0;
MaintOranGood = 0;
MaintOranUnacc = 0;
MaintOranVgood = 0;
DoorsOranAcc = 0;
DoorsOranVgood = 0;
DoorsOranUnacc = 0;
DoorsOranGood = 0;
DoorsSayacAcc = 0;
DoorsSayacGood = 0;
DoorsSayacVgood = 0;
DoorsSayacUnacc = 0;
PersonsOranAcc = 0;
PersonsOranGood = 0;
PersonsOranVgood = 0;
PersonsOranUnacc = 0;
PersonsSayacAcc = 0;
PersonsSayacUnacc = 0;
PersonsSayacGood = 0;
PersonsSayacVgood = 0;
Lug_BootOranAcc = 0;
Lug_BootOranGood = 0;
Lug_BootOranUnacc = 0;
Lug_BootOranVgood = 0;
Lug_BootSayacAcc = 0;
Lug_BootSayacGood = 0;
Lug_BootSayacUnacc = 0;
Lug_BootSayacVgood = 0;
SafetyOranAcc = 0;
SafetyOranGood = 0;
SafetyOranUnacc = 0;
SafetyOranVgood = 0;
SafetySayacAcc = 0;
SafetySayacGood = 0;
SafetySayacUnacc = 0;
SafetySayacVgood = 0;
UnaccCarpim = 0;
AccCarpim = 0;
GoodCarpim = 0;
VgoodCarpim = 0;
SonUnaccCarpim = 0;
SonAccCarpim = 0;
SonGoodCarpim = 0;
SonVgoodCarpim = 0;
#endregion
#region sınıf etiketleri olasılığı hesaplama
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[6].Value.ToString() == “unacc”)
TagUnaccSayac++;
}
TagUnaccOran = (double)TagUnaccSayac / ((double)VerilerGrd.RowCount – 1);
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[6].Value.ToString() == “acc”)
TagAccSayac++;
}
TagAccOran = (double)TagAccSayac / ((double)VerilerGrd.RowCount – 1);
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[6].Value.ToString() == “good”)
TagGoodSayac++;
}
TagGoodOran = (double)TagGoodSayac / ((double)VerilerGrd.RowCount – 1);
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[6].Value.ToString() == “vgood”)
TagVgoodSayac++;
}
TagVgoodOran = (double)TagVgoodSayac / ((double)VerilerGrd.RowCount – 1);
#endregion
#region buying etiketleri olasılığı hesaplama
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[0].Value.ToString() == BuyingCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “unacc”)
BuyingSayacUnacc++;
else if (VerilerGrd.Rows[i].Cells[0].Value.ToString() == BuyingCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “acc”)
BuyingSayacAcc++;
else if (VerilerGrd.Rows[i].Cells[0].Value.ToString() == BuyingCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “good”)
BuyingSayacGood++;
else if (VerilerGrd.Rows[i].Cells[0].Value.ToString() == BuyingCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “vgood”)
BuyingSayacVgood++;
}
#endregion
#region maint etiketleri olasılığı hesaplama
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[1].Value.ToString() == MaintCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “unacc”)
MaintSayacUnacc++;
else if (VerilerGrd.Rows[i].Cells[1].Value.ToString() == MaintCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “acc”)
MaintSayacAcc++;
else if (VerilerGrd.Rows[i].Cells[1].Value.ToString() == MaintCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “good”)
MaintSayacGood++;
else if (VerilerGrd.Rows[i].Cells[1].Value.ToString() == MaintCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “vgood”)
MaintSayacVgood++;
}
#endregion
#region doors etiketleri olasılığı hesaplama
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[2].Value.ToString() == DoorsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “unacc”)
DoorsSayacUnacc++;
else if (VerilerGrd.Rows[i].Cells[2].Value.ToString() == DoorsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “acc”)
DoorsSayacAcc++;
else if (VerilerGrd.Rows[i].Cells[2].Value.ToString() == DoorsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “good”)
DoorsSayacGood++;
else if (VerilerGrd.Rows[i].Cells[2].Value.ToString() == DoorsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “vgood”)
DoorsSayacVgood++;
}
#endregion
#region persons etiketleri olasılığı hesaplama
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[3].Value.ToString() == PersonsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “unacc”)
PersonsSayacUnacc++;
else if (VerilerGrd.Rows[i].Cells[3].Value.ToString() == PersonsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “acc”)
PersonsSayacAcc++;
else if (VerilerGrd.Rows[i].Cells[3].Value.ToString() == PersonsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “good”)
PersonsSayacGood++;
else if (VerilerGrd.Rows[i].Cells[3].Value.ToString() == PersonsCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “vgood”)
PersonsSayacVgood++;
}
#endregion
#region lug_boot etiketleri olasılığı hesaplama
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[4].Value.ToString() == Lug_BootCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “unacc”)
Lug_BootSayacUnacc++;
else if (VerilerGrd.Rows[i].Cells[4].Value.ToString() == Lug_BootCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “acc”)
Lug_BootSayacAcc++;
else if (VerilerGrd.Rows[i].Cells[4].Value.ToString() == Lug_BootCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “good”)
Lug_BootSayacGood++;
else if (VerilerGrd.Rows[i].Cells[4].Value.ToString() == Lug_BootCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “vgood”)
Lug_BootSayacVgood++;
}
#endregion
#region safety etiketleri olasılığı hesaplama
for (int i = 0; i < VerilerGrd.RowCount – 1; i++)
{
if (VerilerGrd.Rows[i].Cells[5].Value.ToString() == SafetyCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “unacc”)
SafetySayacUnacc++;
else if (VerilerGrd.Rows[i].Cells[5].Value.ToString() == SafetyCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “acc”)
SafetySayacAcc++;
else if (VerilerGrd.Rows[i].Cells[5].Value.ToString() == SafetyCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “good”)
SafetySayacGood++;
else if (VerilerGrd.Rows[i].Cells[5].Value.ToString() == SafetyCombo.SelectedItem.ToString() && VerilerGrd.Rows[i].Cells[6].Value.ToString() == “vgood”)
SafetySayacVgood++;
}
#endregion
#region tüm sütunların tag’lere göre oranları
BuyingOranUnacc = ((double)BuyingSayacUnacc + 1) / ((double)TagUnaccSayac + 4);
BuyingOranAcc = ((double)BuyingSayacAcc + 1) / ((double)TagAccSayac + 4);
BuyingOranGood = ((double)BuyingSayacGood + 1) / ((double)TagGoodSayac + 4);
BuyingOranVgood = ((double)BuyingSayacVgood + 1) / ((double)TagVgoodSayac + 4);
MaintOranUnacc = ((double)MaintSayacUnacc + 1) / ((double)TagUnaccSayac + 4);
MaintOranAcc = ((double)MaintSayacAcc + 1) / ((double)TagAccSayac + 4);
MaintOranGood = ((double)MaintSayacGood + 1) / ((double)TagGoodSayac + 4);
MaintOranVgood = ((double)MaintSayacVgood + 1) / ((double)TagVgoodSayac + 4);
DoorsOranUnacc = ((double)DoorsSayacUnacc + 1) / ((double)TagUnaccSayac + 4);
DoorsOranAcc = ((double)DoorsSayacAcc + 1) / ((double)TagAccSayac + 4);
DoorsOranGood = ((double)DoorsSayacGood + 1) / ((double)TagGoodSayac + 4);
DoorsOranVgood = ((double)DoorsSayacVgood + 1) / ((double)TagVgoodSayac + 4);
PersonsOranUnacc = ((double)DoorsSayacUnacc + 1) / ((double)TagUnaccSayac + 4);
PersonsOranAcc = ((double)DoorsSayacAcc + 1) / ((double)TagAccSayac + 4);
PersonsOranGood = ((double)DoorsSayacGood + 1) / ((double)TagGoodSayac + 4);
PersonsOranVgood = ((double)DoorsSayacVgood + 1) / ((double)TagVgoodSayac + 4);
Lug_BootOranUnacc = ((double)Lug_BootSayacUnacc + 1) / ((double)TagUnaccSayac + 4);
Lug_BootOranAcc = ((double)Lug_BootSayacAcc + 1) / ((double)TagAccSayac + 4);
Lug_BootOranGood = ((double)Lug_BootSayacGood + 1) / ((double)TagGoodSayac + 4);
Lug_BootOranVgood = ((double)Lug_BootSayacVgood + 1) / ((double)TagVgoodSayac + 4);
SafetyOranUnacc = ((double)SafetySayacUnacc + 1) / ((double)TagUnaccSayac + 4);
SafetyOranAcc = ((double)SafetySayacAcc + 1) / ((double)TagAccSayac + 4);
SafetyOranGood = ((double)SafetySayacGood + 1) / ((double)TagGoodSayac + 4);
SafetyOranVgood = ((double)SafetySayacVgood + 1) / ((double)TagVgoodSayac + 4);
#endregion
#region P(X|Ci)
UnaccCarpim = (BuyingOranUnacc) * (MaintOranUnacc) * (DoorsOranUnacc) * (PersonsOranUnacc) * (Lug_BootOranUnacc) * (SafetyOranUnacc);
PxUnaccLbl.Text = UnaccCarpim.ToString(“F9”);
AccCarpim = (BuyingOranAcc) * (MaintOranAcc) * (DoorsOranAcc) * (PersonsOranAcc) * (Lug_BootOranAcc) * (SafetyOranAcc);
PxAccLbl.Text = AccCarpim.ToString(“F9”);
GoodCarpim = (BuyingOranGood) * (MaintOranGood) * (DoorsOranGood) * (PersonsOranGood) * (Lug_BootOranGood) * (SafetyOranGood);
PxGoodLbl.Text = GoodCarpim.ToString(“F9”);
VgoodCarpim = (BuyingOranVgood) * (MaintOranVgood) * (DoorsOranVgood) * (PersonsOranVgood) * (Lug_BootOranVgood) * (SafetyOranVgood);
PxVgoodLbl.Text = VgoodCarpim.ToString(“F9”);
#endregion
#region P(X|Ci)*P(Ci)
SonUnaccCarpim = (double)UnaccCarpim * (double)TagUnaccOran;
SonAccCarpim = (double)AccCarpim * (double)TagAccOran;
SonGoodCarpim = (double)GoodCarpim * (double)TagGoodOran;
SonVgoodCarpim = (double)VgoodCarpim * (double)TagVgoodOran;
#endregion
double sonuc = MaksimumBul((double)SonUnaccCarpim, (double)SonAccCarpim, (double)SonGoodCarpim, (double)SonVgoodCarpim);
UnaccSonucLbl.Text = SonUnaccCarpim.ToString(“F9”);
AccSonucLbl.Text = SonAccCarpim.ToString(“F9”);
GoodSonucLbl.Text = SonGoodCarpim.ToString(“F9”);
VgoodSonucLbl.Text = SonVgoodCarpim.ToString(“F9”);
UnaccSonucLbl.Visible = true;
AccSonucLbl.Visible = true;
GoodSonucLbl.Visible = true;
VgoodSonucLbl.Visible = true;
LblEnBuyuk.Visible = true;
PxAccLbl.Visible = true;
PxGoodLbl.Visible = true;
PxUnaccLbl.Visible = true;
PxVgoodLbl.Visible = true;
if ((double)sonuc == (double)SonUnaccCarpim)
LblEnBuyuk.Text = “UNACC(Kabul Edilemez)!”;
else if ((double)sonuc == (double)SonAccCarpim)
LblEnBuyuk.Text = “ACC(Kabul edilebilir)!”;
else if ((double)sonuc == (double)SonGoodCarpim)
LblEnBuyuk.Text = “GOOD(İyi)!”;
else if ((double)sonuc == (double)SonVgoodCarpim)
LblEnBuyuk.Text = “VGOOD(Çok İyi)!”;
}
catch (Exception)
{
MessageBox.Show(“Veri seçmediniz!”);
}
}
public double MaksimumBul(double maks
,double SonAccCrpm,double SonGoodCrpm, double SonVgoodCrpm)
{
if ((double)SonAccCrpm > (double)maks)
maks = (double)SonAccCrpm;
if ((double)SonGoodCrpm > (double)maks)
maks = (double)SonGoodCrpm;
if ((double)SonVgoodCrpm > (double)maks)
maks = (double)SonVgoodCrpm;
return (double)maks;
}
}
}
Bilgiler için teşekkürler…