R로 하는 머신러닝 Decision Tree와 Random Forest 개념, 사용 예시 설명 및 결과 해석

728x90

Decision Tree 정의

Decision Tree란 직역하면 의사결정나무라는 뜻이다.

여러 테스트 결과를 놓고 예, 아니오로 데이터를 결정한다.

Decision Tree의 노드 모형

Decision Tree의 모형을 노드라고 표현하며 상위에 있는 모형을 부모노드, 부모노드와 이어져 있는 의사나무결정을 자식노드라고 한다.

가장 좋은 Decision Tree의 모형은 최소한의 노드 수. 즉 가장 작은 나무 모양

 

Decision Tree의 단점은 데이터를 여러 분류의 카테고리로 나누어 적용한 값을 예측하기 때문에 overfitting이 일어날 가능성이 높다.

즉, Decision Tree의 모델을 다른 데이터에 적용할 때 일반화가 어렵다는 단점이 있다.

 

Random Forest 정의

이런 Decision Tree의 단점을 보완한 것이 랜덤포레스트이다.

Decision Tree가 한개의 노드 트리을 가지고 값을 예측했다면 랜덤포레스트는 다수개의 노드 트리를 가지고 값을 예측한다.

 

랜덤 포레스트가 다수개의 노드트리를 만드는 방식은 아래와 같다.

1. 전체 데이터 중 n개의 랜덤 데이터 샘플을 선택 (중복 가능)

* 이 방식을 배깅(Bootstrap Aggregating)방식이라 하며 앙상블 학습 방식 중 일부이다.

2. d개의 중복 불가능한 피처(feature)를 선택

3. Decision Tree와 동일한 방식으로 학습 시작

4. 각각의 노드트리에서 예측된 값의 빈도수를 계산하여 제일 높은 빈도수의 예, 아니오 중 하나를 선택하여 채택한다.

 

R에서 Decision Tree 사용하기

Decision Tree의 사용순서는 총 5단계

 

패키지 설치

사용하기전 R에서 필요한 라이브러리를 설치한 후 불러온다.

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

 

기본 트리

기본적인 tree를 생성해본다. 각각의 코드 설명은 주석을 참조

#구할 타겟의 이름 - Class
#.은 피쳐
#data는 학습에 필요한 데이터
treeRaw <- tree(Class~. , data = train)
#plot으로 배경을 그리고
plot(treeRaw)
#text로 각각의 노드 이름을 넣는다
text(treeRaw)

아래의 시각화된 결과물에서 proline이 755보다 작다는 것이 기준이므로 왼쪽이 YES(참)가 되며 오른쪽이 NO(거짓)가 된다.

모든 결과물은 부모노드의 기준에 따라 YES, NO의 방향이 달라진다

시각화 결과물

 

cross validation

교차검증을 위해 cv.tree를 지정하고 가지치기를 위한 prune.misclass 지정

#cross validation을 하기위해 cv.tree로 지정하고
#가지치기를 하기위한 FUN에 prune.misclass(오분류기준)를 지정한다
cv_tree <- cv.tree(treeRaw, FUN = prune.misclass)
plot(cv_tree)

y축이 낮을 수록 좋은 모형이며(misclass - 즉 잘못 분류된 트리가 적단 의미)  x축의 최적 사이즈는 5이다

가지치기

노드들이 너무 많을 때 제한을 둠으로써 모델의 성능을 최적화시키는 것을 가지치기라고 한다.

아래의 misclass 안의 파라미터 best를 4로 지정함으로써 모델의 노드 개수가 4개로 감소한 것을 확인할 수 있다.

#가지치기
#best를 4로 지정함으로써 노드의 개수가 4개로 줄었다.
prune_tree <- prune.misclass(treeRaw, best = 4)
#가지치기를 완료하고 새로운 데이터로 시각화
plot(prune_tree)
#pretty는 0으로 지정할 시 분할 피쳐의 이름을 바꾸지 않는다는 의미
text(prune_tree, pretty = 0)

 

[그림 예시] 사이즈를 카운트 하는 방법

예측하기

예측은 다른 로지스틱 회귀분석이나 knn에서 하는 방식과 유사하지만 tree에는 type을 따로 지정해줘야한다.

predict의 파라미터 안에는 가지치기 이후의 트리를 넣어주고 테스트 데이터로 예측값을 확인한 후 class데이터를 예측한다고 type에 명시한다.

#예측하기
#predict에는 가지치기 이후 트리를 넣어주고 테스트 데이터로 예측값을 확인한 후 class데이터를 예측한다고 type에 명시한다.
pred <- predict(prune_tree, test, type = 'class')
confusionMatrix(pred, test$Class)

시각화된 결과물

학습된 모델의 테스트 데이터 예측 정확도는 92.6%가 나온 것을 확인할 수 있다.

 

R에서 Random Forest 사용하기

Random Forest의 사용순서

일반 knn이나 로지스틱 회귀분석과 실행 순서가 동일하다.

패키지 설치

#패키지 설치 및 불러오기
install.packages("caret", dependencies = T)
library(caret)

 

데이터 불러오기

#데이터 불러오기
raw_data <- read.csv("Data/wine.csv")
data <- raw_data
str(data)

 

데이터 나누기

data$Class <- as.factor(data$Class)

totaldata <- sort(sample(nrow(data), nrow(data)*0.7))
train <- data[totaldata,]
test <- data[-totaldata,]

train_x <- train[,1:13]
test_x <- test[,14]

train_y <- train[,1:13]
test_y <- test[,14]

 

데이터 모델링

#데이터 모델링
#randomforest이므로 method에 rf 대입
ctrl <- trainControl(method = "repeatedcv", repeats = 5)
rfFit <- train(Class~.,
               data=train,
               method='rf',
               tfControl=ctrl,
               preProcess=c('center', 'scale'),
               metric="Accuracy"
               )
rfFit

 

예측

최종 학습된 모델의 테스트 데이터 예측 정확도는 92.6%가 나온 것을 확인할 수 있다.

mtry의 의미는 각 트리에서 랜덤하게 선택되는 분할피쳐 후보의 개수이다.

말이 조금 어렵긴한데 쉽게 생각하면 분할피쳐 후보의 개수. 즉 노드트리의 개수이며 이 mtry인 분할피쳐 후보의 개수가 적을 수록 노드트리의 크기도 작아진다.

최종 결과의 mtry의 2에서 제일 높은 정확도를 기록했으니 적절한 노드트리의 후보 개수는 2개이다.

 

시각화

 

 

 

 

 

 

728x90