19 January 2008

Data Minig :: Classification and Clustering :: Naive Bayes and Decision Tree

1.     Giriş

Bu doküman, bir veri seti üzerinde, classification ve clustering Data Mining algoritmalarını incelemektedir. Naive Bayes ve Decision Tree algoritmalarının tamamen PL/SQL ve Oracle kullanarak nasıl kullanılabilineceğinin bir örneğini içermektedir. Sonuçta bir analiz yapılarak çalışma tamamlanacaktır. 

2.     Veri Seti

Kullanılan veri seti. “Contraceptive Method Choice” olarak belirtilen 1987 yılında “National Indonesia Contraceptive Prevalence Survey” araştırmasında kullanılan verilerin bir alt kümesidir. Bu veri seti ile daha önce “A Comparison of Prediction Accuracy, Complexity, and Training Time of Thirty-three Old and New Classification Algorithms"(Lim, T.-S., Loh, W.-Y. & Shih, Y.-S. (1999)) ile kullanılmıştır.

Araştırma esnasında gebe olan,olmayan veya gebelik durumundan habersiz bayanların bilgileri alınmıştır. Amaçlanan, bayanların sosyoekonomik ve demografik durumlarına göre hangi yöntemi kullanacakları kestirilmeye çalışılmıştır.

Ver, setinde toplam 1473 örnek bulunmaktadır. Toplam özellik sayısı biri sınıf değeri olmak üzere 10’dur. Bunlar:


Özellik Adı
Özellik Tipi
Muhtemel değerler
Kadının yaşı
Sayısal

Kadının eğitim durumu
Kategorik
1(Düşük),2,3,4(Yüksek)
Erkeğin eğitim durumu
Kategorik
1(Düşük),2,3,4(Yüksek)
Çocuk Sayısı
Sayısal

Kadının dini inancı
Kategorik
0(Gayri müslim),1(Müslüman)
Kadının çalışma durumu
Kategorik
0(Evet),1(Hayır)
Erkeğin İşi
Kategorik
1,2,3,4
Hayat standardı
Kategorik
1(Düşük),2,3,4(Yüksek)
Medya korunmasızlığı
Kategorik
0(İyi),1(İyi değil)
Kullanılan yöntem
Sınıf
1,2,3


Herhangi bir özellik için eksik değer bulunmamaktadır.

Veri setinden bir kaç örnek aşağıda belirtilmiştir:

24,2,3,3,1,1,2,3,0,1
45,1,3,10,1,1,3,4,0,1
43,2,3,7,1,1,3,4,0,1

3.     Ön İşleme

Veri seti, her bir örneği bir satırda olacak şekilde tanımlanmıştır. Özellik değerleri arasında “,” ayraç olarak kullanılmıştır.Öncelikle verinin daha kolay işlenebilmesi için bir veritabanı içine aktarılması gereklidir. Kullanılacak  veritabanı olan Oracle’nin araçlarından biri olan SQL*Loader, metin tabanlı verilerin kolaylıkla Oracle içine alınmasını sağlamaktadır.


3.1. Tablo Oluşturma:

Bu iş için öncelikle bir tablo oluşturulmalıdır. Gerekli kısıt ve indexler verilmelidir:

drop table cmc;
create table cmc(
  wife_age number,
  wife_edu varchar2(1),
  husband_edu varchar2(1),
  children number,
  wife_religion varchar2(1),
  is_wife_working varchar2(1),
  husband_occupation varchar2(1),
  living_standart varchar2(1),
  media_exposure varchar2(1),
  contraceptive_method varchar2(1)
);
alter table cmc add constraint ck_wife_edu check ( wife_edu in ('1','2','3','4') );
alter table cmc add constraint ck_husband_edu check (husband_edu in ('1','2','3','4'));
alter table cmc add constraint ck_children check (children > -1 );
alter table cmc add constraint ck_Wife_religion check (Wife_religion  in ('1','0') );
alter table cmc add constraint ck_is_wife_working check (is_wife_working  in ('1','0') );
alter table cmc add constraint ck_husband_occupation check (husband_occupation in ('1','2','3','4'));
alter table cmc add constraint ck_living_standart check (living_standart in ('1','2','3','4'));
alter table cmc add constraint ck_media_exposure check (media_exposure  in ('1','0') );
alter table cmc add constraint ck_contraceptive_method check (contraceptive_method in ('1','2','3'));
create index i_contraceptive_method on cmc(contraceptive_method);


3.2. Veri Yükleme

SQL*Loader a gerekli control dosyası oluşturulmalıdır. Bu dosya içinde veriyi tanıtan bilgiler bulunmaktadır.

LOAD DATA

--Input file name
INFILE 'cmc.data'

--bad records put into
BADFILE  'cmc_bad.dat'

--discarded records put into
DISCARDFILE 'cmc_discarded.dat'

--truncate existing records
TRUNCATE

--add data to table
INTO TABLE cmc

--every column is distinguished by "," caharacter
FIELDS TERMINATED BY ","

--column names
(
  wife_age ,
  wife_edu ,
  husband_edu,
  children ,
  wife_religion ,
  is_wife_working,
  husband_occupation,
  living_standart,
  media_exposure,
  contraceptive_method
)

Hazırlanan bu dosya cmc.ctl adı ile verinin bulunduğu aynı dizine alınmalı ve aşağıdaki bat dosyası komut satırından çağırılmalıdır:

sqlldr userid=hr/hr control=cmc.ctl log=cmc.log

Bu işlem sonucunda veri, Oracle içine yüklenecektir.

Aşağıdaki komut ile veritabanı kontrol edilebilir:

SELECT * FROM cmc;

Veri setinin eğitim ve test amaçlı iki kümeye ayrılması gerelmektedir. Bu bölümleme 2’ye 1 olarak ayrılacaktır.Yani toplam örneklerin %66’sı eğitim amaçlı, %33’ü test amaçlı kullanılacaktır. Bu bölümleme için, aşağıdaki SQL komutlarından yararlanılır:

sqlldr userid=hr/hr control=cmc.ctl log=cmc.log

Bu işlem sonucunda veri, Oracle içine yüklenecektir.

Veri setinin %66’sı eğitim, kalan %33’ü ise test amaçlı kullanılacaktır. Bu işlem için aşağıdaki komutlar çalıştırılmalıdır. Bunun sonucunda cmc_train ve cmc_test adında iki tane tablo oluşacaktır.

create table cmc_train as
 SELECT *
   FROM (SELECT * FROM cmc ORDER BY ROWID ASC)
  WHERE rownum < (SELECT COUNT(*) FROM cmc) * (2 / 3);


create table  cmc_test as
SELECT *
  FROM cmc
 WHERE ROWID NOT IN
       (SELECT *
          FROM (SELECT ROWID FROM cmc ORDER BY ROWID ASC)
         WHERE rownum < (SELECT COUNT(*) FROM cmc) * (2 / 3));

4.     Decision Tree


Karar ağaçları, veri madenciliği uygulamalarında sıkça kullanılan bir yöntemdir. Bu yöntem ile en temelde bir ağaç üretilir. Bu ağaç üzerinde ilerleyerek sınıf hakkında bilgi sahibi olunabilir. Karar ağaçları aynı zamanda veri kümeleri üzerinde kestirim (prediction) yapmaya da imkân verir.
Öncelikle eğitim setimizde bulunan veriler ile bir ağaç oluşturulacaktır. Bunun için:

DECLARE
  w VARCHAR2(1024);
  t VARCHAR2(255);
  c VARCHAR2(255);
  d BOOLEAN;
  l NUMBER;
  a VARCHAR2(1024);
BEGIN
  w := NULL;
  t := 'cmc_train';
  c := 'contraceptive_method';
  d := false;
  l := 0;
  a := ',';

  dm.GenerateDecisionTree(pis_TableName        => t,
                          pis_ClassFieldName   => c,
                          pis_WhereStatement   => w,
                          pin_Level            => l,
                          pis_PassedAttributes => a,
                          pib_IsDebugMode      => d);
END;

Bunun sonucunda elimize içinde kurallar olan bir ağaç çıkacaktır. Bu kuralların bir kısmı:

when
   WIFE_AGE>34 AND CHILDREN>0 AND WIFE_EDU='1' AND HUSBAND_OCCUPATION='4'
