본문 바로가기
공부/R & Python

12-1. 의사결정나무와 랜덤 포레스트-의사결정나무 (Decision Tree) 1

by 드인 2020. 3. 4.

12. 의사결정나무와 랜덤 포레스트

12-1. 의사결정나무 (Decision Tree) 1


1) 의사결정나무 (Decision Tree)

- 의사결정나무 (Decision Tree)

기계학습 중 하나로 의사결정 규칙을 나무 형태로 분류해나가는 분석 기법

분석에 있어 가장 중요한 변수가 먼저 선택됨(root node)

분류 기준값은 분순률을 최소화하도록 정해짐

 

- 분석 과정이 직관적이고 이해하기 쉬움

- 연속성/범주형 변수를 모두 사용할 수 있음

- 분지규칙은 불순도를 최소화 시킴

                 범주들이 섞여있는 정도

 

Step 1 : tree 형성 (Growing tree)          -> 과적합 문제

Step 2 : tree 가지치기 (pruning tree)

Step 3 : 최적 tree로 분류 (classification)

 

- 의사결정나무 실행 패키지 : tree (그 외 repart, party 패키지)

install.packages("tree")
library(tree)

library(caret)

caret 라이브러리 설정 : 오분류율 교차표(confusion matrix) 생성을 위한 패키지

 

- iris 데이터 (iris.csv)

- iris 데이터 (학습데이터와 검증데이터의 분할)

set.seed(1000)
N<-nrow(iris)
tr.idx<-sample(1:N, size=N*2/3, replace=FALSE)

데이터분할 (학습데이터 2/3, 검증데이터 1/3)

 

train<-iris[tr.idx,]
test<-iris[-tr.idx,]

train (100개의 데이터)

test (50개의 데이터)

 

- tree패키지에 있는 tree함수

help("tree")

 

Step1

- 의사결정나무 함수 : tree (종속변수~x1+x2+x3+x4, data= )

treemod<-tree(Species~., data=train)
treemod
plot(treemod)
text(treemod,cex=1.5)

treemod는 iris데이터의 범주를 분리해주는 분지결과를 저장

plot(treemod) - 의사결정나무 분지를 그림으로 표현

cex-폰트 사이즈 (1)

 

- 학습데이터의 tree결과

tree의 결과(*은 터미널 노드) : 마디 6에서는 더이상 분지할 필요 없음

step2

- 최적tree모형을 위한 가지치기(prunung) : cv.tree(tree모형결과, FUN= )

- 아래 결과에서 복잡도계수(cost complexity parameter)의 값이 최소가 되는 노드수를 선택

cv.trees<-cv.tree(treemod, FUN=prune.misclass)
cv.trees
plot(cv.trees)

- pruning (가지치기) : cv.tree함수를 이용하여 최적 터미널 노드를 탐색

hellp(cv.tree)

교차타당성 검정

FUN = prune.tree

cv.tree함수에서 가지치기 함수는 prune.tree 혹은 prun.misclass를 사용할 수 있다.

 

- 최종 tree모형 (iris data)

prune.trees<-prune.misclass(treemod, best=3)

iris data는 best=3
plot(prune.trees)
text(prune.trees,pretty=0, cex=1.5)

 

prune.tr은 최종모형의 이름(최종터미널노드=3)

 

- pruning(가지치기) 전과 후의 tree

Step3

- 의사결정나무결과 정확도 : test data에 대한 정확도

treepred<-predict(prune.trees,test,type='class')

confusionMatrix(treepred,test$Species)