-앙상블 (Ensemble) 기법 중 배깅(Bagging) 기법 원리 이해하기 :: R 모조리 정복하기


 이번 포스팅에서는 머신러닝의 모델링 기법중 하나인 앙상블, 그 중에서도 가장 기본적인 방법인 배깅(Bagging, Bootstrap Aggregating) 방법에 대해서 알아보고자 합니다. 


[INDEX]

1. 원리

2. 연습 in R



1.  Bagging 원리 (feat. 앙상블)


(출처 :  Youtube 영상 , Ensemble Learner , Udactiy)



  앙상블 모형은 여러개의 weak learners 를 이용해 최적의 답을 찾아내는 기법입니다. 그냥 학습자가 아닌 '약한 학습자'를 활용하게 되는데요, 굳이 이렇게 하는 이유는 좀 더 다양한 의견을 수렴하는 것과 같은 효과를 얻게 되기 때문입니다.


마치, 변호사로만 이루어진 팀보다는 변호사도 있고 배우도 있고 가수도 있는 팀이 좀 더 다양한 의견을 내서 퀴즈쇼에서 좋은 결과를 낼 수 있는 것과 같은 원리라고 보시면 됩니다. 약한 학습자 여러개를 결합하면 강한 학습자가 만들어진다는 아이디어를 기반으로 한다는 것이죠.


배깅(Bagging, Bootstrap aggregatng)은 이러한 앙상블 모형의 기법중 하나인데요, 그림에서 처럼 샘플링을 복원추출로 해온 여러개의 데이터셋으로 부터 각각 모델을 만들고, 그 모델들에서 나온 결과들을 투표(Voting) 혹은 평균(Mean, 보통 회귀분석으로 앙상블을 시도했을 때 평균으로 종합한다고 합니다.) 하여 결과를 도출하는 방법입니다.


 유튜브 영상을 보면 조금 더 이해가 쉬운데요, Udacity에서 쉽게 강의한 영상이 있어 아래에 소개합니다.







이런 앙상블 기법에 대해 정확도를 올리기 위한 방법에 대한 질문을 3가지를 던질 수 있는데


 1. 데이터에 대해 어떤 머신러닝 모델을 구현할 것인가? (회귀인지, 의사결정 트리인지 등)

 2. 해당 모델에 대해서 파라미터 튜닝을 어떻게 할 것인가? (샘플 갯수를 몇개로 할 것인지 등)

 3. 최고의 후보를 찾기 위해 모델 평가하는데 어떤 기준을 사용할 것인가? (투표인지, 평균인지)


이 세가지 질문에 대해 답하는 것이 앙상블 기법의 정확도를 올리고 과적합(Ovefitting) 문제를 조절하는 데에 가장 중요합니다.



2. R 을 통한 연습


2.1 ipred를 활용한 bagging


## bagging 연습 - ipred

credit <- read.csv("credit.csv", header = T)

head(credit, 3)


install.packages("ipred")

library(ipred)

set.seed(300)

 독일은행 채무 이행여부 데이터인 credit.csv를 통해 연습을 진행했습니다. bagging() 펑션을 담고있는 패키지인 ipred를 설치하고 다운받았고, 샘플링을 위한 set.seed()를 실행했습니다.



## nbag = 25  ## 앙상블에 사용되는 의사결정 트리의 갯수가 25개

mybag <- bagging(default ~ . , data = credit, nbagg = 25)

credit_pred <- predict(mybag, credit)

table(credit_pred, credit$default)

prop.table(table(credit_pred == credit$default))





## nbag = 50 ## 앙상블에 사용되는 의사결정 트리의 갯수가 50개

mybag <- bagging(default ~ . , data = credit, nbagg = 50)

credit_pred <- predict(mybag, credit)

table(credit_pred, credit$default)

prop.table(table(credit_pred == credit$default))



샘플링한 갯수가 많아질 수록 정확도가 미약하지만 좀 더 향상되는 모습입니다. nbagg이 bagging()에서는 샘플링하는 집단의 갯수를 결정하는 파라미터입니다.




 2.2 caret을 활용한 연습


## bagging 연습 - caret :: train()

install.packages("caret") ## 파라미터를 튜닝해주는 데에 필요한 caret 패키지

install.packages("e1071") ## trainControl 시에 e1071 패키지가 필요

library(caret)

library(e1071)


set.seed(300)


## numbet = 10

ctrl <- trainControl(method = "cv", number = 10) ## method : 샘플링을 하는 방법을 결정

                                                                             ## number : 리샘플링한 folds의 갯수

train(default ~ . , data = credit, method = "treebag",   trControl = ctrl) ## method : 적용 모델


## numbet = 20

ctrl <- trainControl(method = "cv", number = 10)

train(default ~ . , data = credit, method = "treebag",

      trControl = ctrl)


## numbet = 30

ctrl <- trainControl(method = "cv", number = 30)

train(default ~ . , data = credit, method = "treebag",

      trControl = ctrl)




 number는 리샘플링을 하는 횟수를 조절하는 파라미터인데요, 이를 높일 수록 credit 데이터상에서는 정확도와 kappa가 더 낮아지는 경향을 보였습니다. 가령 1000개의 데이터가 있다면, number = 10인 경우 100개씩 나뉘어 10개의 집합이 될 것이고, number = 20인 경우 각각 50개의 데이터를 가진 20개의 집합이 될텐데, 데이터의 갯수가 충분하지 않은 모델들이 많다고만 해서 좋은 결과가 나오지는 않는 다는 것을 알 수 있었습니다.






[참고 서적]


1. R을 활용한 머신러닝 - 브레트 란츠

2. R Programming - Coursera (2017년 강의)








반응형
Posted by JoeSung
,