앙상블(Ensemble)과 랜덤 포레스트(Random Forest)

2022. 2. 11. 01:30AI/ML

이 포스트는 허민석님의 유튜브 머신러닝 내용을 정리한 글입니다. 실습 코드는 도서 나의 첫 머신러닝/딥러닝에서 발췌해왔습니다. 실습 코드와 자료는 링크의 Github에서 볼 수 있습니다

이번 포스트에서는 앙상블 기법과 대표적인 앙상블 알고리즘인 랜덤 포레스트(Random Forest) 모델에 대해 알아보겠습니다.

"백지장도 맞들면 낫다"

백지장도 맞들면 낫다, 작은 힘이라도 모이면 큰 힘이 될 수 있다는 의미입니다. 이는 앙상블 기법을 그대로 표현해주는 속담으로, 앙상블 기법은 여러 분류 모델을 조합하여 더 좋은 성능을 내는 기법입니다. 조금 더 자세히 보자면 앙상블 기법은 여러 학습 알고리즘을 사용하여 구성 학습 알고리즘만으로 얻을 수 있는 것보다 더 나은 예측 성능을 얻을 수 있는 기법이지만 단일 모델에 비해 더 많은 계산이 필요합니다. 앙상블 기법은 실제 kaggle competition에서도 항상 상위에 랭크되어 있어 "The 10 main take aways fro ML conf SF"에서는 "Ensemble almost always work better"으로 소개되기도 했습니다. 백지장도 맞들면 낫다, 집단 지성, 관련된 단어들만 떠올려도 앙상블 기법에 대해서 간단히 이해할 수 있을 것입니다. 그렇다면 앙상블 기법의 유형에는 어떤 것이 있는지, 그리고 대표적인 앙상블 기법 중 하나인 랜덤 포레스트 알고리즘에 대해서 알아보겠습니다.

 

- 배깅(Bagging, B+agging)

배깅은 여러 명의 사람이 분야를 나누어 퀴즈를 품으로써 한 명의 사람이 퀴즈를 푸는 것보다 더 좋은 결과를 얻을 수 있는 방법입니다. 다양한 분야가 출제되는 퀴즈를 풀 때는 한 명의 사람이 전문 분야에 대해서는 정답을 맞힐지 몰라도, 전혀 모르는 분야에 대해서는 정답을 맞히지 못할 것입니다. 이를 머신러닝에 빗대어 보면 한 명의 사람이 퀴즈를 푸는 것이 과대적합 되어 있는 상태로 볼 수 있는데, 이처럼 배깅은 과대적합이 쉬운 모델에 상당히 적합한 앙상블입니다. 과대적합이 쉬운 모델을 생각하면 의사결정 트리(Decision Tree) 알고리즘이 가장 먼저 떠올릴 수 있으며, 실제로 앙상블 기법은 의사결정 알고리즘에서 많이 사용됩니다. 그렇다면 배깅의 원리를 살펴보겠습니다.

배깅은 한 가지 분류 모델을 여러 개 만들어 서로 다른 학습 데이터로 학습시킨 다음(부트스트랩, bootstrap), 동일한 테스트 데이터에 서로 다른 예측 값들을 투표를 통해 가장 높은 예측 값으로 최종 결론(어그리게이팅, aggregating)을 내리는 과정을 거칩니다. 그럼 바로 부트스트랩과 어그리게이팅에 대해 알아보겠습니다.

 

- 부트스트랩(Bootstrap)

부트스트랩은 데이터를 조금 편향되도록 샘플링하는 기법입니다. 부트스트랩을 사용하면 개별 분류기들에 전체 데이터를 학습하는 것이 아닌, 보통 중복을 허용해 70-80% 만의 데이터를 추출하여 학습해 학습 시 데이터의 편향을 높입니다. 부트스트랩을 왜 사용하는지를 이해하기 위해서는 먼저 편향-분산 트레이드 오프(bias-variance trade off)에 대해 이해해야 합니다. 이해를 위해 오차를 구하는 식을 변형한 아래의 식을 보겠습니다. 오차는 타깃에 대한 분산(줄일 수 없는 오차)에 분산과 편향을 더한 값입니다. 식을 보면 분산과 편향이 의미하는 바를 조금 더 이해할 수 있는데, 분산은 예측값들이 서로 얼마나 가까운지를, 편향은 예측값들이 실제값과 얼마나 차이 나는지를 나타냅니다. 이를 과대적합된 모델에 적용하면 과대적합된 모델은 학습 데이터에 대해 예측값과 실제값의 차이가 적어 편향이 적지만, 동시에 모델 복잡도가 높아지므로 편향-분산 트레이드 오프 법칙에 의해 분산이 높습니다. 즉 학습 시에는 정확도가 높게 나오지만, 학습에 사용된 적 없던 데이터의 분류에 대해서는 정확도가 낮게 나옵니다.

