더북(TheBook)

다음은 아이리스 데이터에 대해 rpart( )를 사용해 의사 결정 나무를 작성한 예다.

> install.packages("rpart")
> library(rpart)
> (m <- rpart(Species ~., data=iris))
n= 150

node), split, n, loss, yval, (yprob)
      + denotes terminal node

1) root 150 100 setosa (0.33 0.33 0.33)
  2) Petal.Length< 2.45 50 0 setosa (1.00 0.00 0.00) *
  3) Petal.Length>=2.45 100 50 versicolor (0.00 0.50 0.50)
    6) Petal.Width< 1.75 54 5 versicolor (0.00 0.90 0.09) *
    7) Petal.Width>=1.75 46 1 virginica (0.00 0.02 0.97) *

결과 화면에서 첫 행의 ‘n= 150’은 150개의 데이터가 있었음을 의미한다. 하단에는 의사 결정 나무가 표현되어 있는데, 들여쓰기는 가지가 갈라지는 모양을 뜻한다. *은 잎사귀 노드를 의미한다. 트리의 최상단인 뿌리 노드는 위 결과에 ‘1)’로 표시되어 있다. 각 노드에서 괄호 안에 표시된 세 숫자는 아이리스의 Species별 비율을 의미한다.

‘2)’는 뿌리 노드에서 좌측 가지 밑에 위치한 노드를 뜻한다. 이 가지로 가는 기준은 Petal.Length < 2.45다. 이 기준을 만족하는 경우는 setosa뿐이었고 이 노드에는 총 50개 데이터가 속한다.

좀 더 아래쪽의 ‘6)’은 잎사귀 노드로 Petal.Width < 1.75인 경우 3번 노드에서 좌측으로 갈라지는 가지 밑에 위치한다. 이 노드에서는 54개 데이터가 versicolor로 분류되었다.

모델을 좀 더 쉽게 보려면 plot( )을 사용한다. 다음 코드의 다양한 인자들은 트리가 좀 더 잘 보이게 조절하려고 사용한 것이다. compress는 나무를 좀 더 조밀하게 그린 것이고, margin은 여백, cex는 글자의 크기를 뜻한다. 그림 10-3에 실행 결과를 보였다.

> plot(m, compress=TRUE, margin=.2)
> text(m, cex=1.5)
그림 10-3 아이리스 데이터에 대한 rpart( ) 수행 결과
그림 10-3 아이리스 데이터에 대한 rpart( ) 수행 결과

그림 10-3을 통해 만들어진 트리의 의미를 볼 수는 있지만 그림에서 무언가 부족한 느낌이다. 이를 해결해주는 패키지가 rpart.plot이며, prp( ) 함수를 통해 다양한 시각화를 제공한다. 아래 코드는 prp( )를 사용해 rpart를 시각화한 예로, type=4를 지정해 모든 노드에 레이블을 붙였으며 extra=2를 지정해 각 노드에서의 관측값과 각 노드에서 올바르게 예측된 데이터의 비율을 출력했다. 그림 10-4는 실행 결과를 보여준다.

> install.packages("rpart.plot")
> library(rpart.plot)
> prp(m, type=4, extra=2, digits=3)
그림 10-4 prp( )를 사용한 rpart 시각화
그림 10-4 prp( )를 사용한 rpart 시각화

그림 10-4를 보면 Petal.Length < 2.45인 경우에 붓꽃의 종이 setosa로 예측되며, 이에 해당하는 50개 데이터 모두가 실제로 setosa임을 알 수 있다. 마찬가지로 Petal.Length >= 2.45, Petal.Width < 1.75인 경우 붓꽃의 종이 versicolor로 예측되는데, 이 조건에 해당하는 54개 데이터 중 49개가 실제로 versicolor였음을 알 수 있다.

rpart( )를 사용한 예측 역시 predict( )를 통해 수행한다. 다음은 붓꽃의 종을 type=“class”를 지정해 출력한 예다.

> head(predict(m, newdata=iris, type="class"))
     1      2      3      4      5      6
setosa setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica

지금까지 설명한 내용 외에도 rpart에는 과적합을 피하기 위한 가지치기pruning 함수인 prune.rpart( ), 나무 모델 생성에 대한 다양한 제어를 가능하게 하는 rpart.control( ) 등 다양한 성능 튜닝 함수가 있다. 더 자세한 내용은 CRAN의 rpart 페이지[7]를 참고하기 바란다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.