앙상블 학습의 핵심은 여러 개의 약 모형 (엉성한 모형, Weak Model)를 결합하여 강 모형(딴딴한 모형, Strong Model)을 만드는 것입니다. 그리하여 모델의 정확성이 향상됩니다.라고 일단 말해 놓고, 이건 또 무슨 소리인가를 알아보는 편.
어쨌든 앙상블이 뭔지 한번 봐야 하겠군요.
그림처럼, 대략 이런 건데요, 일단 가지고 있는 데이터를 재사용하면서 여러 가지의 엉성한 모형을 학습시킨 후에, 예측을 할 때에는 학습시킨 여러 가지의 모형의 결과물들을 이용해서 예측 결과를 결정하면 조금 더 나은 결과를 얻을 수 있다 뭐 그런 컨셉입니다. 상식적으로 봐도 여러 개의 모형이 예측에 참여한다면 결과가 좀 낫지 않을까 생각이 드는 것이 자연스러운 생각의 흐름이 아닐까 합니다. - 제일 쉬운 방법이 투표하는 방법이라서 이해를 돕기 위해 투표하는 방식으로 표현해 봤습니다아. 이런 걸 Majority Voting이라고 유식하게 부르는 경우도 있습니다요. -
이런 앙상블 방식을 사용하면 여러개의 엉성한 모형에 훈련용 표본을 복원추출해서 여러 개의 엉성한 모형(Weak Learner)의 학습에 계속 재사용할 수 있기 때문에 부트스트래핑 된 효과를 볼 수 있습니다. - 부트스트래핑은 데이터를 재사용하여 자력갱생하는 것이라고 한번 잘 살펴본 적이 있는데, 너무 오래된 이야기가 아니길 바랍니다. -
이때, 어처구니 없게, Bagging이라는 용어가 등장하는데, Bagging은 Bootstrap Aggregating의 약자입니다. 약자가 아닌 Bagging의 영어 단어 그대로의 뜻은 가방에 뭔가를 넣는 행위를 말하는데, 여러 개의 가방에 표본을 무작위로 복원추출 재사용하여 담은 다음에 그걸로 여러 개의 가방을 학습시켜 각각의 가방에서 나오는 결과물을 집계(Aggregration)하는 방법이라는 뜻이라고 보면 대략 그 느낌이 비슷하지 않을까 생각합니다만. 이건 그냥 개인적인 감상입니다. 어쨌든 Ensemble의 구현 방법 중 가장 쉬운 방법입니다.
이 Bagging 방법을 사용할 때 엉성한 모형(Weak Learner)들을 Decision Tree로 모델링 하게 되면 나무가 많아지잖아요? 그 나무들이 모여서 숲을 이루게 되는데 이런 걸 랜덤포레스트(Random Foreset)라고 부릅니다. 아하. 별거 아니군요.
랜덤포레스트가 어떻게 동작하는지 실예를 들어 보면 그다지 어려운 이야기는 아니니까 ㄱㄱ.
이런 데이터가 있다고 합시다. 이 데이터를 이용해서 Random Forest가 어떤 식으로 만들어 지는지 볼까 합니다. 역시나 이 데이터는 여동생의 소개팅 통계입니다. 이번에는 나이 Feature가 1개 늘었는데, 여동생이 나이를 먹으면서 조금은 더 까다로워졌나 봅니다. 망할 것.
① 자, 그러면 Bootstrapping을 해보죠. 어떤 식으로 할거냐면, 원래 데이터 개수와 같은 개수로 랜덤으로 새로운 복원추출 데이터 세트를 만드는 것입니다.
이런 식으로 bootstrapping을 하는건데, 이 경우라면 (N, N, N, 83, N) 이 데이터가 중복으로 3번이나 뽑혔군요. - 이건 예시일 뿐 다른 데이터가 중복으로 더 뽑힐 수도 있겠죠. -
② 이걸 가지고 Decision Tree를 하나 만듭니다. 이렇게 해서 나무가 하나 만들어집니다.
③ 다시 1번으로 돌아가서 같은 짓을 반복합니다. (만들기 원하는 나무 개수만큼인데, 그 개수는 일반적으로 n_estimators라고 표기을 하고요, 하이퍼파라미터로 모형을 만드는 사람이 결정할 수 있습니다. )
이때 n_estimator가 너무 크면 나무가 많이지니까 예측결과가 정확할 수는 있지만, 예측결과가 과적합될 수 있습니다. 그러니까, 많다고 마냥 좋은 건 아니라는 점 기억해 주세요. 그리고, 나무의 깊이도 중요한 Hyper parameter인데, max_depth라고 관습적으로 부릅니다. 이 하이퍼파라미터를 통해 나무의 최대 깊이를 제한하거나, max_leaf_nodes를 통해 잎사귀의 노드 수를 제한하여 나무의 깊이를 얕게 유지합니다
결국 n_estimator를 4로 하고, max_depth를 3으로 했을 경우에 랜덤 포레스트는 다음처럼 생길 수 있습니다. - 나무는 4개, 최대 싶이는 3이라는 의미입니다.-
이렇게 만들어진 랜덤 포레스트에 예측을 시킬 때에는 모든 Weak Learner 나무에 공통 입력이 주어지고, 그 결과로 각각 예측한 결과를 내뱉으면 그 결과의 투표 결과를 예측 결과로 쓰는 것입니다. 이 투표 결과라는 게 분류 문제에서는 투표로, 연속형 값 예측문제(회귀문제)에서는 평균을 구해서 답을 낸다. 뭐 이런 식으로 구현할 수 있겠습니다.
Bagging에 대한 아이디어를 통계적으로 다시 풀어 이야기 하면, 분산이 적은 모델을 얻기 위해 여러 개의 독립적인 모형이 한 예측을 "평균화"하는 겁니다. 결국, Bootstrapping을 이용하면 주어진 데이터가 충분하지 않아도 Model Ensemble을 만들 수 있고, n개의 모델을 학습시킨다고 하자면 - 매번 학습데이터를 Random Sampling 하면, 서로 다른 n개의 모형이 만들어지겠죠. - 각각의 모형은 학습 과정에서 사용된 데이터에 과적합 되겠지만, n개 전체를 사용하여 결정을 내리면 평균화를 했기 때문에 과적합 걱정도 크게 줄어들 것이라는 뭐 그런 흥미로운 이야기입니다.
그렇다면, Ensemble과 Bagging이 같은 것인가요? 하면 Ensemble ∋ Bagging의 관계이고, 그렇다는 이야기는 Ensemble을 할 때 Bagging말고 또 다른 방법도 있다는 이야기 입죠. 그중 또 유명한 게 Boosting이라는 것입니다. 아무래도 Bagging을 하다 보면, 어떤 모형의 결과물(+데이터)을 다른 모형이 참고해서 개선할 수 있다면, 더 나은 결정을 하지 않을까 하는 접근입니다. 어쨌든 이건 다음에 다룰 거예요.
이전에 했던 Bootstrapping의 본격 응용이니까, Bootstrapping이 뭔지 조금은 더 친근해 지지 않았나 생각합니다.
댓글