예측 성능 끌어올리는 '앙상블 학습'...배깅·랜덤포레스트·부스팅 세 기법, 약한 모델 여럿 묶어 정확도 높인다
여러 모델을 묶어 예측 성능을 높이는 앙상블 학습 기법이 주목받고 있다.
[한국정보기술신문] 하나의 예측 모델에만 의존하지 않고 여러 모델을 함께 묶어 더 나은 결과를 얻는 '앙상블 학습(ensemble learning)'이 데이터 분석 분야에서 폭넓게 쓰이고 있다. 앙상블 학습은 여러 개의 학습 알고리즘을 결합해, 각각을 따로 쓸 때보다 높은 예측 성능을 내려는 방법이다. 특히 데이터 분석 경진 플랫폼인 캐글(Kaggle)이나 데이콘(Dacon) 등에서 XGBoost, LightGBM 같은 기법이 꾸준히 좋은 성적을 거두면서, 그 바탕이 되는 앙상블 원리에 대한 관심도 높아지고 있다.
앙상블 학습에서 가장 자주 쓰이는 기본 재료는 '의사결정 트리(decision tree)'다. 의사결정 트리는 데이터를 여러 갈래로 나눠 가며 예측하는 모델로, 마치 스무고개처럼 조건을 따라 내려가 답을 찾는 구조다. 이해하기 쉽고 다루기 편하지만, 단독으로 쓰면 데이터가 조금만 바뀌어도 결과가 크게 달라지는 약점이 있다. 이런 불안정성을 보완하기 위해 등장한 것이 배깅, 랜덤 포레스트, 부스팅 같은 앙상블 기법이다.

