티스토리 뷰
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 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'R > Analysis' 카테고리의 다른 글
[R 분석] Random Forest 매개변수 튜닝 (1) | 2019.01.18 |
---|---|
[R 분석] Random Forest 알고리즘 (0) | 2019.01.17 |
[R 분석] 조건부 추론 나무 (0) | 2019.01.16 |
[R 분석] 종속변수의 그룹(class) 별 데이터 개수 균등하게 맞추기 (0) | 2019.01.16 |
[R 분석] 지도학습을 위한 데이터 샘플링 (0) | 2019.01.16 |