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.