2020. 7. 28. 22:38ㆍML in Python/Knowledge
앙상블에 대한 종류와 전반적인 설명은 아래 링크에 존재한다. 이 게시글에서는 앙상블 모형중 Bagging과 RandomForest에 대해서 알아보겠다.
https://todayisbetterthanyesterday.tistory.com/47
1. Bagging
1) Bagging의 의미
Bagging이란 bootstrap aggregating을 의미한다. 그리고 bootstrap이란 복원추출을 의미한다. 즉 복원추출한 것들을 합친다는 것이다.
2) Bootstrapping
---------------------------------------------------- 예시 ----------------------------------------------------
Full Dataset : 1 2 3 4 5 6 7 8 9 10 11 12
>>>>> Sampling with replacement <<<<<
Bootstrap sample(size 5) : 1 9 6 3 1
Bootstrap sample(size 5) : 3 1 7 4 5
...
...
Bootstrap sample(size 5) : 8 3 5 2 1
-------------------------------------------------------------------------------------------------------------
위의 예시를 보면 크기 5의 bootstrap sample이 생성되었다. sample의 개수는 상관이 없다. bootstrap이란 반복 복원추출을 통해서 데이터를 n번(크기 n) 반복해서 뽑는다는 것이다. 이때, "복원"이 가능하기에 데이터의 중복이 발생할 수 있다.
이때 기본적으로 한 bootstrap sample의 크기는 전체 데이터셋의 약 63% 정도로 이루어진다. 즉, 전체 데이터의 63%를 반복추출(중복가능)하여 여러개의 sample을 만들어내는 것이다.
3) Bagging의 원리
bootstrap에 대해서 알아보았다. 다음 그림을 봐보자.
이 bootstrap을 통해 이루어진 sample은 우리가 학습하고자 한 bagging의 크기 K만큼 생성된다. 그리고 K개의 sample dataset을 각각 학습한다. 이 결과를 모두 합쳐 voting을 진행하거나 평균을 낸다. 이것이 바로 bagging의 원리인 것이다.
그리고 bagging에 사용되는 각각의 base learner에 대한 error는 bootstrap에서 제외된 데이터를 사용하여 base learner를 test한다. 예를들어 1~12까지 데이터가 존재하고 base learner에 사용되는 data로 1/3/4/6/8/9/11 이 선택되었다고 하자. 그렇다면 제외된 data는 2/5/10/12이다. 이를 test하고 각각의 base learner의 error를 계산한다. 그리고 전체 모델의 error는 이 error들을 평균을 낸다. 이때 발생하는 error를 Out-of-Bag error(OOB error)라고 한다.
bagging의 base learner는 주로 Decision Tree이지만 이 base learner에 다른 모델을 선택해도 상관이 없다. 즉, 데이터셋을 분할하고 반복 복원 추출하여 결과를 합치는 과정 자체가 Bagging인 것이다.
4) Bagging의 장단점
만약 Tree의 depth가 커지면, 편향은 감소할 수 있지만, 분산증가가 유발된다. 하지만, bagging은 각 tree들의 편향은 유지하되, 분산을 감소시키도록 하는 것이다. 그렇기에 학습데이터의 noise에 대해서 영향을 덜 받게되는 장점이 있다.
하지만, 동시에 Tree의 직관적인 이해력을 헤치게 되어서, 모형 해석에 어려움이 발생하게 된다.
2. Random Forest
Bagging은 전체 데이터에서 복원추출하나 중복되는 데이터를 다수 갖고있다. 그렇기에 발생하는 문제가 독립이 아니라는 것이다.
𝑉𝑎𝑟(𝑋 + 𝑌) = 𝑉𝑎𝑟(𝑋) + 𝑉𝑎𝑟(𝑌) + 2𝐶𝑜𝑣(𝑋, 𝑌)
독립이 아니게 된다면, 각 base learner간의 공분산이 발생하게 된다. 즉 비슷한 tree가 만들어질 가능성이 높다는 것이다. 이는 tree가 증가하면서 전체 모델의 분산이 증가하는 결과를 발생할 수도 있다는 것이다. 그렇기에 tree간 공분산을 줄이기 위해 나온 방법이 바로 Random Forest인 것이다.
Random Forest는 기본적으로 Ensemble learning의 "다양한 모델"이라는 기본 컨셉에 충실한 모델이다. Random Forest는 Bagging처럼 데이터를 반복 복원추출을 진행할 뿐만 아니라, 거기에 더해 변수 또한 random하게 추출하여 다양한 모델을 만드는 것이다. 이 변수를 random추출하여 모델을 다양하게 만드는 과정을 통해서 base learner간 공분산을 줄이는 효과를 기대한다.
위의 그림은, 모형의 전개도이다. 위에서 각 bootstrap sample에서 선택된 변수는 전부 다르다. 그리고 이 개개의 base learner를 기반으로 결과를 예측하고 error값을 계산한다.
뽑을 변수의 개수는 분석가가 직접 선택해야하는 hyper parameter이다. 그리고 일반적으로는 총 p개의 변수가 존재한다면, sqrt(p)개, 즉 root_p개를 사용한다.
이 random forest는 모델의 분산을 줄이기에 일반적으로 bagging보다 성능이 좋다고 알려져있다.
python을 통한 실습링크를 아래 남겨놓겠다. 관심이 있다면 한 번 봐보는 것도 좋다.
Bagging
https://todayisbetterthanyesterday.tistory.com/50?category=821465
RandomForest
https://todayisbetterthanyesterday.tistory.com/51?category=821465