본문 바로가기

IT관련

오라클 머신러닝 - SQL*Plus 에서 수치 예측(Classification, 분류) 실습 예제 - Neural Network 알고리즘

지난번에 IRIS(분꽃) 데이터를 가지고 Random Forest 알고리즘으로 Classification을 하는 실습을 해봤습니다.

 

이번에는 Random Forest 알고리즘 대신에 Neural Network 알고리즘을 이용해서 Classification 을 해보겠습니다.

Neural Network 알고리즘은 Oracle 18c 이상에서 지원합니다. 따라서 아래 테스트를 하려면 18c 이상의 Oracle DB에서 수행해야 에러가 안납니다.

 

이번에 실습할 데이터인 IRIS(분꽃) 데이터 다운로드 및 DB에 넣는 방법은 지난번 실습을 참고하시면 됩니다.

 

그럼, 지난번 Random Forest 에 비해 Neural Network 이 얼마나 더 잘 맞추는 지 확인해보겠습니다.

 

 

1) 세팅 테이블 준비

 

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

 

-- 테이블 생성
create table SETTING_NN (
   setting_name varchar2(30),
   setting_value varchar2(4000)
);

-- 테이블에 데이터 입력
begin
   insert into SETTING_NN values (dbms_data_mining.algo_name, dbms_data_mining.algo_neural_network);
   insert into SETTING_NN values (dbms_data_mining.prep_auto, dbms_data_mining.prep_auto_on);
end;
/

 

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

 

Neural Network 알고리즘에 대한 지식이 있고, 값을 변경하고자 하는 경우 Oracle Data Mining 매뉴얼에 다양한 설정 변수들이 있습니다. 매뉴얼을 참조해서 설정을 변경해주면 되겠습니다.

 

-- 예) NN 알고리즘에서 Hidden Layer 수 변경
insert into SETTING_NN values ('NNET_HIDDEN_LAYERS', 3);

 

 

2) 모델 생성 (학습)

 

DBMS_DATA_MINING 패키지의 Create_Model() 함수를 호출하는 것으로 모델 생성(학습) 작업이 끝납니다.

 

-- 모델 삭제 (기존에 있는 경우)
begin dbms_data_mining.drop_model('NN_MODEL_IRIS');
exception when others then null; end;
/

-- 모델 생성 (학습)
begin
  dbms_data_mining.create_model(
    model_name          => 'NN_MODEL_IRIS',
    mining_function     => dbms_data_mining.classification,
    data_table_name     => 'IRIS',
    case_id_column_name => 'NO',
    target_column_name  => 'SPECIES',
    settings_table_name => 'SETTING_NN'
  );
end;
/

 

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

mining_function         : classification 으로 씁니다.

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

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

                               오라클 테이블 개념에서는 PK 에 해당하는 컬럼입니다.

target_column_name   : 머신러닝의 목표(대상)에 해당하는 컬럼입니다. 여기서는 SPECIES 컬럼.

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

 

 

3) 테스트 (예측)

 

위에서 Create_Model() 함수를 호출함으로써 내부적으로 학습(Learning)이 끝났습니다.

이제, 테스트(예측)만 하면 됩니다.

 

보통 머신러닝을 할때 데이터를 Train 데이터와 Test 데이터로 나눠서 하는데, 저는 이해를 돕기 위해 IRIS 데이터 150건 전체를 가지고 학습을 했습니다.

테스트도 이 150건 똑같은 데이터를 가지고 해보려고 합니다.

 

이런식으로 학습한 데이터를 가지고 예측을 하게되면, 얘가(기계가) 얼마나 똘똘하게 맞추는지 측정하기가 쉽다는 장점이 생깁니다. 우리는 정확한 답을 이미 알고 있기 때문이죠~~ ㅋㅋ

 

오라클에서 머신러닝 학습한 모델로 예측(Predict) 하는 것은 매우 쉽습니다.

아래처럼 predition() 함수를 호출해주면 끝~

 

-- 예측 데이터 조회
select no, species, 
       prediction(NN_MODEL_IRIS using *) predicted_value,
       prediction_probability(NN_MODEL_IRIS using *) probility
from IRIS;

 

위 prediction(NN_MODEL_IRIS using *) 의 의미는 NN_MODEL_IRIS 모델을 사용해서 predict 하라는 의미입니다. 이때 using * 는 모델에서 학습할때 사용한 속성(컬럼)들을 모두 사용하라는 의미 되겠습니다.

 

여기서는 from 절에서 학습한 테이블과 같은 테이블인 IRIS 를 다시 썼는데, 새로운 데이터를 테스트(학습)해 보려면 새로운 테이블로 바꿔주기만 하면 됩니다. 단, 결과값인 species 를 제외한 학습할때 사용한 속성컬럼들이 다 있어야 겠죠~ (NO, SEPAL_LENGTH, ... PETAL_WIDTH)

 

 

실제로는 얼마나 맞췄는지 아래 SQL문으로 확인해 보겠습니다.

 

-- 전체 테스트 데이터중 맞춘 건수, 확률 조회
select total, correct, round(correct / total * 100, 2) as percent
from (
   select count(*) as total, 
          sum(decode(species, predicted_value, 1, 0)) as correct
   from (
      select no, species, 
             prediction(NN_MODEL_IRIS using *) predicted_value,
             prediction_probability(NN_MODEL_IRIS using *) probility
      from IRIS
   )
);

 

와우, 99.33% 가 나왔네요.  지난번에 Random Forest 에서는 96% 였었는데, NN 이 정확도가 더 높네요^^

물론, 이 결과는 IRIS 데이터에 대한 경우일 뿐입니다. 데이터에 따라 적합한 알고리즘은 다 제각각이라고 합니다.

그래서, 달랑 하나의 알고리즘만 돌려보는게 아니라 여러개를 돌려보고 그중에 가장 좋은 것을 취사선택하는 방식으로 사용합니다.

 

참조)  >> 오라클 DBMS 내에서 무료로 제공하는 머신러닝 알고리즘 <<

 

참조)  >> SQL*Plus 에서 수치 예측(Classification, 분류) 실습 예제 - Random Forest 알고리즘 <<

 

참조)  >> 오라클 머신러닝 - SQL*Plus 에서 수치 예측(Regression, 회귀분석) 실습 예제 <<

 

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

 

참조)  >> 오라클 머신러닝 - SQL*Developer (Data Miner) 에서 클러스터링(Clustering) 실습 예제 <<