오차 공식 변형식과 편향-분산 트레이드 오프

보통 특정 하이퍼파라미터를 설정하지 않은 채 학습한 의사결정 트리는 과대적합된 모델이며 이때 부트스트랩을 사용하여 데이터 샘플링 시 학습 데이터의 편향을 높여 모델 복잡도를 줄이고 과대적합 위험을 줄일 수 있습니다. 위의 그래프에서 파란색 선의 편향(bias)이 높아지면 모델 복잡도가 줄어들며 빨간색 선의 분산(variance)과 만나는 점이 이전에 비해 왼쪽에 만나 오차를 줄일 수 있습니다. 이 연관 관계를 확실히 이해하면 부트스트랩을 사용하는 이유와 부트스트랩을 어떻게 사용하는 것이 효율적일 수 있을지에 대해 이해하는 것은 더욱 쉽습니다.

전체 학습 데이터가 1 ~ 9의 정수로 이루어졌다고 해보겠습니다. 학습 데이터를 train = [1, 2, 3, 4, 5, 6, 7, 8, 9]로 두고서 의사결정 트리 6개를 배깅할 경우 부트스트랩을 사용하면, 전체 9개의 학습 데이터를 총 6개의 데이터로 중복을 허용한 채 나누어 담습니다(샘플링). 위에서 이미 언급했듯이 데이터를 샘플링할 때는 전체 학습 데이터를 모두 사용하지 않고 샘플링 크기를 60 - 70%를 사용하며 중복을 허용하기 때문에 학습 데이터의 편향은 자연스럽게 높아질 것입니다. 예를 들어 총 6개의 의사결정 트리에 대한 학습 데이터를 [1, 2, 3, 4, 5, 1], [2, 3, 4, 5, 6, 2], [3, 4, 5, 6, 7, 3], [4, 5, 6, 7, 8, 4], [5, 6, 7, 8, 9, 5], [6, 7, 8, 9, 1, 6]과 같은 식으로 샘플링하면 각 분류기는 같은 의사결정 트리 모델일지라도 테스트 시에는 다른 결과를 낼 수도 있습니다.

 

- 어그리게이팅(Aggregating)

어그리게이팅은 여러 분류 모델이 예측한 값들을 조합하여 하나의 결론을 도출하는 과정입니다. 결론을 도출하는 과정은 투표로 이루어지며, 투표(voting)는 하드 보팅(hard voting)과 소프트 보팅(soft voting)으로 나뉩니다. 

먼저 하드 보팅입니다. 하드 보팅은 학교 투표 방법과 같습니다. 학교 투표는 학급 내 모든 인원에게 동일하게 한 표씩 주어집니다. 하드 보팅도 각 분류기에서 최고의 확률을 갖는 분류 값만을 어그리게이팅하여 리턴하는 방식이며 바로 위의 예시에서 MNIST 데이터셋의 첫 번째 데이터(0)에 대해 6개의 의사 결정 트리가 [9, 6, 0, 0, 0, 0]과 같이 분류했다면 하드보팅 어그리게이팅은 최다 득표를 받은 0으로 예측합니다. 크게 어렵지 않습니다. 다음은 소프트 보팅입니다. 소프트 보팅은 데이터에 대해 분류값의 모든 확률을 계산합니다. 하드 보팅이 각 분류기에서 최고의 확률을 갖는 분류값만을 어그리게이팅 했다면, 소프트 보팅은 분류기가 데이터에 대해 분류 값 별 확률을 모두 고려하여 모든 분류기에 대해 더하여 총합이 최대인 분류 값을 결론으로 도출합니다. 예를 들어 아래의 표에서 숫자 7이 학습 데이터로 들어왔을 때 각 의사결정 트리의 분류 값 별 확률 표를 보면 의사결정 트리 1-6은 1-9에 해당하는 모든 분류값별 확률을 가지고 있으며, 이를 모두 더하여 최종 점수가 가장 높은 7을 분류 값으로 리턴하게 됩니다.

  1 2 3 4 5 6 7 8 9
d-tree 1 0.9 0.1 0 0 0 0 0 0 0
d-tree 2 0 0.8 0.1 0.1 0 0 0 0 0
d-tree 3 0 0 0.1 0 0 0 0.9 0 0
d-tree 4 0 0 0 0.1 0 0 0.9 0 0
d-tree 5 0 0 0 0 0 0 1 0 0
d-tree 6 0.4 0 0 0 0 0 0.6 0 0
분류값 확률 합 최종 점수
1 0.9 + 0.4 1.3
2 0.1 + 0.8 0.9
3 0.1 + 0.1 0.2
4 0.1 + 0.1 0.2
5 0 0
6 0 0
7 0.9 + 0.9 + 1 + 0.6 3.4
8 0 0
9 0 0

- 부스팅(Boosting)

