안녕하세요
오늘은 R로 하는 머신러닝 지도학습 분류 3번째,
결정 트리에 대해 알아보도록 하겠습니다.
우선
1. 의사결정 트리란?
의사결정 rule을 계층적 나무구조로 도표화하여 분류 및 예측할 수 있는 분석 방법
분류율에 대한 정확도만 따지면 신경망 또는 회귀분석등의 분류 방법들보다 낮게 평가되기도 하지만
" 결과를 쉽게 이해하고 설명할 수 있으며 의사결정을 하는데 직접적으로 사용할 수 있다 "
는 장점이 있습니다!
2. 의사결정 트리의 알고리즘의 다양한 종류
각각의 이름과 알고리즘의 기준 속성은 다음과 같습니다.
ID3 : 엔트로피
C4.5, C5.0 : 정보획득량
CART : 카이제곱
CHAID : 카이제곱
3. 의사결정 트리 알고리즘에서 고려해야할 문제
1) 훈련 데이터를 어떤 속성으로 분할해야하는가?
위의 다양한 기준이 있는 이유 또한 이 질문에 대한 각각의 답을 낸 결과 아닐까요?
2) 트리 성장(분할과정)은 언제, 어떻게 정지해야하는가?
의사결정 트리를 시각화하여 순도가 높게 분류되는지 확인하기
3) 과적합 문제는 어떻게 해결해야할까?
가지치기(tree pruning)를 이용하여 불필요한 질문 제거하기
4. C5.0 알고리즘 이용하기
정보획득량을 기준으로 결정 트리를 시각화 하도록 하겠습니다.
정보획득량이란 무엇일까요?
정보획득량 = 분할전 엔트로피 - 분할 후 엔트로피
그렇다면 엔트로피의 공식을 알아봅시다.
모르는 분들을 위해 제 블로그에 각각 간단하게 포스팅하였습니다~
5. 코드로 알아보기
1. 의사결정 패키지 C50 을 설치한다. 2. 데이터를 로드한다. 3. 데이터를 suffle한다. 4. train 데이터와 test 데이터로 나눈다. 5. train 데이터로 분류 모델을 생성한다. 6. 분류모델과 test 데이터로 분류 결과를 예측한다. 7. Tree를 시각화한다. |
decision_tree_fun <- function(){
# 1. 필요한 패키지 설치
# install.packages("C50")
# C50 라이브러리
library(C50) # 이원교차표 라이브러리
library(gmodels)
# tree 시각화를 위한 패키지 library(rpart) library(rattle)
# 2. 데이터 로드하기 print("분석할 csv파일을 입력하세요 ")
data <- file.choose()
na.string <- NA
table1 <- read.csv(data, header = T, na.string = na.string) d_col <- menu(c(colnames(table1),'none'), title="삭제할 컬럼을 선택하시오 ")
table1 <- table1[,-d_col]
l_col <- menu(colnames(table1), title="label이 될 컬럼을 선택하시오 ")
# 연속형데이터는 factor로 변환하지 않는다.
# 팩터 라벨 한글 제거 fctr_ls <- which( sapply(table1, class) == "factor" ) if( length(fctr_ls) !=0 ) { cat('***주의***\nFactor에 한글이 포함되어 있으면 에러가 발생할 수 있습니다.
\nFactor 라벨을 영문 혹은 숫자로 변경하십시오.\n\n') while( TRUE ) { chg_num <- menu(c('SKIP', colnames(table1)[fctr_ls]) , title = "라벨을 변환할 팩터컬럼을 선택하세요\n
-> 더이상 변환할 컬럼이 없다면 SKIP을 선택합니다.") if( chg_num == 1 ) break chng_lv <- NULL lv <- levels( table1[,fctr_ls[chg_num-1]] ) for( i in 1:length(lv) ) { chng_lv <- c(chng_lv, readline( paste('기존 :', lv[i], '-> 변경 : ')) ) } levels( table1[,fctr_ls[chg_num-1]] ) <- chg_lv } }
trials <- readline(prompt = "trials 값을 입력하세요 ")
# 3. 데이터 shuffle 하기 # 조절할 것1_set.seed() set.seed(11) table_shuffle <- table1[sample(nrow(table1)),]
# 4. train 데이터와 test 데이터 나누기 train_num <- round(0.7*nrow(table_shuffle),0) table_train <- table_shuffle[1:train_num, ] table_test <- table_shuffle[(train_num +1): nrow(table_shuffle), ] l_col <- colnames(table1)[l_col] ncol1 <- which(colnames(table1) == l_col)
# 5. 분류모델을 생성한다. # 조절할 것2_trials: 시도할 횟수 정함 model <- C5.0(table_train[ ,-ncol1], table_train[ ,ncol1], trials = as.numeric(trials)) result <- predict(model, table_test[ ,-ncol1])
# 6. 테스트 데이터로 예측한 결과(정확도) 확인
CrossTable(x = table_test[,ncol1], y= result)
# 7. Tree 시각화하기 # as.formula와 paste로 ~.을 붙여야한다.
tree <- rpart(label~. , data=data.frame(table1[,-ncol1], label = table1[,l_col]), control=rpart.control(minsplit=2))
# color 지정하기 fancyRpartPlot(tree,palettes = c("Greys","RdPu")) }
결과
오늘은 여기까지!!
다음은 회귀분석으로 돌아오겠습니다~
또 봐요~
'R로 머신러닝하기' 카테고리의 다른 글
R로 머신러닝 비지도학습하기 | 연관규칙 (Apriori 알고리즘) (0) | 2018.06.22 |
---|---|
R로 머신러닝 지도학습하기 | 회귀분석(Regression)_다중회귀분석 (0) | 2018.06.20 |
R로 머신러닝 지도학습하기 | 나이브베이즈(Naive Bayes) 분류 (0) | 2018.06.08 |
R로 머신러닝 지도학습하기 | KNN(k Nearest Neighbors) 분류 (4) | 2018.06.02 |
R로 머신러닝하기 | 머신러닝(Machine Learning) 이란? (0) | 2018.05.23 |