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

13 January 2008

How to change start number of an Oracle Sequence

Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.5.0
Connected as sysadm


SQL> create sequence mt_seq
2 start with 1
3 increment by 1;

Sequence created

SQL> select mt_seq.nextval from dual;

NEXTVAL
----------
1

SQL> alter sequence mt_seq start with 1000;

alter sequence mt_seq start with 1000

ORA-02283: cannot alter starting sequence number

SQL> alter sequence increment by 999;

alter sequence increment by 999

ORA-02277: invalid sequence name

SQL> alter sequence mt_seq increment by 999;

Sequence altered

SQL> select mt_seq.nextval from dual;

NEXTVAL
----------
1000

SQL> alter sequence mt_seq increment by 1;

Sequence altered

SQL> select mt_seq.nextval from dual;

NEXTVAL
----------
1001

SQL> ------
SQL>
SQL>
SQL> drop sequence mt_seq;

Sequence dropped

SQL> create sequence mt_seq
2 start with 1000
3 increment by 1;

Sequence created

SQL> select mt_seq.nextval from dual;

NEXTVAL
----------
1000

SQL>

04 January 2008

What Is the Benefits of Data Compression In Datawarehouses and Data Mining?

Veri Sıkıştırma

· Var olan verinin daha az yer kaplayacak şekilde yeniden düzenlenmesidir.
· Zaman ve boyuttan kazanım sağlar. Bu da doğrudan maliyete etki eder.
· İşlemci hızlarının artması sıkıştırma-açma süresini azalttığından, sıkıştırma popülerliğini arttırmıştır.
· Günlük hayatta sıkça kullanılan sıkıştırma programları ( ZIP, RAR ) bu esas ile çalışmaktadır.
· Sıkıştırılacak verinin özelliğine göre kayıplı ve kayıpsız olmak iki şekilde yapılabilir.
· Sıkıştırma-Açma işlemlerinin eşzamanlı çalışabilme özelliğine göre simetrik ve asimetrik olarak sınıflanabilir.
· Günümüzde olgunluğa ermiş birçok yöntem bulunmaktadır. (RLE, JPG, LZ)
· Sıkıştırma, bazı yöntemlerde şifreleme işlemi de yapar. (Ör; Huffman Encoding)
· Sıkıştırma, verinin tipi ve yapısına en uygun yöntemin seçilmesiyle en verimli yapılabilir.

Veri Madenciliği

· Bilginin kimi yöntemler ile analiz edilmesi ve çıkan sonuçların bir uzman gözüyle yorumlanmasıyla geçmiş verilerden gelecek tahminleri yapma işlemi veri madenciliği(data mining) olarak belirtilebilir.
· Veri içerisindeki örüntü bağlantı, değişim, düzensizlik, kural ve istatistiksel olarak önemli olan yapıların keşfedilerek ortaya çıkarılmasıdır.
· Asıl amaç, “veri” den “bilgi” ye ulaşmadır. Bu sayede veriler, değerli hal alır.
· “Çocuk bezi alan müşterilerin %25’i kolonyalı mendil de satın alır.” gibi bağıntılar(sepet analizi), “Zengin bayanlar cip tarzı yerden yüksek arabaları, zengin erkekler ise yere daha yakın arabaları tercih eder” gibi sınıflandırmalar, “Mortgage kredisi alıp da ilk 2 yılda 5 taksitten fazlasını geç ödeyen müşterilerin %30’u krediyi ödeyemiyor” gibi davranışlar Data Mining ile kullanılan yaklaşımlara örnek verilebilir.
· Finans, Haberleşme, Sağlık ve Devlet uygulamalarında kullanım alanları bulunmaktadır.
· Gerçek hayatta Data Mining in kullanım alanım bulduğu örnekler,
· GSM Operatörlerinin sahtecilik(fraud) yapan müşterilerini anında yakalayıp bunu önlemesi
· Bir bankanın, yapacağı kampanyanın olası müşterilerini önceden tahmin edip, reklam faaliyetlerini sadece o müşterilerine yapması.

Veri Ambarı

· Sorgulama amaçlı kullanılan bir ilişkisel veritabanıdır.
· Üzerinde OLTP den daha çok OLAP işlemleri yapılır.
· Birçok farklı veri kaynağından beslenebilir.
· İş kurallarının oluşmasına katkı sağlar.
· Data mining yapılacak veriler burada bulunur.
· Genellikle çok büyük miktarlı verilerden oluşur.
· Genel Özellikleri;
o Konu Odaklı (Ör: Kanser Verileri )
o Bütünleşik( Ör : XML, Flat File ve Veritabanından Alınan Veriler )
o Değişmeyen ( Ör: Update/Delete Yapılmaz )
o Zamana Bağlı ( Ör: Aylık-Günlük Satışlar )

