Oracle Data Mining (DBMS_DATA_MINING) ile Clustering Problemi Çözmek

Herkese Selam,

Bu yazıda Oracle Data Mining ile bir clustering problemi çözeceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

Veri Bilimi ve Makine Öğrenmesi gibi konular günümüzde hakkında çokça söz ettiren başlıkların başında gelmekte. Öğrenmesi ve uygulaması uzmanlık gerektiren bu başlıklar için adreslenen problemleri ve yöntemleri günümüzde bir çok ürün veya yazılım ile gerçekleyebilmekteyiz. Oracle’da bu başlıklar altındaki problemlerin çözümüne ilişkin yöntem ve algoritmaları DBMS_DATA_MINING paketi ile desteklemekte.

DBMS_DATA_MINING paketi ile Custering, Classification, Regression, Anomaly Detection, Feature Extraction ve Assosication gibi modeller kurup, verimizi bu modellerden geçirip yorumlayabiliyoruz. Bu modellerden elde ettiğimiz sonuçları ise business kurgularımızda input olarak kullanabilmekteyiz.

DBMS_DATA_MINING paketi Oracle veritabanı üzerinde default kurulu olarak gelmiyor. Bu nedenle bu destekten faydalanabilmek için öncelikle bu paketi kurmak gerekiyor. Aşağıdaki linki takip ederek veritabanınıza Oracle Data Mining’ı kurabilirsiniz.

https://docs.oracle.com/cd/E11882_01/datamine.112/e16807/install_odm.htm#DMADM117

Oracle Data Mining paketi kurulumu ile beraber gelen 3 yeni dictionary tablomuz bulunmakta.

SELECT * FROM  ALL_MINING_MODELS;

SELECT * FROM ALL_MINING_MODEL_SETTINGS;

SELECT * FROM ALL_MINING_MODEL_ATTRIBUTES;

ALL_MINING_MODELS tablosunda Oracle’ın bu alt yapı ile bize sunmuş olduğu tüm modeller listesi ve modeller hakkında bilgiler bulunuyor.

ALL_MINING_MODEL_SETTINGS ve ALL_MINING_MODEL_ATTRIBUTES tablolarında ise bu modeller ile ilgili paramtereler ve spesifik detaylar bulunmakta.

Şimdi örnek bir kümeleme problemi çözmek için anlaşılması kolay bir veri seti hazırlayalım.

CREATE TABLE KMEANSDATA
(
   INSTANCE   NUMBER,
   X_AXIS     NUMBER,
   Y_AXIS     NUMBER
);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (1, 3, 5);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (2, 2, 1);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (3, 1, 1);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (4, 4, 3);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (5, 6, 1);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (6, 7, 5);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (7, 4, 4);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (8, 5, 6);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (9, 3, 8);

INSERT INTO KMEANSDATA (INSTANCE, X_AXIS, Y_AXIS)
     VALUES (10, 5, 6);

COMMIT;

Problemin anlaşılması adına basit bir veri seti ürettim. Amacım bu veri seti içerisinde bir birine yakın olanları K-Means algoritması ile kümelemek .

Öncelikle kısaca K-Means algoritması hakkında bilgi vermek istiyorum. K-Means verilen veri seti üzerindeki özelliklere bakarak bir birine benzeyen verileri aynı küme içerisinde toplayarak bize verilen veri setindeki benzerlikleri gösteren bir algoritma. K algoritmanın bir parametresi ve veri setinin kaç kümeye bölüneceğini bize söylüyor.

K-Means algoritmasının detaylı anlatımı için aşağıdaki linkler takip edilebilir.

https://sites.google.com/site/dataclusteringalgorithms/k-means-clustering-algorithm

https://docs.oracle.com/cd/E11882_01/datamine.112/e16808/algo_kmeans.htm#DMCON238

