- 의사결정나무란?
- 모델의 종류
- 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
참고 블로그:
(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 더라도, 저런 문제를 겪는다면 예측 자체에 문제가 있습니다. 이럴 때, 모델에 변수개수가 너무 적거나 많은건 아닌지 의심을 해보는 것도 좋습니다.
'데이터분석 > 머신러닝' 카테고리의 다른 글
Tree 모델과 R tree library (0) | 2021.01.27 |
---|---|
Cross-validation (교차검증) (0) | 2021.01.07 |
Multiple linear regression (다중 선형 회귀 모델) (0) | 2020.11.18 |
k-prototype clustering - 비지도학습 (0) | 2020.11.10 |
리얼월드 머신러닝 2장 - 데이터 전처리 (0) | 2019.12.02 |