부스팅은 여러 개의 분류기를 만들어 투표를 통해 예측값을 결정하지만 배깅이 서로 다른 알고리즘의 분류기를 한 번에 병렬적으로 학습하는 반면, 부스팅은 동일한 알고리즘의 분류기를 순차적으로 학습하여 데이터를 보강해 나가며 여러 개의 분류기를 만든 후, 테스트할 때 가중 투표를 통해 예측값을 결정합니다. 의사결정 트리를 예시로 보겠습니다. 만약 인물 사진의 성별을 구분하는 의사결정 트리를 부스팅 할 경우, 첫 번째 질문이 랜덤으로 선택되어 의사결정 트리를 학습합니다. 기존 의사결정 트리에서는 엔트로피와 정보 이득을 모두 계산하여 최적의 질문을 첫 번째 질문으로 선택했다면, 부스팅 시에는 랜덤한 질문이 선택됩니다. 이는 계산량을 줄여주며, 다음 학습 시 미흡한 분류를 찾아 학습 데이터를 보강한 다음 두 번째 의사결정 트리를 학습하면 되기 때문입니다. 예를 들어 남자 분류가 미흡했다면, 남자 사진을 학습 데이터에 추가하여 보강한 다음 두 번째 의사결정 트리를 학습합니다. 이렇게 학습한 의사결정 트리는 첫 번째 의사결정 트리와는 다른 것으로, 이 과정을 반복하여 세 번째, 네 번째 의사결정 트리를 만듭니다. 순차적으로 학습 데이터를 보강한다는 의미가 바로 이것이며, 이렇게 만들어진 분류기를 테스트할 때 가중 투표를 거칩니다. 하드 보팅에서는 모든 의사결정 트리에 한 표씩 부여되는 반면, 부스팅은 하드 보팅과 소프트 보팅 모두 존재하지만 의사결정 트리에 따라 가중치를 주어 투표가 진행됩니다. 가중 투표의 가중치는 보통 정확도로 정해지며, 아래의 표에서 세 분류기의 정확도가 각각 0.4, 0.5, 0.95로 하나의 사진을 분류할 때 두 분류기가 남자로 분류했음에도 두 분류기의 정확도를 더한 것보다 나머지 한 분류기의 정확도가 더 크기 때문에 여자로 분류됩니다.

  분류기 1 분류기 2 분류기 3
정확도 0.4 0.5 0.95
  분류기 1 분류기 2 분류기 3
분류값 남자 남자 여자

소프트 보팅의 경우도 살펴보겠습니다. 정확도를 가중치로 두어 모든 분류 확률값을 곱하여 계산하며, 이 때도 또한 여자로 분류되는 모습을 볼 수 있습니다.

  분류기 1 분류기 2 분류기 3
분류값 남자:0.7 / 여자: 0.3 남자: 0.8 / 여자: 0.2 남자: 0.1 / 여자: 0.9
가중치 (분류기 정확도) 0.4 0.5 0.95
남자 0.4*0.7 + 0.5*0.8 + 0.95*0.1 0.775
여자 0.4*0.3 + 0.5*0.2 + 0.95*0.9 1.075

- 랜덤 포레스트 (Random Forest)

마지막으로 앙상블의 대표적인 알고리즘 모델 중 하나인 랜덤 포레스트 모델에 대해 알아보겠습니다. 랜덤 포레스트는 여러 의사결정 트리를 배깅해서 예측을 실행하는 모델로, 배깅은 특히 과대적합되기 쉬운 의사결정 트리에 적용하면 성능이 월등히 나아지기 때문에 여러 개의 의사 결정 트리들에 배깅하며, 따라서 여러 나무들이 모여 있다는 개념에서 파생된 이름입니다. 랜덤 포레스트 모델에서는 배깅이 이루어지기 때문에 부트스트랩이 실행될 때 일부 데이터를 제외한 샘플링된 데이터들로 학습하게 되며, 이때 샘플링된 데이터들에서 최적의 특징을 찾아 트리를 분기하기 때문에 랜덤 포레스트 모델은 모델의 편향을 증가시켜 과대적합의 위험을 더욱 감소시킵니다. 다만 의사결정 트리에서 과적합의 위험을 줄이고자 하이퍼파라미터를 설정했을 때처럼 랜덤 포레스트 모델에서도 많은 하이퍼파라미터를 설정해주어야 하며 시간이 많이 소요된다는 단점도 있습니다. 랜덤 포레스트는 다음 MNIST 데이터 분류 실습에서 조금 더 알아볼 것이며, 이번 포스트는 여기서 마치겠습니다. 다음 포스트에서는 MNIST 손글씨 데이터 분류(이전 Fashion MNIST 분류 포스트를 보고 오시면 이해에 도움이 될 것입니다.)를 앙상블 기법을 사용했을 때와 단일 분류 모델을 비교해보고 랜덤 포레스트 모델을 사용하여 학습해보는 실습을 하겠습니다.