
머신러닝 모델의 성능을 높이는 방법은 크게 두 가지입니다.
하나는 단일 모델을 정교하게 튜닝하는 것,
다른 하나는 여러 모델의 예측 결과를 결합하는 것입니다.
후자의 대표적인 방법이 바로 **앙상블 학습(Ensemble Learning)**입니다.
이번 글에서는 앙상블 학습의 기본 개념과 종류를 정리하고,
그중 가장 직관적인 방법인 보팅(Voting) 기법을 실제 코드 실습으로 살펴봅니다.
1. 앙상블 학습이란 무엇인가
앙상블 학습이란
여러 개의 분류기(Classifier)를 생성하고, 이들의 예측 결과를 결합하여 단일 모델보다 더 좋은 예측 성능을 얻는 기법
을 의미합니다.
이는 현실 세계의 의사결정 방식과 매우 유사합니다.
한 명의 전문가 의견보다,
👉 여러 전문가가 각자의 관점에서 판단한 결과를 종합하는 것이 더 신뢰도가 높을 가능성이 큽니다.
앙상블 학습의 핵심 목표는 다음과 같습니다.
- 단일 모델의 약점을 여러 모델로 보완
- 모델 간 오류를 확률적으로 상쇄
- 일반화 성능(Generalization) 향상
2. 왜 여러 모델을 섞는 것이 도움이 되는가
흥미로운 점은,
👉 항상 성능이 가장 좋은 모델들만 모은다고 해서 최고의 앙상블이 되지는 않는다는 점입니다.
오히려,
- 서로 다른 알고리즘
- 서로 다른 학습 방식
- 서로 다른 오류 패턴
을 가진 모델들을 섞는 것이 성능 향상에 더 도움이 되는 경우가 많습니다.
이러한 특성 때문에
**결정트리(Decision Tree)**는 앙상블에서 매우 중요한 역할을 합니다.
- 단일 결정트리는 과적합에 취약하지만
- 여러 개를 결합하면 단점은 줄고, 장점은 강화됩니다.
그래서 다음과 같은 대표적인 앙상블 모델들이 모두 결정트리를 기반 알고리즘으로 사용합니다.
- 랜덤 포레스트(Random Forest)
- Gradient Boosting
- XGBoost
- LightGBM
3. 앙상블 학습의 대표적인 종류
앙상블 학습은 크게 다음 세 가지로 구분할 수 있습니다.
(1) 보팅(Voting)
- 여러 분류기의 예측 결과를 투표 방식으로 결합
- 서로 다른 알고리즘을 사용하는 경우가 많음
- 비교적 구현이 간단하고 직관적
👉 이번 글의 핵심 주제
(2) 배깅(Bagging)
- 동일한 알고리즘을 사용
- 서로 다른 데이터 샘플(부트스트랩 샘플링)로 학습
- 대표 모델: 랜덤 포레스트(Random Forest)
👉 2편에서 다룰 예정
(3) 부스팅(Boosting)
- 이전 모델의 오류를 다음 모델이 보완
- 순차적으로 학습 진행
- 대표 모델: AdaBoost, GBM, XGBoost, LightGBM
👉 3편에서 다룰 예정
4. 보팅(Voting) 앙상블의 개념
보팅은
여러 개의 분류기가 동일한 데이터에 대해 예측한 결과를 종합하여 최종 클래스를 결정하는 방식
입니다.
보팅 방식은 두 가지로 나뉩니다.
4-1. 하드 보팅(Hard Voting)
- 각 분류기가 예측한 클래스 값으로 다수결
- 가장 많이 선택된 클래스가 최종 결과
👉 직관적이지만, 확률 정보를 활용하지 못함
4-2. 소프트 보팅(Soft Voting)
- 각 분류기의 예측 확률을 평균
- 평균 확률이 가장 높은 클래스를 선택
👉 일반적으로 하드 보팅보다 성능이 더 우수하여 실무에서 더 많이 사용됩니다.
5. 사이킷런 VotingClassifier 실습
이제 실제 코드로 보팅 앙상블을 구현해 보겠습니다.
데이터는 **유방암 데이터셋(Breast Cancer Dataset)**을 사용합니다.
5-1. 라이브러리 및 데이터 로딩
import pandas as pd
# 보팅 앙상블을 위한 클래스
from sklearn.ensemble import VotingClassifier
# 개별 분류기
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
# 데이터셋 및 평가 관련 모듈
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 유방암 데이터 로딩
cancer = load_breast_cancer()
# pandas DataFrame으로 변환 (EDA 및 확인용)
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
data_df.head()

