DBMS_DATA_MINING ile Classification Problemi Çözmek

Herkese Selam,

Bu yazıda Oracle Data Mining ile bir classification 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 parametreler ve spesifik detaylar bulunmakta.

Şimdi bu alt yapının nasıl kullanıldığını görmek için bir örnek yapalım.

Örneği yapabilmek için bir veri setine ihtiyaç duyuyorum. Örneği uygulayacağım veri setini www.kaggle.com üzerinde bulunan veri setlerinden HR_ANALYTICS veri seti üzerinden yapacağım.

Öncelikle HR_ANALYTICS veri setini tanıyalım.

HR_ANALYTICS veri seti 10 (8 numeric, 2 string) kolondan oluşan ve içerisinde 15.000 kayıt bulunduran bir veri seti. HR_ANALYTICS veri setinde bulunan her bir kolonun açıklaması aşağıda verilmiştir.

Column Name Description Data Type
satisfaction_level Level of satisfaction (0-1) Numeric
last_evaluation Time since last performance evaluation (in Years) Numeric
number_project Number of projects completed while at work Numeric
average_montly_hours Average monthly hours at workplace Numeric
time_spend_company Number of years spent in the company Numeric
Work_accident Whether the employee had a workplace accident Numeric
left Whether the employee left the workplace or not (1 or 0) Factor Numeric
promotion_last_5years Whether the employee was promoted in the last five years Numeric
sales Department in which they work for String
salary Relative level of salary (high) String

Kaynak

Evet veri setimiz ile ile ilgili detaylara baktıktan sonra indirdiğimiz veri setini Oracle veritabanımıza yükleyelim.

Öncelikle indirdiğimiz veri setini (.csv) yükleyeceğimiz Oracle tablosunu yaratalım.

CREATE TABLE hr_data
(
   satisfaction_level      NUMBER,
   last_evaluation         NUMBER,
   number_project          NUMBER,
   average_montly_hours    NUMBER,
   time_spend_company      NUMBER,
   Work_accident           NUMBER,
   left                    NUMBER,
   promotion_last_5years   NUMBER,
   sales                   VARCHAR2 (20),
   salary                  VARCHAR2 (20)
);

Tablomuzu yarattık, şimdi .csv olarak indirdiğimiz veri setimizi içeriye yükleyeceğiz, bunu yapmak için birden çok yöntemimiz bulunuyor. Bunlardan bazıları;

  • Oracle External Table yardımı ile yüklemek.
  • Oracle SQL Loader kullanarak yüklemek.
  • Kullandığımız editörlerden faydalanarak yüklemek.

Ben veri setini kullandığım editör yardımı ile yükleyeceğim. Editör olarak Toad kullanmaktayım. Toad ile aşağıdaki yolu takip ederek yükleme işlemini gerçekleştirebilirsiniz.

Database –> Import –> Import Table Data 

Toad ürünü ücretli olduğu için bu editörü kullanıyor olabilirsiniz. Ancak diğer editörlerin de bu özelliği mevcut, diğer editörlerle de bu işlemi kolaylıkla yapabilirsiniz. Örneğin ücretsiz olan Oracle SQL Developer ile veri yüklemesini aşağıdaki gibi yapabilirsiniz.

SELECT * FROM HR_DATA;

Evet veri seti yükleme işlemini tamamladık. Şimdi veriyi hangi kolona göre sınıflandıracağımızı belirleyelim.

Veri setimizi incelediğimizde her bir çalışan ile ilgili bir takım bilgiler var olduğunu görüyoruz. Bu bilgilerin en sonunda ise bu çalışanın maaşı (SALARY) ile ilgili bir bilgi verilmiş (low-medium-high). Biz elimizdeki verinin bir kısmı (training set) ile üreteceğimiz sınıflandırma modeli ile, verinin kalan kısmının (test set) maaş (SALARY) kolonu hakkında bir sınıflandırma sonucu üreteceğiz.  Son olarak ise kurduğumuz model ile ürettiğimiz sonuçlar ile  gerçek sonuçlara bakıp karşılaştıracağız.

Öncelikle verimizi eğitim (training %70) ve test (%30) olarak 2 ayrı kümeye ayıralım.

CREATE TABLE HR_DATA_MAIN AS
SELECT *
  FROM (SELECT ROWNUM RN,
               SATISFACTION_LEVEL,
               LAST_EVALUATION,
               NUMBER_PROJECT,
               AVERAGE_MONTLY_HOURS,
               TIME_SPEND_COMPANY,
               WORK_ACCIDENT,
               LEFT,
               PROMOTION_LAST_5YEARS,
               SALES,
               SALARY
          FROM HR_DATA); 
          
          

CREATE TABLE HR_DATA_TRAINING
AS
   SELECT SATISFACTION_LEVEL,
          LAST_EVALUATION,
          NUMBER_PROJECT,
          AVERAGE_MONTLY_HOURS,
          TIME_SPEND_COMPANY,
          WORK_ACCIDENT,
          LEFT,
          PROMOTION_LAST_5YEARS,
          SALES,
          SALARY
     FROM HR_DATA_MAIN
    WHERE RN < 10500;