표본을 거듭 뽑아 평균내는 '배깅'
배깅(Bagging)은 트리가 가진 '높은 분산' 문제를 줄이기 위한 기법이다. 여기서 분산이 높다는 것은, 같은 방식으로 학습하더라도 어떤 데이터를 쓰느냐에 따라 결과가 들쭉날쭉 달라진다는 뜻이다.
분산을 줄이는 가장 자연스러운 방법은 여러 번 측정해 평균을 내는 것이다. 서로 다른 훈련 데이터를 여러 벌 구해 각각 모델을 만든 뒤 그 예측을 평균하면 결과가 안정된다. 그러나 현실에서는 훈련 데이터를 여러 벌 확보하기 어렵다.
배깅은 이 문제를 '부트스트랩(bootstrap)'이라는 방법으로 푼다. 부트스트랩은 하나의 훈련 데이터에서 표본을 중복을 허용해 거듭 뽑아, 마치 여러 벌의 데이터가 있는 것처럼 만드는 기법이다. 이렇게 만들어 낸 여러 데이터로 각각 트리를 세운 다음, 그 예측 결과를 평균하면 분산이 줄어든다. 이것이 배깅이다. 예측하려는 값이 숫자인 회귀 문제에서는 예측값을 평균하고, 어느 범주에 속하는지 맞히는 분류 문제에서는 가장 많이 나온 답을 택하는 다수결 방식으로 결과를 정한다.
남겨둔 데이터로 오차 추정하는 'OOB'
배깅에는 모델의 성능을 손쉽게 가늠하는 장치가 딸려 있다. 부트스트랩으로 표본을 뽑을 때 각 트리는 평균적으로 전체 데이터의 약 3분의 2만 사용하게 된다. 나머지 3분의 1은 그 트리를 만드는 데 쓰이지 않는데, 이를 'OOB(Out-of-Bag) 관측치'라 부른다.
이렇게 학습에 쓰이지 않고 남은 데이터는 일종의 '시험 문제' 역할을 한다. 각 데이터를 자신이 학습에 참여하지 않은 트리들로만 예측해 보면, 모델이 처음 보는 데이터를 얼마나 잘 맞히는지 따로 검증용 데이터를 떼어 두지 않고도 추정할 수 있다. 이 방식은 데이터가 매우 커서 교차 검증 같은 별도 검증 절차가 부담스러울 때 특히 편리하다. 교차 검증은 데이터를 여러 부분으로 나눠 번갈아 학습과 검증에 쓰며 성능을 평가하는 방법이다.
정확도는 높지만 해석은 어려워
배깅은 정확도를 끌어올리는 대신 한 가지를 잃는다. 여러 트리를 묶어 평균하다 보니, 단일 트리처럼 어떤 조건에서 어떤 결정을 내렸는지를 한눈에 보여 주기 어려워진다. 즉 모델을 해석하기가 까다로워진다.
이 단점을 덜기 위해 각 설명변수가 예측에 얼마나 기여했는지를 따로 측정한다. 설명변수란 예측에 활용되는 입력 정보를 뜻한다. 회귀 트리에서는 어떤 변수로 데이터를 나눴을 때 오차가 줄어든 정도를, 분류 트리에서는 '지니 계수'라는 척도가 개선된 정도를 모든 트리에 걸쳐 평균낸다. 지니 계수는 한 갈래 안에 여러 범주가 얼마나 뒤섞여 있는지를 나타내는 값으로, 작을수록 잘 나뉜 것으로 본다. 이 평균값이 클수록 중요한 변수로 판단한다. 모델 전체를 들여다볼 수는 없어도, 어떤 변수가 결정적이었는지는 가늠할 수 있는 셈이다.
트리들의 '닮은꼴'을 깨는 랜덤 포레스트
랜덤 포레스트(Random Forest)는 배깅을 한 단계 발전시킨 기법이다. 배깅과 마찬가지로 부트스트랩으로 여러 데이터를 만들어 다수의 트리를 세우지만, 한 가지 결정적인 차이가 있다. 트리가 가지를 칠 때마다 전체 설명변수 중 일부만 무작위로 골라 분할 후보로 삼는다는 점이다.
이 장치가 필요한 이유는 배깅의 맹점에 있다. 만약 유난히 영향력이 큰 변수가 하나 있으면, 배깅으로 만든 트리들은 대부분 그 변수를 맨 위에서 사용하게 된다. 그 결과 트리들이 서로 비슷해지고, 비슷한 것들을 평균해 봐야 분산은 크게 줄지 않는다.
랜덤 포레스트는 가지를 칠 때마다 일부 변수만 후보로 허용해, 강한 변수가 매번 선택되는 것을 막는다. 보통 전체 변수가 개일 때 그 제곱근()만큼만 후보로 쓴다. 이렇게 하면 트리들이 서로 달라지고, 닮은꼴을 깨뜨린(서로 간의 상관성을 제거한) 트리들을 평균하므로 결과가 한층 안정된다. 후보 변수의 수를 전체와 똑같이 두면 배깅과 같아지고, 제곱근 수준으로 줄이면 검정 오차와 OOB 오차가 모두 배깅보다 작아진다. 서로 관련성이 큰 변수가 많을 때는 후보 수를 더 줄이는 것이 유리하다.
잘못을 조금씩 고쳐 나가는 부스팅
부스팅(Boosting)은 앞의 두 기법과 출발점이 다르다. 배깅과 랜덤 포레스트가 여러 트리를 따로따로 만들어 한꺼번에 묶는다면, 부스팅은 트리를 '순차적으로' 만든다. 각 트리가 앞서 만든 트리들의 결과를 보고, 그들이 놓친 부분을 메우는 방식이다.
부스팅은 부트스트랩으로 표본을 뽑지 않는다. 대신 앞선 트리가 틀린 부분, 곧 '잔차(residual)'를 다음 트리의 목표로 삼는다. 잔차는 실제값과 예측값의 차이를 뜻한다. 작은 트리를 만들어 남은 오차를 조금 줄이고, 또 작은 트리로 다시 조금 줄이는 과정을 반복하며 성능을 천천히 끌어올린다. 한 번에 거대한 트리로 데이터를 통째로 외워 버리면 새 데이터에 약해지기 쉬운데, 이를 과적합이라 한다. 부스팅은 이처럼 느리게 학습해 과적합 위험을 피한다. 일반적으로 천천히 학습하는 기법이 더 좋은 성능을 내는 경향이 있다.
부스팅의 세 가지 조절 손잡이
부스팅에는 성능을 좌우하는 세 가지 조절 값이 있다. 첫째는 트리의 개수다. 배깅·랜덤 포레스트와 달리 부스팅은 트리를 너무 많이 만들면 오히려 과적합이 생길 수 있어, 적정 개수를 교차 검증으로 정한다.
둘째는 학습 속도를 정하는 '수축 파라미터'다. 보통 0.01이나 0.001 같은 작은 양수를 쓰는데, 값이 작을수록 더 천천히, 더 꼼꼼히 학습하는 대신 그만큼 많은 트리가 필요하다.
셋째는 트리 하나의 크기, 곧 가지를 몇 번 치는지다. 흔히 한 번만 갈라지는 아주 작은 트리(그루터기)로도 충분한 경우가 많으며, 이때 모델은 변수들의 효과를 단순히 더해 가는 형태가 된다. 갈라지는 횟수를 늘리면 그만큼 여러 변수가 함께 얽혀 작용하는 복잡한 관계까지 담아낼 수 있다. 부스팅은 이미 만든 트리들을 고려하며 자라기 때문에, 랜덤 포레스트보다 작은 트리로도 좋은 결과를 낸다. 작은 트리를 쓰면 모델을 해석하기도 쉬워진다.
"원리 이해하고 상황에 맞게 골라야"
세 기법은 모두 약한 모델 여럿을 묶어 더 강한 예측기를 만든다는 공통점을 갖는다. 다만 배깅과 랜덤 포레스트가 여러 트리를 나란히 세워 평균하는 '병렬' 방식이라면, 부스팅은 앞선 트리의 오차를 뒤이은 트리가 메우는 '순차' 방식이라는 점에서 갈린다. 또한 배깅·랜덤 포레스트는 트리가 많아져도 과적합 걱정이 적은 반면, 부스팅은 트리 수를 비롯한 조절 값을 신중히 정해야 한다는 차이도 있다.
이 같은 원리는 실무에서 쓰이는 도구들과도 맞닿아 있다. 경진 대회에서 강세를 보이는 XGBoost와 LightGBM은 모두 부스팅 계열이고, 통계 분석에서 두루 쓰이는 랜덤 포레스트 역시 배깅에 뿌리를 두고 있다. 어떤 기법이 더 우월한지는 데이터의 성격과 풀려는 문제에 따라 달라지는 만큼, 각 기법의 원리를 이해하고 상황에 맞게 고르는 것이 중요하다는 게 전문가들의 설명이다.
한국정보기술신문 인공지능분과 성연주 기자 news@kitpa.org











