티스토리 뷰

반응형

Decision Tree 매개변수 튜닝





# 1. train data set과 test data set 분리 

 원본 데이터가 각 class별로 균등하지 않는 경우는 sampling 한 데이터도 균등하지 않기 때문에 균등하게 맞춰주는 것이 좋습니다.

=> upsampling, downsampling을 통해 각 class별 데이터를 균등하게 만들어 놓고, train set과 test set으로 분리 필요


> sn <- sample(1:nrow(iris), size = nrow(iris)*0.7)

> train <- iris[sn,]

> test <- iris[-sn,]



# 2. train set을 적용, 모델 생성

> library(party)

> ctree_m <- ctree(Species ~ ., data = train)

> ctree_m   # 모델 확인

Conditional inference tree with 4 terminal nodes


Response:  Species 

Inputs:  Sepal.Length, Sepal.Width, Petal.Length, Petal.Width 

Number of observations:  105 


1) Petal.Length <= 1.9; criterion = 1, statistic = 98.569

  2)*  weights = 36 

1) Petal.Length > 1.9

  3) Petal.Width <= 1.7; criterion = 1, statistic = 44.189

    4) Petal.Length <= 4.7; criterion = 0.994, statistic = 10.2

      5)*  weights = 30 

    4) Petal.Length > 4.7

      6)*  weights = 7 

  3) Petal.Width > 1.7

    7)*  weights = 32

> plot(ctree_m)  # 모델 시각화 (sampling 데이터의 random한 변화에 따라 결과가 달라짐)



# 3. test set을 위 모델에 적용 및 정확도(score) 확인

> bool_v <- predict(ctree_m, newdata=test, type='response')

test$Species     # test set의 실제 정답

bool_v == test$Species     # 예측값과 실제값이 같은지 확인

sum(bool_v == test$Species)     # TRUE값만 sum 하므로 예측과 실제값이 일치하는 개수 확인 가능

nrow(test)  # 평가 데이터의 전체 건수 

> score1 <- sum(bool_v == test$Species) / nrow(test) * 100     # 정확도(score)

> score1

[1] 95.55556             # 정확도에 따라 진행 여부 판단 => 정확도가 높지 않다면 어떤 모델에 적용해도 좋은 결과를 얻을 수 없음

# 데이터 전처리부터 설명변수의 선택, 매개변수 튜닝이 정말 중요한 과정!! 



# 4. 매개변수 튜닝 및 고정 (동일한 데이터 안에서 옵션의 변화)

# 4-1) minbucket의 변화에 따른 정확도(score) 확인 => test 데이터를 활용한 검증

> library(rpart)

> score_test <- c()

> for (i in 1:10) {

     m <- ctree(Species ~ . , 

                     data=train,

                     control = ctree_control(minbucket = i))

     val_var <- predict(m, newdata=test, type="response") 

     score_test <- c(score_test, sum(val_var == test$Species)/nrow(test) * 100)

   }

> score_test

 [1] 95.55556 95.55556 97.77778 97.77778 97.77778 95.55556 95.55556 95.55556 95.55556 95.55556


# 4-2) minbucket의 변화에 따른 정확도(score) 확인 => test 데이터를 활용한 검증

> score_train <- c()

> for (i in 1:10) {

     m <- ctree(Species ~ . , 

                     data=train,

                     control = ctree_control(minbucket = i))

     val_var <- predict(m, newdata=train, type="response") 

     score_train <- c(score_train, sum(val_var == train$Species)/nrow(train) * 100)

   }

> score_train

 [1] 98.09524 98.09524 97.14286 97.14286 97.14286 96.19048 96.19048 96.19048 96.19048 96.19048



# 5. 결과 해석

> plot(1:10, score_test, type = 'b',                                   # test data 적용

          xlab = 'minbucket', col='red', ylim = c(95,100))

> lines(1:10, score_train, type = 'b')                                 # train data 적용

# 위 그래프를 통해 해당 모델 사용 시 test data 와 train data 의 overfit(과대적합)이 적은 구간 minbucket = 3~5으로

   지정해주는 것이 가장 좋은 결과를 도출해낼 수 있다고 해석할 수 있습니다.



# 모델의 매개변수 튜닝 및 정확도(score) 확인

> ctree_m <- ctree(Species ~ ., data = train, 

                  controls = ctree_control(minbucket = 4))


> bool_v <- predict(ctree_m, newdata=test, type='response')

> score1 <- sum(bool_v == test$Species) / nrow(test) * 100     # 정확도(score)

> score1

[1] 97.77778        # 매개변수 튜닝을 통해 정확도 상승 (95.55556 -> 97.77778)




참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday