본문 바로가기

Data Science/Machine Learning

[ML] Ensemble(앙상블)과 Semi-supervised learning

반응형

※해당 게시물에 사용된 일부 자료는 순천향대학교 빅데이터공학과 정영섭 교수님의 머신러닝 전공수업 자료에 기반하였음을 알려드립니다.

 

이번 포스팅에서는 Ensemble(앙상블)의 개념과 종류에 대해서 알아보려고 한다. 그리고 마지막에는 '반지도학습'이라고 불리는 'Semi-supervised learning'에 대해 소개한다.

 

우선 앙상블의 사전적 의미는 무엇일까? 앙상블이란 '음악' 분야에서 '2인 이상에 의한 가창(歌唱)이나 연주' 를 의미한다. 우리는 앙상블의 사전적 의미에서 음악과 관련된 용어는 신경쓰지 말고 '2인 이상'이라는 단어에 집중하자. 즉, 머신러닝 분야에서의 앙상블은 2개 이상의 여러가지 모델을 결합시켜 하나의 결합모델을 만드는 것이다. 앙상블은 SVM보다 성능이 좋다고 알려져있으며 대표적으로 Random Forest가 존재한다. 

 

이제 본격적으로 앙상블에 대해서 파헤쳐보자. 목차는 다음과 같다.

 

1. 앙상블의 종류로서 Boosting

2. Boosting의 종류

3. 앙상블의 종류로서 Bagging

4. Bagging의 종류 

5. Semi-supervised learning의 종류

1. 앙상블의 종류로서 Boosting

부스팅은 모델마다 어떤 데이터를 담당할지 여부를 데이터에 대한 Weight로서 관리한다. 이렇게만 말해서는 피부에 와닿게 이해가 되지 않을 것이다. 그림과 예시를 들으면서 이해해보자.

 

Boosting이란?

 

위 그림은 부스팅이 어떻게 진행되는지에 대한 프로세스 그림이다. 이제 예시를 간단하게 들어보자. 

우선 10만개의 데이터 중 1000개를 샘플링 해서 Sample1이라고 가정하자. Sample1을 Learning 알고리즘(모델)을 사용해 Sample1을 학습시키고 분류 결과를 도출한다. Sample1에 대한 분류 결과가 나왔는데 Sample1을 학습시킨 모델이 잘 분류하지 못하는 오분류 데이터 'A'가 있다는 것을 알게 되었다. 이 때 우리는 'A'라는 데이터에 Weight값을 부여하고 다시 Dataset에 넣고 10만개의 데이터 중 다시 1000개를 샘플링 해서 Sample2을 샘플링한다. (이 때 이 예시에서만 오분류된 데이터 'A'가 Sample2에 있다고 가정하고) Sample2를 학습시키는 모델을 만들고 분류 결과를 도출한다. 이 때 기존 Sample1을 학습한 모델에서 분류하지 못한 'A'라는 가중치를 부여한 데이터Sample2 모델은 데이터 'A'를 잘 분류할 가능성이 높아진다. 이러한 과정을 계속적으로 반복하며 마지막에는 이 여러가지 모델들(Learners)의 결과를 종합하게 된다.

 

그렇다면 부스팅 과정에서 가장 마지막의 모델(Learner)이 가장 성능이 좋지 않을까? 맞는 말이다. 하지만 최종적으로는 처음부터 끝까지의 여러 Learner들을 종합해서 결과물을 도출하게 된다. 

2. Boosting의 종류

Boosting의 종류에 여러가지가 있겠지만 여기에선 Adaboost와 최근에 가장 많이 사용되고 있는 XGboost에 대해서 알아보려고 한다.

2-1. Adaboost

Adaboost는 각 샘플이 모두 같은 데이터셋을 사용한다. 각 분류기(모델들=Learners)마다 오분류한 데이터에 가중치를 크게 부여하여 다음 분류기에는 잘 분류할 수 있도록 해준다. 그런데 가중치를 너무 크게 부여하면 첫 번째 분류기에서 잘 분류했던 데이터를 다음 분류기에서는 분류하지 못할 수도 있다. 그렇기 때문에 가중치를 더 부여하더라도 적당하게 부여해야 한다.  그림을 보면서 이해해보자.

 