then '3'
when
   WIFE_AGE>34 AND CHILDREN>0 AND WIFE_EDU='2' AND HUSBAND_OCCUPATION='4'
then '3'

Bu kuralları test kümemizde işletmeden önce test tablomuza tahmin edeceğimiz sınıf değerini tutması için bir kolon eklenecektir.

alter table cmc_test add expected_dt varchar2(1);

Daha sonra test kümesinde kurallar işletilecektir:

UPDATE cmc_test c
   SET c.expected_dt = (  
      SELECT CASE
             WHEN WIFE_AGE > 34 AND CHILDREN > 0 AND WIFE_EDU = '1' AND
                    HUSBAND_OCCUPATION = '1' AND HUSBAND_EDU = '2' THEN
                '1'
             WHEN ....
                 ......
               ELSE
                '-'
             END
        FROM cmc_test c2
       WHERE c.ROWID = c2.ROWID)

Bulunan sınıf değerleri karşılaştırılınca:


Doğru olarak sınıflanan örnek sayısı: 113
SELECT count(*) FROM cmc_test WHERE expected_dt = contraceptive_method;

Yanlış olarak sınıflanan örnek sayısı: 99
SELECT count(*) FROM cmc_test WHERE expected_dt <> contraceptive_method and expected_dt <> '-';

Sınıflanamayan örnek sayısı:280
SELECT count(*) FROM cmc_test WHERE expected_dt = '-';

Toplam örnek sayısı : 492

Burada bulunan sorun, eğitim setinin iyi seçilemediği yaklaşık veri setinin yaıısından fazlasının sınıflamadığıdır. Bu da başarıyı etkilemektedir. Sınıflanabilen örneklerin %53’ü doğru sınıflanmıştır.

Decision tree ile yapılan işlem, WEKA üzerinde test edilememiştir. ID3’e göre sadece kategorik verlerin, set içinde bulunması zorunluluğundan test etme imkanı olmamıştır.

Veri setinin tamamının eğitim, tamamının da test olarak kullnıldığı durumda ise %100’lük bir başarı sağlanmıştır.


5.     Naive Bayes


Bu algoritma bir takım istatisel bilgilerden yararlanarak, gelen test örneğinin, eğitim sonuncunda elde edilen ön bilgi ile en muhtemel sınıfa atanması işlemidir. Bu işlem için yine Decision tree için kullanılan eğitim ve test örneği kullnılacaktır.

Bu algoritmayı eğitim setinde işletmeden önce test tablomuza tahmin edeceğimiz sınıf değerini tutması için bir kolon eklenecektir.

alter table cmc_test add expected_nb varchar2(1);

Ardından naive bayes algoritması işletilecektir:

BEGIN
  DM.NaiveBayes3('cmc_train',
                 'cmc_test',
                 'contraceptive_method',
                 'EXPECTED_NB',
                 'EXPECTED_DT');
END;

Sonuçlar ise :

Doğru olarak sınıflanan örnek sayısı: 195
SELECT count(*) FROM cmc_test WHERE expected_nb = contraceptive_method;

Yanlış olarak sınıflanan örnek sayısı: 297
SELECT count(*) FROM cmc_test WHERE expected_nb <> contraceptive_method;

Toplam örnek sayısı : 492

Burada elde edilen başarı %40 seviyesindedir. Aynı işlem WEKA içinde bulunan SimpleBayes ile yapıldığında başarının biraz daha fazla olduğu görülmüştür.


6.     Sonuç


Eğitici yöntemler ile yapılan sınıflandırmada en önemli olan nokta eğitim setinin başarılı bir seçilde seçilmesidir. Aksi takdirde test esnasında başarıyı yakalamak güçleşir. Eğitim kümesini seçebilmek için gürültülü verilerin çıkarılması, sayısal verilerin kategorikleştirilmesi ve daha büyük eğitim setleri ile çalışılması başarıyı olumlu yönde etkileyecektir.

Kullanılan CMC veri setinde, örnekler birbirine çok yakın olduğu için başarının yakalanması az olmuştur. Bunun gibi birbirine yakın veri kümeleri ile çalışırken eğitim kümesinin fazla olması, verinin daha iyi temsil edilmesini sağlayacağı için daha iyi sonuçlar çıkaracaktır.

7.     Ekler

No comments: