Hi! I'm Jaylnne ✋
저는 최근에 검색어(=쿼리 키워드) 분류 모델을 개발하고 있습니다. 저와 연구소 팀원 한 분(총 2명)이서 데이터 수집부터 개발까지 1~2개월간 진행한 프로젝트였습니다. 상당히 타이트한 일정이었지만 다행히 목표한 만큼의 성능을 달성했고, 이제 코드 정리 등 마무리 단계에 접어들고 있습니다.
해당 프로젝트는 2명이 각자 하나씩의 모델을 맡아 개발, 학습하고 이후 두 모델을 앙상블 하는 방식으로 진행하였는데요. 이번 케이스에서는 앙상블 모델과 단일 모델(두 모델 중 성능이 더 높았던 모델)의 성능 차이가 매우 미미한 것으로 확인되었습니다.
앙상블이 언제나 모델의 성능을 향상시키는 것이 아니라는 건 알고 있었지만, 그 원인에 대해서는 깊게 고민해본 적이 없었던 것 같습니다. 블랙박스적인(black-boxy) 특성 때문에 원인을 명확히 수학적으로 증명하기는 어렵지만 어느 정도 추정은 해볼 수 있지 않을까 하는 생각에 관련된 내용을 찾아보았습니다.
🤔 앙상블 (Ensemble) 학습은 항상 모델의 성능을 향상시킬까? 그렇지 않다면, 왜 그런 것일까?
앙상블 학습에는 크게 보팅(Voting), 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 등이 있습니다. 그 중에서도 제가 이번 프로젝트에 사용한 방식은 보팅이었는데요. 여러 종류의 알고리즘을 사용한 각각의 결과에 대해 투표를 통해 최종 결과를 예측하는 방식입니다. Voting → Vote → 투표하다. 이름부터 이미 직관적이라 이해가 쉽죠.
보팅은 또 다시 크게 두 가지, 소프트 보팅(Soft Voting)과 하드 보팅(Hard Voting) 방식으로 나뉘는데요. 소프트 보팅은 각 분류기의 레이블 값 결정 확률을 평균 내어 그중 가장 확률이 높은 레이블 값을 최종 레이블로 선정하는 방식입니다. 하드 보팅은 각 분류기의 결정 확률이 아닌 각 분류기의 최종 보팅 결과값으로 가장 많이 선정된 레이블을 최종 레이블로 예측하는 방식이고요.
예로 이해하는 것이 훨씬 쉬울 것 같으니 아래를 봐주세요!
# 0, 1 레이블로 분류하는 binary classification 문제이며 model_1, model_2 두 가지 모델을 사용한다고 가정하자!
model_1_preds = [0.7, 0.3]
model_2_preds = [0.6, 0.4]
# 소프트 보팅
ensemble_preds = model_1_preds*0.5 + model_2_preds*0.5
print(ensemble_preds)
print('최종 예측 레이블:', ensemble_preds.index(max(ensemble_preds)))
# out
[0.65, 0.35]
최종 예측 레이블: 0
# 하드 보팅
models = [model_1_preds, model_2_preds]
labels = [model.index(max(model)) for model in models]
print(labels)
print('최종 예측 레이블:', max(labels, key=labels.count))
# out
[0, 0]
최종 예측 레이블: 0
최대한 단순하게 예를 짜보았습니다. 이해에 도움이 되었나요? 굉장히 쉽고 단순한 기법입니다.
일반적으로 하드 보팅보다는 소프트 보팅 방식이 성능이 더 좋아 자주 사용되고 있습니다. 저도 이번 프로젝트에 적용한 보팅은 소프트 보팅 방식이었구요. 당연한 이야기지만, 소프트 보팅은 각 모델의 결정 확률에 0.5가 아닌 다른 값을 곱하면 6:4, 7:3 등 다양한 비율로 가중 평균을 낼 수도 있습니다.
아무튼 이번 글의 목표는 제가 이번에 진행한 프로젝트의 결과를 분석해보는 것이기 때문에, 지금 이후로 언급되는 내용은 모두 앙상블 기법 중에서도 소프트 보팅을 기준으로 말하고 있는 것으로 이해해 주시면 감사하겠습니다!
* 참고: 앙상블에 사용된 개별 모델들을 종종 약한 학습자 (weak learner)라고 칭하기도 합니다.
어째서 어떤 경우에는 앙상블 학습이 모델의 성능을 향상시키고, 또 어떤 경우에는 그러지 않을까요. 우선은 앙상블 학습의 기본적인 원리에 대해 알아야 할 것 같습니다. 종류마다 구체적인 알고리즘이 다르겠지만, 앙상블 기법은 기본적으로 모델 예측의 편향 및 분산을 줄이는 것을 목표로 하고 있습니다. 그렇게 하면 성능이 향상될 것이라는 전제하에 말이죠.
이러한 사실을 고려해봤을 때, 제가 소프트 보팅 기법을 적용했음에도 불구하고 모델의 성능이 향상되지 않은 이유를 두 가지로 좁혀볼 수 있겠죠.
위에서 추정한 원인을 조금더 자세히 뜯어봅시다.
3-1. 앙상블 전후 모델 예측 결과의 편향, 분산 차이가 거의 없었다.
앙상블 전후 모델 예측 결과의 편향 및 분산 차이가 크려면 두 모델이 비교적 낮은 상관관계를 가지고 있어야 합니다. 설명이 너무 단순해서 확 와닿지 않으시죠? 그냥 예를 들어 직접 확인해봅시다!
모두 레이블 1로 분류되어야 하는 데이터에 대해, 아래와 같이 결과를 도출한 binary classification model 이 3개 있다고 가정해봅시다.
# 각 모델의 분류 결과와 정확도
1111111100 = 80% accuracy
1111111100 = 80% accuracy
1011111100 = 70% accuracy
# 하드 보팅 결과
1111111100 = 80% accuracy
한눈에 보기에도 개별 모델들의 결과가 서로 매우 비슷합니다. 높은 상관관계를 가지고 있는 경우라고 할 수 있습니다. 하드 보팅 결과는 80% 로 성능의 향상이 없었네요. (직관적인 예시를 위해 하드 보팅으로 확인했습니다.)
비교적 상관관계가 낮은 모델들의 앙상블 결과는 어떨까요?
# 각 모델의 분류 결과와 정확도
1111111100 = 80% accuracy
0111011101 = 70% accuracy
1000101111 = 60% accuracy
# 하드 보팅 결과
1111111101 = 90% accuracy
첫 번째 예시보다 개별 모델의 성능은 더 낮습니다. 하지만 서로 상관관계가 낮은 세 모델을 하드 보팅한 결과는 앙상블 이전보다 향상되었음을 확인할 수 있습니다. 따라서 이번 프로젝트에서 앙상블을 시도했던 두 모델은 높은 상관관계를 가지고 있었을 수 있겠네요.
3-2. 편향, 분산이 줄었지만 그것이 성능 향상으로 이어지지는 않았다.
편향, 분산이 줄었다고 하더라도 앙상블 이후의 성능이 향상되지 않는 경우도 있습니다. 일반적으로 앙상블은 중간 성능의 모델을 결합할 때 효과가 좋기 때문입니다. 이번에도 예를 들어 설명해보는 것이 더 이해하기 쉬울 것 같네요.
아래와 같은 두 가지 경우를 가정해봅시다!
1번은 앙상블 후 모델의 성능이 향상될 가능성이 높은 반면, 2번의 경우는 앙상블 모델의 성능이 model-1 단일 모델의 95% 보다 오히려 성능이 낮아질 가능성이 높습니다. 이미 충분히 높은 성능을 내고 있는 모델은 앙상블 이후 오히려 정확도가 낮아질 수 있다는 겁니다.
이번 프로젝트에서 개발했던 두 가지 모델 중 한 가지 모델이 다른 모델에 비해 약 12%가량 높은 성능을 냈던 것을 생각해보면 위와 같은 원인도 영향이 있지 않았을까 싶습니다.
앙상블 학습이 좋은 결과를 낸 연구 논문이 많기 때문에 앙상블을 하면 당연히 모델의 성능이 오른다고 생각하시는 분들이 많은 것 같습니다. 실제로 저도 이번 프로젝트를 진행하며 다른 팀의 개발자분께 그런 질문을 받기도 했고요. 다음에 또 앙상블 기법을 적용해야 할 일이 생기면 오늘 정리했던 내용을 한 번씩 떠올려야겠습니다!
오늘 글의 내용도 도움이 되셨으면 좋겠습니다! 감사합니다! ✨
아래 링크의 내용을 일부 참고하였습니다. 원문을 읽어보시는 것을 추천드립니다.
좋은글이네요