CREATE TABLE HR_DATA_TEST
AS
   SELECT SATISFACTION_LEVEL,
          LAST_EVALUATION,
          NUMBER_PROJECT,
          AVERAGE_MONTLY_HOURS,
          TIME_SPEND_COMPANY,
          WORK_ACCIDENT,
          LEFT,
          PROMOTION_LAST_5YEARS,
          SALES,
          SALARY
     FROM HR_DATA_MAIN
    WHERE RN >= 10500; 

Eğitim ve test veri setimizi hazırladık. Şimdi algoritma ayarlarını okuyacağımız tablomuzu oluşturalım ve bu tabloya kullanacağımız algoritma parametrelerini girelim. Algoritmanın çalışması için gerekli tüm parametreleri girmek durumunda değiliz, opsiyonel olan parametreleri tanımlamadığımız takdirde Oracle bu parametreleri sistemde default tanımlı değerleri ile kullanmakta. Aşağıdaki tabloda Decision Tree algoritması için tanımlı parametreleri ve bu parametrelerin default değerlerini bulabilirsiniz.

KAYNAK

CREATE TABLE DTSETTINGS
(
   SETTING_NAME    VARCHAR2 (200),
   SETTING_VALUE   VARCHAR2 (200)
);


BEGIN
INSERT INTO DTSETTINGS
VALUES ('ALGO_NAME', 'ALGO_DECISION_TREE');

INSERT INTO DTSETTINGS
VALUES (dbms_data_mining.tree_impurity_metric, 'TREE_IMPURITY_ENTROPY');

COMMIT;
END;

Veri setimizi eğitim ve test olarak ayırdık, ardından algoritma ayarlarımızı oluşturduk. Şimdi modelimizi oluşturma adımına geçebiliriz.
(Eğitim için ayırdığımız veri setinin bulunduğu tablo adını ve algoritma parametrelerini kullanmak için oluşturduğumuz tablo adını DBMS_DATA_MINING.CREATE_MODEL metoduna parametre olarak gönderiyoruz.)

BEGIN
   DBMS_DATA_MINING.CREATE_MODEL (
      model_name            => 'DT_MODEL',
      mining_function       => DBMS_DATA_MINING.CLASSIFICATION,
      data_table_name       => 'HR_DATA_TRAINING',
      case_id_column_name   => NULL,
      target_column_name    => 'SALARY',
      settings_table_name   => 'DTSETTINGS');
END;

Modelimiz oluştu, şimdi modelimiz ile ilgili oluşan detaylara dictionary’den bakalım.

SELECT MODEL_NAME,
       ALGORITHM,
       COMMENTS,
       CREATION_DATE,
       MINING_FUNCTION,
       MODEL_SIZE
  FROM ALL_MINING_MODELS
 WHERE MODEL_NAME = 'DT_MODEL';

SELECT SETTING_NAME, SETTING_VALUE
FROM ALL_MINING_MODEL_SETTINGS
WHERE MODEL_NAME = 'DT_MODEL';

Modelimiz ile ilgili oluşmuş detayları da gördükten sonra şimdi modelimizi kullanarak test veri setimiz üzerinden prediction yapabiliriz.

SELECT T.SALARY ACTUAL,
 PREDICTION (DT_MODEL USING *) MODEL_PREDICT_RESPONSE,
 PREDICTION_PROBABILITY (DT_MODEL USING *) MODEL_PROBABILTY_RESPONSE
FROM HR_DATA_TEST T;

Evet test veri setimize modelimizi uyguladık ve modelimizin ürettiği tahminleri gözlemledik.

Kurduğumuz modelin başarımını kendimiz hesaplayabileceğimiz gibi DBMS_DATA_MINING.COMPUTE_CONFUSION_MATRIX metodu ile de hesaplayabiliriz.

DBMS_DATA_MINING.COMPUTE_CONFUSION_MATRIX (
      accuracy                     OUT NUMBER,
      apply_result_table_name      IN  VARCHAR2,
      target_table_name            IN  VARCHAR2,
      case_id_column_name          IN  VARCHAR2,
      target_column_name           IN  VARCHAR2,
      confusion_matrix_table_name  IN  VARCHAR2,
      score_column_name            IN  VARCHAR2 DEFAULT 'PREDICTION',
      score_criterion_column_name  IN  VARCHAR2 DEFAULT 'PROBABILITY',
      cost_matrix_table_name       IN  VARCHAR2 DEFAULT NULL,
      apply_result_schema_name     IN  VARCHAR2 DEFAULT NULL,
      target_schema_name           IN  VARCHAR2 DEFAULT NULL,
      cost_matrix_schema_name      IN  VARCHAR2 DEFAULT NULL,
      score_criterion_type         IN  VARCHAR2 DEFAULT 'PROBABILITY');

DBMS_DATA_MINING.COMPUTE_CONFUSION_MATRIX metodunun kullanımına ait detaylı açıklamaları linke tıklayarak ulaşabilirsiniz.

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 )

Google+ photo

You are commenting using your Google+ 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 )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.