본문 바로가기

Study doc./Machine Learning

[ML] 앙상블(Ensemble)이 뭐야?

머신러닝을 공부하다보면 '앙상블' 이라는 단어가 종종 나옵니다.

처음 앙상블을 접한 곳은 캐글이었는데, 무슨 뜻인지 짐작할 수도 없어서 거부감이 들었습니다.

개념도 복잡하고 어려울 것 같아서 최대한 그 단어를 피해다니다가 '파이썬 라이브러리를 활용한 머신러닝' 도서를 정독하면서 개념을 정리할 수 있었습니다. 

 

그리고 이해한 내용을 이렇게 글로 정리하면서 한번 더 공부하고자 합니다! 

그럼 앙상블이 뭔지 한번 볼까요?

 


 

순서

  1. 앙상블이란?
  2. 앙상블의 종류

1. 앙상블이란?

앙상블을 검색해보면 물리학, 통계학, 뮤지컬, 연주 등 다양한 영역의 연관검색을 확인할 수 있습니다. 

아하! 앙상블이라는 단어가 코딩의 전문용어가 아니였습니다. 

'앙상블(Ensemble)'은 프랑스어로써 '전체적인 어울림이나 통일' 이라고 위키백과에 나와있습니다.

머신러닝에서의 앙상블도 같은 맥락으로 '모델끼리의 어울림이나 통일' 로 해석할 수 있는데요,

하나의 알고리즘을 이용하여 여러 모델을 학습하는 개념이라고 할 수 있습니다.

 

혹시 '결정트리(Decision Tree)' 알고리즘을 아시나요?

결정트리 하나의 알고리즘을 사용해서 여러 개의 모델을 만드는 것, 

그게 대표적인 앙상블 기법의 한 종류입니다.

 

예를 한번 들어볼게요.

개와 고양이를 구분하는 모델을 만들기 위해 1000개의 개와 고양이 사진을 준비했습니다.

그리고 결정트리의 앙상블 기법을 사용하여 10개의 나무 모델을 만들었습니다.

 

이제 성능을 테스트하기 위해서 저희집 강아지 사진을 넣어보았는데, 

8개의 모델에서 '개' 라고 판단했고, 2개의 모델에서 '고양이' 라고 판단했습니다.

그럼 투표방식(Voting)에 따라 이 사진은 '개' 라고 판단하는 것입니다. 

앙상블 기법이 아니었다면 하나의 모델에서 나온 결과가 최종 결과가 되었을텐데 말이죠!!

 

하나의 알고리즘으로 여러개의 모델을 만들면 결과가 다 동일한거 아니냐구요?

맞습니다. 훈련 데이터가 모두 동일하다면 모두 같은 모델이 생성되겠죠! 

그렇기 때문에 훈련 데이터를 매번 다르게 해주거나, 의도적으로 모델을 변화시키는 작업이 필요합니다.

그 작업을 '배깅''부스팅' 이라고 합니다.

 

 

 

2. 앙상블의 종류

- 배깅(Bagging, Bootstrap Aggregating)

방금 전, 서로 다른 모델을 만들기 위해 훈련데이터를 다르게 해주거나, 의도적으로 모델을 변화시키는 작업이 필요하다고 했습니다. 

배깅은 그 중 훈련데이터를 다르게 해주는 작업이라고 할 수 있습니다.

매번 훈련데이터를 랜덤 복원 샘플링하는 방법으로 말이죠.

 

개와 고양이 사진 1000장을 다시 예로 들면,

1번 모델에서 랜덤으로 200장의 사진을 훈련데이터로 사용하고 다시 돌려놓고,

2번 모델에서도 랜덤으로 200장의 사진을 훈련데이터 사용하고 다시 돌려놓고,

이렇게 10번 모델까지 반복하는 것입니다.

 

복원추출이기 때문에 어쩌면 200장의 사진이 거의 비슷할 수도 있지만, 이렇게 함으로써 Overfitting 즉 훈련데이터에서만 잘 작동하고 실전에서는 형편없는 결과를 내는 문제를 막을 수 있습니다.

배깅의 특징으로는 병렬적 처리(1번부터 10번 모델사이 관계가 독립적, 병렬적임)를 들 수 있습니다.

대표적인 배깅의 앙상블 기법으로는 '랜덤포레스트(Random Forest)' 기법이 있습니다.

 

 

- 부스팅(Boosting)

부스팅은 의도적으로 모델을 변화시키는 작업이라고 할 수 있습니다.

 

어떻게 변화시키냐고요?

2번 모델은 1번 모델보다 더 좋은 성능으로, 3번 모델은 2번 모델보다 더 좋은 성능으로..

모델을 생성할수록 더 좋은 성능을 보장하는 방법으로 변화시킵니다.

 

어떻게 더 좋은 성능을 보장하냐고요?

이전에 나온 오류에 가중치를 두는 방법으로 보장합니다.

쉽게 말해 1번 모델에서 틀린 결과에 대해 2번 모델에서는 틀리지 않게 '오차를 보완'하는 개념입니다.

그렇게 되면 10번 모델은 1번부터 9번까지 틀린 문제에 대해 모두 보완한 모델이 되겠죠?!

 

예를 들어보겠습니다.

1번 모델에서 '발톱이 날카롭냐?' 라는 특성으로 개와 고양이를 분류했더니 발톱을 깎은 고양이를 개로 분류하는 오류가 생겼습니다.

그럼 잘못 분류된 사진들에 대해 가중치를 부여하여 2번 모델에서는 그 사진들을 분류하는 것에 집중합니다.

2번 모델에서는 발톱이 날카롭지 않지만 발바닥에 핑크색 젤리가 있으면 고양이라고 분류했습니다.

그랬더니 2번 모델에서 새롭게 잘못 분류된 사진이 있을테고, 다시 가중치를 부여하여 3번 모델에서 보완합니다.

 

지금까지 오류를 보완하는 방법으로 잘못 분류된 데이터에 대해 가중치를 두는 방식을 들었는데,

사실 또 다른 방식이 있습니다.

실제값과 예측값의 차이(loss)를 훈련데이터에 투입하고 gradient를 이용하여 모델을 개선하는 방식입니다.

 

'가중치를 두는 방식'을 사용하는 부스팅의 대표적인 사례로는 '에이다부스트(Adaboost)'가 있고,

'loss를 훈련데이터에 투입하는 방식'을 사용하는 사례로는 'XGBoost, LightGBM, Catboost' 가 있습니다.

XGBoost, Catboost : level-wise
LightGBM : leaf-wise