Data setimde toplamda 10 adet kayıt bulunmakta. Ben bu 10 kayıdı 3 farklı kümede toplamak istiyorum bu yüzden K değerimi 3 olarak seçeceğim. İlk olarak algoritmamın default parametre ayarlarına bakıyorum.

SELECT *
  FROM TABLE (DBMS_DATA_MINING.GET_DEFAULT_SETTINGS)
 WHERE setting_name LIKE 'KMNS%' OR setting_name like '%CLUS_NUM_CLUSTERS%';;

Evet default ayarlardan görüleceği üzere algoritmanın default K parametresi (CLUS_NUM_CLUSTERS) 10 olarak ayarlanmış. Bunu kendi problemimi çözmek için 3 olarak ayarlayacağım ve bununiçin yeni bir tablo yaratıyorum ve ilgili parametreyi güncelliyorum.

CREATE TABLE kmeanssettings
AS
   SELECT *
     FROM TABLE (DBMS_DATA_MINING.GET_DEFAULT_SETTINGS)
    WHERE setting_name LIKE 'KMNS%' OR setting_name like '%CLUS_NUM_CLUSTERS%';
    
UPDATE kmeanssettings
   SET setting_value = 3
 WHERE setting_name = 'CLUS_NUM_CLUSTERS';

UPDATE kmeanssettings
   SET setting_value = 10
 WHERE setting_name = 'KMNS_ITERATIONS';

COMMIT;

SELECT * FROM kmeanssettings;

Evet görüldüğü üzere ilgili parametreyi güncelledim. Şimdi bu ayarları kullanarak modelimi oluşturacağım.

 

 

BEGIN
   DBMS_DATA_MINING.CREATE_MODEL (
      model_name            => 'K_MEANNS_MODEL',
      mining_function       => DBMS_DATA_MINING.CLUSTERING,
      data_table_name       => 'KMEANSDATA',
      case_id_column_name   => 'INSTANCE',
      target_column_name    => NULL,
      settings_table_name   => 'KMEANSSETTINGS');
END;

Kodumuz çalıştı ve modelimizi belirlediğimiz güncel ayarlara göre oluşturduk. Şimdi bu modele veri setimizi verelim ve kümeleme sonuçlarını inceleyelim.

BEGIN
   DBMS_DATA_MINING.APPLY (model_name            => 'K_MEANNS_MODEL',
                           data_table_name       => 'KMEANSDATA',
                           case_id_column_name   => 'INSTANCE',
                           result_table_name     => 'KMEANS_RESULT');
END;

Şimdi sonuçlarımızı parametre olarak verdiğimiz tablodan inceleyelim.

SELECT * FROM KMEANS_RESULT;

Sonuç kümemize baktığımızda toplam 30 kayıt görüyoruz. Bunun nedeni, toplam veri setimizde 10 kayıt vardı ve biz algoritmaya küme sayısı olarak 3 değerini verdik. Bu durumda algoritma çıktısında her bir kaydın, farklı her küme için ayrı ayrı olasılığı hesaplandı (3X10 = 30). Bu noktadan sonra tam sonucu görebilmek için her bir elemanının maksimum olasılıklı kaydını bulup listeleyelim.

SELECT t1.instance,
       t1.CLUSTER_ID,
       t1.probability,
       t2.x_axis,
       t2.y_axis
  FROM (SELECT INSTANCE, CLUSTER_ID, PROBABILITY
          FROM (SELECT T.*,
                       MAX (PROBABILITY)
                       OVER (PARTITION BY INSTANCE ORDER BY PROBABILITY DESC)
                          MAXP
                  FROM KMEANS_RESULT T)
         WHERE MAXP = PROBABILITY) t1,
       KMEANSDATA t2
 WHERE t1.instance = t2.instance order by cluster_id;

Veri setimizin 3 farklı kümeye dağıldığını görüyoruz. Son olarak grafik üzerinden son duruma bakalım.

Grafik’ten de anlaşılacağı üzere modelimiz verimizi K-MEANS algoritmasına göre mantıklı bir şekilde kümeledi.

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s