본문 바로가기

IT관련

오라클 머신러닝 - SQL*Plus 에서 클러스터링(Clustering) 실습 예제

Oracle DBMS 내부에 Machine Learning 관련 모듈들이 들어있습니다. 그리고 무료로 제공됩니다.

제공되는 머신러닝 알고리즘은 여길 참고하세요. ==>  >>오라클 DBMS 내에서 무료로 제공하는 머신러닝 알고리즘<<

 

오라클에서 제공되는 머신러닝 기법중에서 클러스터링(Clustering)을 해보겠습니다.

클러스터링은 수학적인 알고리즘(머신러닝 알고리즘)으로 데이터를 자동으로 분류해주는 기법을 말합니다.

데이터에 들어있는 여러가지 속성들을 파악해서 최대한 속성차이가 많이 나도록 분류해주는 게 관건입니다.

 

아래에 테스트에 사용할 데이터를 첨부합니다.

SQL*Developer 에서 아래 파일을 똑같은 이름(CUST_SIMP_TABLE)의 테이블로 Import 합니다.

 

CUST_SIMP_TABLE.csv
0.41MB

 

SQL*Developer 에서 파일을 Import 하는 방법은 여길 참조하세요.

              ==>  >>SQL*Developer 에서 테이블 Import/Export 하는 방법<<

 

 

총 9개의 컬럼, 4500건의 레코드로 되어있습니다.

SQL*Developer 에서 Import 한 후에 Refresh 해서 CUST_SIMP_TABLE 이 잘 들어갔는지 확인합니다.

 

 

CUST_SIMP_TABLE 테이블 9개의 컬럼중에서 CUST_ID (고객ID)를 제외한 나머지 8개가 이 고객의 속성(Attribute)에 해당합니다. 이 8개의 속성의 차이를 가지고 4500건의 데이터를 Clustering 하는 것입니다.

 

1) 세팅 테이블 준비

 

첫번째 단계는 세팅 테이블을 준비하는 것입니다. 어떤 알고리즘을 쓸 것인지, 알고리즘에 사용될 변수들은 어떻게 세팅할 것인지를 지정합니다.

 

CREATE TABLE model_cluster_2_settings (
   setting_name  VARCHAR2(30),
   setting_value VARCHAR2(4000));

 

Oracle 에서 지원하는 클러스터링 알고리즘은 3가지가 있습니다. Expectation Maximization, K-Means, O-Cluster

이중에서 아래는 K-Means 를 사용했습니다.

다른 알고리즘을 사용하려면, 알고리즘만 바꿔주면 됩니다. (algo_kmeans -> algo_expectation_maximization)

 

BEGIN       
   INSERT INTO model_cluster_2_settings (setting_name, setting_value) VALUES
   (dbms_data_mining.algo_name, dbms_data_mining.algo_kmeans);

   INSERT INTO model_cluster_2_settings (setting_name, setting_value) VALUES 
   (dbms_data_mining.prep_auto, dbms_data_mining.prep_auto_on);

   INSERT INTO model_cluster_2_settings (setting_name, setting_value) VALUES 
   (dbms_data_mining.clus_num_clusters, 5);
END;
/

 

알고리즘별로 세팅해주는 변수값들이 다 다르고 복잡합니다. 이건 알고리즘에 대한 기본지식이 있어야 설정이 가능합니다. 잘 모르는 경우는 디폴트로 자동으로 세팅하는 방법이 있습니다. 그게 바로 prep_auto_on 입니다.

이게 있어서 k-Means 알고리즘에 대한 지식없이도 누구나 쉽게 머신러닝이 가능합니다.^^

클러스터 갯수는 5개로 지정했습니다. 10개로 분류하고 싶으면 이 값을 바꿔주면 됩니다.

 

 

2) 모델 생성 및 클러스터링

 

DBMS_DATA_MINING 패키지의 Create_Model() 함수를 호출하는 것으로 모델 생성/클러스터링 작업이 끝납니다.

 

BEGIN
  DBMS_DATA_MINING.CREATE_MODEL(
    model_name          => 'Model_Cluster_2',
    mining_function     => dbms_data_mining.clustering,
    data_table_name     => 'CUST_SIMP_TABLE',
    case_id_column_name => 'cust_id',
    settings_table_name => 'model_cluster_2_settings');
END;
/

 

model_name             : 적절한 이름으로 작명하면 됩니다.

mining_function         : 클러스터링이니까 clustering 으로..

data_table_name        : 데이터는 위에서 Import 한 테이블 CUST_SIMP_TABLE 입니다.

case_id_column_name : 머신러닝을 할때 테스트 데이터 한건한건을 구분하는 컬럼을 case_id 라고 합니다.

                               여기서는 데이터가 고객정보이므로 당연히 cust_id 컬럼이 되겠슴다.

settings_table_name   : 앞에서 생성한 세팅 테이블

 

 

3) 클러스터링된 정보 확인

 

뭐 별로 한건 없지만, 클러스터링이 끝났습니다. 이제 결과정보를 확인해보겠습니다.

 

SELECT CLUSTER_ID(Model_Cluster_2 USING *) AS clus, COUNT(*) AS cnt 
  FROM CUST_SIMP_TABLE
GROUP BY CLUSTER_ID(Model_Cluster_2 USING *)
ORDER BY cnt DESC;

 

위 SQL문을 실행하면, 아래와 같이 총 5개의 클러스터로 분류해서 결과를 출력합니다.

 

 

클러스터 번호가 1번부터 시작하지 않는 것은 실제 클러스터링을 하기 위해 내부적으로 트리(Tree)형태의 맵을 만드는데, 1번부터 트리가 만들어져 내려오면서 맨 마지막 Leaf 노드들만 5개 가져오기 때문입니다.

 

SELECT cust_id, CLUSTER_ID(Model_Cluster_2 USING *) AS clus
  FROM CUST_SIMP_TABLE;

 

위 SQL문을 실행해서 전체 4500건 데이터에 대해 분류된 Cluster ID 를 조회할 수 있습니다.

 

 

일단, 여기까지 아주 간단하게 Oracle DB내에서 SQL만으로 클러스터링을 어떻게 하는지 살펴봤습니다.

 

단순히 클러스터링만 하는 것이 아니라, 이렇게 클러스터링을 할때 중요하게 영향을 미쳤던 속성은 무엇이었는지 등의 정보도 조회할 수 있습니다. 

 

 

앞에서 Create_Model() 함수를 실행할 때, 모델과 관련된 뷰들을 함께 생성합니다.

여기에는 어떤 속성들이 영향을 미쳐서 이렇게 클러스터링을 하게 되었는지 등의 정보들이 들어있습니다.