• 의사결정나무란?
  • 모델의 종류
  • R의 tree로 학습한 결과 해석

 

 

(1) 의사결정나무란?

 

머신러닝 기법 중 하나로 대표적인 화이트박스 모델입니다. 그렇기에 분석과정을 직관적으로 이해하기 좋은 모델이죠.

이 기법은 특정변수에 대해 결정규칙을 만들고 나무형태로 분류해나가는 기법을 사용하고 있습니다.

 

모델의 장점은 연산비용이 작다는 것(모델 학습이 빠르다는 것), 수치형, 문자형 변수에 대해 모두 적용이 가능하다는 점 입니다.

 

(2) 모델의 종류

 

통계학을 기반한 카이스퀘어, T검정, F검정 등이 있고, CART와 CHAID알고리즘, 기계학습계열인 ID3, C4.5, C5.0 등이 존재합니다.

이런 모델을 구현한 R 라이브러리는 크게 세가지가 있는데 =>  tree, rpart, party

라이브러리마다 방법론의 차이가 있기때문에 선택을 중요시 해야합니다. 

tree와 rpart는 과적합의 우려가 있지만 연산속도가 빠르고, party같은 경우 과적합의 우려는 없지만 변수 사용개수의 제한(31개)이 있기 때문입니다.

 

  • tree: binary recursive partitioning 
  • rpart: CART(classification and regression tree)
  • party

 

참고 블로그: 

rpubs.com/jmhome/DecisionTree

 

RPubs - R을 사용한 의사결정나무 분석

 

rpubs.com

 

(3) R의 tree로 학습한 결과 해석

 

일단, 우리가 본인이 가진 data의 y변수(종속변수)기준으로 train data롸 test data를 나눠줍니다.

caret에 createDatatPartition함수를 사용해서 index를 무작위추출로 뽑아 준 뒤,

함수 내에 p는 비율을 의미하고, list는 list로 반환할지 말지를 의미합니다. (주로 matrix로 받기 위해 F를 사용한다.)

 

library(caret)

train_idx = createDataPartition(y=data$outcome, p=0.7, list=F)
train = data[train_idx,]
test = data[-train_idx,]

 

그리고 tree모델을 적용할 library를 불러와서, tree모델을 적용해봅니다.

그 후 결과를 plot하는데 이때, plot과 text로 간편히 tree 모델을 시각화 할 수 있습니다.

library(tree)
tree_mod = tree(outcome ~ .,data=train)

plot(tree_mod)
text(tree_mod)

 

 

 

하지만, 앞에서도 언급했듯이 tree 모델은 과적합의 우려가 있어 가지치기 작업(prunning) 이 필요합니다.

 이 작업에서 주로 에러가 많이 나는데,

 

FUN을 사용할때 

error in storage.mode(y) - double 에러가 날 수 있습니다.

이건 tree모델의 output은 수치가 아니라 문자 혹은 categorical형이어야 하는데 수치형이기 때문에 나는 에러이기 때문입니다.

 

prun_cv = cv.tree(tree_mod, FUN = prune.misclass)
plot(prun_cv)

 

아래 plot은 가지치기를 몇개로 하냐에 따라 분산을 보여주는 것인데

대략 4-6사이의 가지가 분산이 가장 낮음으로 나왔습니다.

 

 

이를 선택해주고 다시 모델을 만들면,

tree_prune = prune.misclass(tree_mod,best=5)
plot(tree_prune)
text(tree_prune,pretty=0)

 

 

과적합 오류를 제외하고 모델을 만들었습니다.

 

이제 모델의 결과를 본격적으로 해석해봅시다.

필요한 라이브러리 e1071과 Epi를 불러온다. 그리고 모델의 예측을 수행하고, ROC커브도 그려봅니다.

 

library(e1071)
library(Epi)

tree_pred = predict(prune_tree, test, type='class')
confusionMatrix(tree_pred, test$outcome)

ROC(test=test$outcome, stat=tree_pred, plot='ROC', AUC=T, main='Decision Tree')

 

그 결과 confusionMatrix로 결과를 보여줍니다.

 

 

저는 tree모델만 사용해보았지만, 데이터에 따라 rpart, party의 정확성이 더 높을 수도 있습니다. 

 

 

모델을 사용하면서 개인적으로 겪은 문제

  • Sensitivity, Specificity가 1,0으로 나옴 => 아무리 outcome 데이터 비율이 7:3, 8:2 더라도, 저런 문제를 겪는다면 예측 자체에 문제가 있습니다. 이럴 때, 모델에 변수개수가 너무 적거나 많은건 아닌지 의심을 해보는 것도 좋습니다.

+ Recent posts