Boosting의 종류인 Adaboost

 

위 그림의 초록색 막대데이터를 의미하며, 막대의 길이는 해당 데이터의 가중치(Weight)를 의미한다. 즉 막대의 길이가 길수록 그만큼 가중치가 크다는 의미이다. h1~h4의 총 4가지 모델이 있는데 왼쪽에서부터 오른쪽으로 가면서 오분류된 데이터에 가중치를 늘려주면서 결국 h4에는 모든 데이터를 잘 분류할 수 있는 것을 볼 수 있다. 

 

이 때 가장 오른쪽에 있는 h4모델 즉, 모든 데이터를 잘 분류한 모델의 Weight가 가장 크며 이는 곧 분류성능이 가장 좋음을 의미한다.(트리의 크기가 커짐에 따라 Weight값이 커지는 것으로 표현했다.)

2-2. XGBoost

XGBoost는 Gradient Boosting 알고리즘을 분산환경에서도 실행할 수 있도록 구현해놓은 라이브러리이다. Regression, Classification 문제를 모두 지원하며, 성능과 자원 효율이 좋아서, 인기 있게 사용되는 알고리즘이다. 그리고 XGBoost는 여러개의 Decision Tree를 조합해서 사용하는 앙상블 알고리즘이다. 

 

Boosting 기법을 이용해 구현한 알고리즘이 대표적으로는 Gradient Boost인데 이 알고리즘을 병렬 학습이 지원되도록 하는 라이브러리가 XGBoost이다.

XGBoost [출처:조대협님 블로그]

 

3. 앙상블의 종류로서 Bagging

Bagging은 Bootstrap Aggregating이라고도 한다. Bagging도 Boosting처럼 여러가지로 샘플링한 각 데이터마다 분류기가 존재하는 것은 똑같다. 하지만 각 분류기마다 서로 영향을 미치는 Boosting과는 달리 Bagging은 각 분류기가 서로 영향을 미치지 않는다. 즉, 분류기들이 서로 독립적임을 의미한다. 그리고 모든 분류기들이 각자의 결과를 도출한 후 Voting방법을 통해서 최종적인 결과를 도출한다. 이 때 Voting하는 방법에서도 각 모델마다 Weight를 다르게 줄 수 있지만 보통은 똑같은 Weight를 부여하는 Uniform voting 방법을 사용한다고 한다. 

 

Bagging이 진행되는 프로세스

 

위 그림은 Bagging이 진행되는 프로세스 그림이다. 그런데 만약 샘플링할 때 데이터의 Label이 불균형하다면 어떻게 할까? 데이터 불균형(=클래스 불균형)을 해소하기 위해서는 다음과 같은 다양한 방법들이 존재한다. 이에 대한 포스팅은 이전에 게시했었지만 그 때 알지 못했던 다른 방법들도 있기에 같이 종합적으로 열거해보겠다.

 

  • Up-sampling : 비율이 적은 데이터를 비율이 많은 데이터 개수에 맞게 맞춰준다. 즉 Fake data를 만들어주는 것인데 주로 GAN 을 이용한다. GAN 은 모델의 Robustness(에러 데이터에 잘 대처하는 정도)를 높여준다.

  • Down-sampling : 비율이 많은 데이터를 비율이 적은 데이터 개수에 맞게 맞춰준다. 

  • Loss Weight control

    1. Cost-sensitive learning : 비율이 적은 데이터에 비율에 맞게 더 큰 Weight를 부여한다.(또는 비율이 많은 데이터에 더 적은 Weight를 부여한다.) 

    2. Focal Loss : 쉽게 분류하는 Label에 대한 Weight를 적게 주고 분류하기 힘든 데이터에 Weight를 더 크게 주면서 분류하기 힘든 데이터를 분류하는 데 더 집중하도록 해준다.

Up-sampling과 Down-sampling은 데이터 불균형이 너무 심할 때, 즉, 특정 데이터의 label이 다른 label에 비해 현저하게 적을 때 사용하게 된다면 오히려 독이 될 수 있음을 인지하자. 

 

#딥러닝 다중 분류모델에서 사용된 Focal loss에 대해 다루었던 이전 포스팅이 있다. Focal loss에 대해 더 알고싶다면?

https://techblog-history-younghunjo1.tistory.com/74

 

그렇다면 애초에 주어진 Dataset 자체가 너무 적다면 어떻게 할까? 이 때 사용하는 방법은 대표적으로 두 가지가 있다.

 

  • Transfer Learning : 데이터가 많았던 분야에서 적용된 모델을 갖고와서 파라미터를 그대로 사용한다.

  • Distant supervision : 이는 보통 반지도학습에서 사용되며 어떤 '가정(assumption)'이나 특정 규칙을 데이터에 labeling하는 것이다. 단적인 예로 "머리카락이 30cm이상이면 여자일거야!" 라고 알 수 있는 사실을 가정으로 삼고 labeling 해주는 것이다.

또한 그림에서 Voting은 'Ballot Box'라는 부분에서 시행된다.

 

4. Bagging의 종류 - Random Forest

Bagging의 대표적인 모델은 Random Forest이다. Random Forest는 SVM보다 분류 성능이 대부분 좋다고 알려져 있다. 비록 딥러닝에 비해서는 낮지만..대체 딥러닝은 얼마나 높은건가.. 랜덤포레스트는 기본적으로 Decision Tree를 여러가지 조합한 모델이며 Decision Tree의 한계를 보완하는 모델이다. Decision Tree는 앞서 배운 것처럼 트리가 깊어질수록 Bias가 낮지만 Variance가 높아지면서 Train data는 잘 분류하지만 Test data는 잘 분류하지 못하는 Overfitting(과적합)문제를 야기시킨다. 그렇다면 Random Forest는 어떤 모델일까? 다음 그림을 보면서 Random Forest의 구조를 이해해보자.

 

Random Forest의 구조

 

위와 같이 랜덤포레스트는 많은 트리가 결합된 모델이다. 즉, 하나의 트리를 깊게 만드는 것이 아닌 작은 트리를 여러개 결합시키는 것이다. 그래서 낮은 Bias값을 유지하면서 Variance도 낮게 할 수 있다는 것이다. Bias-Variance trade-off를 극복한 셈이다. 그렇다면 작은 트리의 갯수가 많다고 무조건 좋은 성능을 보일까? 그것도 아니다. 설령 작은 트리의 개수가 엄청 많다고 하더라도 여러개의 작은 트리들이 서로 다른 데이터 파트를 담당하는 것이 아니라면 성능은 좋지 않을 수 있다. 현실적인 비유로 들자면 컨베이어 벨트 공장에서 여러사람의 직원이 있지만 모든 직원들이 하나의 일만 할 수 있다면 사람은 여러명이더라도 작업의 효율성이 극도로 낮아지지 않을까? 이게 적절한 비유일지는 모르겠지만 직관적으로 이해하기에는 좋은 비유인 것 같다.

 

그렇다면 랜덤포레스트의 또 다른 장점들은 무엇일까?

 

  • Fast : 속도가 빠르다

  • Explainable : 결과값이 어떻게 도출됬는지 설명할 수 있다. 즉, 결과값이 어떻게 도출됬는지가 중요한 분야에서는 랜덤포레스트가 적절할 것이다. 단적인 예로 환자의 암 판정을 내리는 문제라면 그럴 것이다.

  • Overfitting 예방 : 방금 위에서도 언급했지만 작은 트리를 여러개 만들어 낮은 Bias와 낮은 Variance를 유지할 수 있다.

참고로 Bagging을 할 때 랜덤 Sampling을 하게 되는데 이 랜덤(Randomness)을 강화(최적화)하는 방법도 있다고 한다.

 

5. Semi-supervised learning의 종류

Semi-supervised learning인 반지도 학습은 기본적으로 일부는 정답이 주어지고 일부는 정답이 주어지지 않은 상태에서 기계가 알아서 직접 군집화하는 방식이다. 즉, 정답이 없는 데이터(unlabeled data)가 학습에 도움이 될 것이라고 가정하는 것이다. 반지도학습은 다음과 같은 아이디어에서 출발했다고 한다.

 

반지도학습 아이디어의 기원

 

#참고로 초록색 조그만 동그라미unlabeled data이다.

우리 인간은 위 분류 그림을 보면서 빨간색, 파란색 동그라미를 보고 "빨간색 동그라미쳐진 데이터는 하늘색 동그라미 주변에 있으니까 하늘색 동그라미랑 똑같은 클래스겠네", "파란색 동그라미쳐진 데이터는 빨간색 세모랑 가까이 있으니까 빨간색 세모랑 똑같은 클래스겠네" 라고 추론할 수 있다. 하지만 기계는 이러한 추론이 불가능하다. 그렇다면 기계는 어떤 방식으로 인간처럼 반지도 학습을 가능하게 할까?

 

5-1. Active Learning 

Active learning은 말 그대로 기계가 어떻게 분류할지 모르는 데이터가 나타난다면 '사람'에게 물어보는 것이다. 그리고 '사람은' 기계가 잘 모르겠다는 데이터에 label을 tagging해주고 기계는 사람이 tagging해준 label을 기반으로 다시 학습하게 된다. 그렇다면 기계가 어떻게 스스로 "이 데이터는 어떻게 분류할지 모르겠어" 라고 판단하는 척도가 무엇일까? 이에 대한 척도는 두 가지가 존재한다.

 

  • Uncertainty sampling : 학습하는 데이터 중 가장 confidence가 낮은 데이터를 사람에게 물어본다.(이 때 confidence란, 만약 confidence가 높다면 확실히 분류할 수 있는 데이터이고 낮다면 분류하기 어려운 데이터를 의미한다.)

  • Committee-based sampling : 예를 들어 이진분류 문제에서 6개의 분류기들(Learners) 중 'A' label을 주장하는 분류기가 3개, 'B' label을 주장하는 분류기가 3개로 3:3으로 비등비등(?)하게 주장한다면 이 때 최종 선택을 사람에게 물어보는 것이다.

5-2. Self-training 

Self-learning이라고도 불리며 label이 존재하는 학습 데이터(gold dataset이라고 불림)를 supervised한 상태에서 학습하고 생성한 모델을 사용해 unlabeled data를 분류해 예측결과를 얻는다. 그리고 예측결과를 얻은 것들 중 confidence가 높은 일부 데이터(이를 Silver dataset라고 부른다)를 다시 학습용으로 사용해 새로운 모델을 얻는다. 이 과정을 일정 조건 만족시까지 계속적으로 반복하게 된다. 하지만 잘못하면 엉뚱한 방향으로 학습이 진행될 가능성이 존재한다.

 

5-3. Co-learning

여기서 Co는 'Together'을 뜻한다. 즉, "함께 학습하다"라는 의미이다. 독립적 모델들이 Self-learning을 하면서 도출되는 Confidence가 높은 데이터(Silver dataset)들을 서로 모델들간에 물물교환처럼 교환하면서 '함께 학습'해 나가는 방식이다.

 

Co-learning이 진행되는 방식

 

# 참고 블로그

https://bcho.tistory.com/1354

 

XGBoost 개념 이해

XGBoost 알고리즘의 개념 이해 조대협 (http://bcho.tistory.com) XGBoost는 Gradient Boosting 알고리즘을 분산환경에서도 실행할 수 있도록 구현해놓은 라이브러리이다. Regression, Classification 문제를 모두..

bcho.tistory.com

 

반응형