5-2. 개별 분류기 생성
# 로지스틱 회귀 분류기
# 선형 모델 기반, 확률 예측 가능
lr_clf = LogisticRegression(max_iter=500)
# KNN 분류기
# 거리 기반 분류 알고리즘
knn_clf = KNeighborsClassifier(n_neighbors=8)
5-3. 소프트 보팅 기반 앙상블 모델 생성
# VotingClassifier 생성
# estimators: (이름, 모델) 형태의 튜플 리스트
# voting="soft": 소프트 보팅 방식 사용
vo_clf = VotingClassifier(
estimators=[("LR", lr_clf), ("KNN", knn_clf)],
voting="soft"
)
5-4. 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
cancer.data,
cancer.target,
test_size=0.2,
random_state=156
)
5-5. 보팅 앙상블 모델 학습 및 평가
# VotingClassifier 학습
vo_clf.fit(X_train, y_train)
# 테스트 데이터 예측
pred = vo_clf.predict(X_test)
# 정확도 평가
print(f"Voting 정확도 : {accuracy_score(y_test, pred)}")

5-6. 개별 모델 성능 비교 : 앙상블이 실제로 도움이 되는지 확인하기 위해 각 개별 모델의 성능도 함께 비교합니다.
classifiers = [lr_clf, knn_clf]
for v in classifiers:
# 개별 모델 학습
v.fit(X_train, y_train)
# 예측 수행
pred = v.predict(X_test)
# 클래스 이름 추출
class_name = v.__class__.__name__
print(f"클래스 : {class_name}")
print(f"정확도 : {accuracy_score(y_test, pred)}")

결과 해석
- 개별 모델보다
- 보팅 앙상블 모델의 성능이 더 안정적이거나 높게 나타나는 경우가 많음
이는 모델 간 오류가 상호 보완되었기 때문입니다.
결론
이번 글에서는 앙상블 학습의 기본 개념과 보팅 기법을 정리했습니다.
핵심 요약
- 앙상블 학습은 여러 모델의 예측을 결합하여 성능을 향상시키는 기법입니다.
- 서로 다른 유형의 모델을 섞는 것이 중요합니다.
- 보팅은 가장 직관적인 앙상블 방식입니다.
- 실무에서는 소프트 보팅이 하드 보팅보다 더 자주 사용됩니다.
- VotingClassifier는 간단한 코드로 앙상블을 구현할 수 있는 유용한 도구입니다.
다음 글에서는
👉 **배깅(Bagging)과 랜덤 포레스트(Random Forest)**를 통해
앙상블이 어떻게 분산을 줄이고 과적합을 완화하는지 살펴보겠습니다.
'Programming' 카테고리의 다른 글
| 앙상블 학습 3편: 부스팅(Boosting) · GBM · XGBoost · LightGBM 완전 정리 (0) | 2025.12.20 |
|---|---|
| 앙상블 학습 2편: 배깅(Bagging)과 랜덤 포레스트(Random Forest) 완전 이해 (0) | 2025.12.17 |
| 결정트리 속성 중요도(Feature Importance)와 과적합(Overfitting) 쉽게 이해하기 (0) | 2025.12.16 |
| 결정트리(Decision Tree) 완전 정리: 개념부터 앙상블, 하이퍼파라미터, 시각화까지 (0) | 2025.12.16 |
| [분류 성능 평가지표 4편] 피마 인디언 당뇨병 예측 실습으로 이해하는 분류 평가의 모든 것 (2) | 2025.12.13 |