Mining –Warehousing

· Veri ambarlarında bulunan veriler, çok büyük miktarlardadır.
· Bu da veri ambarlarında tutulan verilerde bazı optimizasyonlara gidilmesinin faydalı olacağını ortaya çıkarır.
· Bu sayede veri ambarlarının boyutlarından kaynaklanan depolama, bakım ve risk maliyetleri minimize edilmiş olur.
· Tam bu noktada veri sıkıştırma ile veri ambarcılığı arasındaki ilişki ortaya çıkmış olur.
Bir Örnek
· Büyük bir GSM Operatörünün, müşteri – konuşma özetlerinin bulunduğu bir ambar düşünün.
· Müşteri sayısının 50 milyon, ve her müşterinin günlük 5 konuşma özet bilgisinin olduğunu ve bunun 60 günlük tutulduğunu varsayın.
· Ortalama bir müşteri bilgisinin 2 KB, bir özet bilgisinin de 0.5 KB olduğuna göre toplam veri
50 milyon * ( 2 KB + 60 gün * 5 konuşma * 0.5 KB ) = 50 M * 152 KB = ~7 TB
· Eğer bu veri üzerinde %20 sıkıştırma yapacak bir sıkıştırma Huffman uygulanmış olsaydı bu veri ~1.5 TB ile saklanabilirdi.
Uygulamalardaki Durum
· İlişkisel Veri Tabanı Lideri Oracle, “Table Compression” ile, veri ambarları için kullanılan tablolarda sıkıştırma yapılabilmeyi olanaklı hale getirmiştir.
· Oracle’nin dışında DB2 ve ADABAS da veri sıkıştırmayı mümkün kılmaktadır.

Veri Sıkıştırma, Her Zaman İyi mi?

· Verilerin sıkıştırılarak ambarlarda saklanması, belirli bir sıkıştırma yükünü getirecektir. Bu da saklama işleminin daha uzun sürmesine neden olacaktır.
· Aynı şekilde, bu ambarlardaki veriler üzerinde çalışan raporların, önce eski hale getirilmesinden dolayı bir maliyet oluşturacaktır.
· Bu iki durum göz önüne alınarak sıkıştırma işlemine karar verilmelidir.

Sıkıştırma Algoritmaları Seçimi

· Veri sıkıştırmada kullanılan algoritma ve yöntemlerin, veri ambarlarında kullanılabilmesi için bazı özelliklerin bilinmesi gerekir.
· Örneğin bazı algoritmalar sıkıştırma işleminde uzun zaman alırken, açma işleminde çok kısa zaman almaktadırlar. ( LZ, Canonical Huffman gibi)
· Veri ambarlarında saklanan veriler, eğer üzerinde rapor, analiz, mining gibi işlemler ile kullanılacak ise, belirtilen özelliklerde algoritmaların kullanılması daha verimli olacaktır.
· Eğer sadece arşivleme amaçlı kullanılacak ise, sıkıştırma oranına bakılarak bir seçim yapılmalıdır.

Compression - Mining

· Veri Sıkıştırma, Veri Madenciliğinde “Data Preprocessing” konusu içinde değerlendirilir.
· Sıkıştırılmış bir veri üzerinde mining algoritmalarının çalışabilmesi için, verinin açılmış(decompression) olması gerekir. Sıkıştırılmış veri üzerinde kısıtlı sayıda mining işlemi yapılabilmektedir.
· Sıkıştırmanın, kayıpsız olarak yapılması birçok mining algoritması için gerekli bir şarttır.

Mining - Compression

· Bir başka bakış açısıyla mining, var olan verileri işleyerek bilgi haline getirmesiyle verilerin boyutunu küçülterek özet haline getirmektedir. Buradaki boyut azalımı bir bakıma sıkıştırma olarak değerlendirilebilir.
· Ama mining ile bilgiyi veriye dönüştürme imkanı tam olarak olmadığı için sıkıştırmadan bahsedilmeyebilir. ( Kayıplı sıkıştırma )
· Aynı şekilde Veri Madenciliği ile istenildiği takdirde özellik azaltma yapılabildiğinden, burada da bir sıkıştırmadan bahsedilebilir.
· Veri madenciliği ile oluşturulan cluster, karar ağacı, bağıntı kuralı yapıları ile verinin sıkıştırılmasından söz edilebilir.