본문 바로가기
정보/IT 지식 정보

앙상블 학습이란? 보팅 분류기로 모델 성능 높이기 [4편]

by 안다니. 2026. 4. 2.
반응형
 
앙상블 보팅

 


앙상블 학습이란? 보팅 분류기로 모델 성능 높이기

다수결 투표 원리부터 VotingClassifier 구현까지, 앙상블의 기초를 코드로 익힙니다

 

학습 목표: 여러 분류기를 결합하여 단일 모델보다 높은 성능을 달성하는 앙상블 학습의 기초를 이해하고, VotingClassifier를 활용한 실무 구현 능력을 습득합니다.

1. 앙상블 학습이란?

앙상블 학습(Ensemble Learning)은 여러 개의 약한 학습기(Weak Learner)를 결합하여 하나의 강한 학습기(Strong Learner)를 만드는 기계학습 전략입니다. 단일 모델의 약점을 보완하고 예측 성능을 비약적으로 향상시킵니다.

💡 핵심 원리: 여러 모델이 투표하는 민주주의 방식으로 결정을 내리면, 개별 모델의 오류가 상쇄되어 더 안정적인 예측이 가능합니다.

앙상블 학습의 장점:

  • 편향(Bias)과 분산(Variance) 동시 감소
  • 과적합(Overfitting) 완화
  • 모델 안정성 및 일반화 성능 향상
  • 이상치에 대한 견고성(Robustness) 증가

2. 다수결 투표(Majority Voting) 원리

보팅의 기본 원리는 간단합니다. 여러 분류기가 각각 예측한 결과 중 가장 많은 투표를 받은 클래스를 최종 예측값으로 선택합니다.

import numpy as np

# 3개 분류기의 예측 결과: [0, 0, 1]
# 확률 가중치: [0.2, 0.2, 0.6]
result = np.argmax(np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6]))

# 결과: 0 (가중 투표에서 클래스 0이 0.4, 클래스 1이 0.6)
print(result)  # 1

동작 방식:
1. 각 분류기가 독립적으로 예측 수행
2. Hard Voting: 다수결로 최빈 클래스 선택 또는 Soft Voting: 예측 확률의 평균으로 결정
3. 최종 예측값 도출

3. 개별 분류기 생성

효과적인 앙상블을 위해서는 상이한 특성을 가진 다양한 분류기들을 선택해야 합니다. 로지스틱 회귀, 결정 트리, KNN을 사용합니다.

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier

# 로지스틱 회귀: 선형 모델, 높은 편향
clf1 = LogisticRegression(penalty='l2', C=0.001, random_state=1)

# 결정 트리: 깊이 제한으로 약한 분류기 생성
clf2 = DecisionTreeClassifier(max_depth=1, criterion='entropy', random_state=0)

# KNN: 국소적 영역 기반 분류
clf3 = KNeighborsClassifier(n_neighbors=1, p=2, metric='minkowski')

4. VotingClassifier 구현

scikit-learn의 VotingClassifier를 사용하여 여러 분류기를 하나의 앙상블 모델로 통합합니다.

from sklearn.ensemble import VotingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

# 파이프라인: 표준화 + 로지스틱 회귀
pipe1 = Pipeline([('scl', StandardScaler()),
                   ('clf', LogisticRegression(penalty='l2', C=0.001, random_state=1))])

# 파이프라인: 표준화 + KNN
pipe3 = Pipeline([('scl', StandardScaler()),
                   ('clf', KNeighborsClassifier(n_neighbors=1, p=2, metric='minkowski'))])

# VotingClassifier: Soft Voting으로 확률 평균
vc = VotingClassifier(
    estimators=[('lr', pipe1),
                ('dt', clf2),
                ('knn', pipe3)],
    voting='soft'
)

# 모델 학습
vc.fit(X_train, y_train)

⚠️ 주의사항: 파이프라인(Pipeline)을 사용하여 각 분류기에 적절한 전처리(표준화)를 적용합니다. 결정 트리는 표준화가 불필요합니다.

5. ROC 곡선으로 성능 비교

개별 분류기와 VotingClassifier의 성능을 ROC 곡선으로 시각화하여 비교합니다. AUC 값이 높을수록 분류 성능이 우수합니다.

from sklearn.metrics import roc_curve, auc

# 각 분류기의 예측 확률
probas = vc.predict_proba(X_test)[:, 1]

# ROC 곡선 계산
fpr, tpr, _ = roc_curve(y_test, probas)
roc_auc = auc(fpr, tpr)

print(f'VotingClassifier AUC: {roc_auc:.3f}')

6. 하이퍼파라미터 최적화

GridSearchCV를 사용하여 VotingClassifier의 구성 분류기들의 하이퍼파라미터를 동시에 최적화합니다.

from sklearn.model_selection import GridSearchCV

# 탐색할 파라미터 그리드
params = {
    'decisiontreeclassifier__max_depth': [1, 2],
    'pipeline-1__clf__C': [0.001, 0.1, 100.0]
}

# GridSearchCV 실행
grid = GridSearchCV(estimator=vc, param_grid=params, cv=10, scoring='roc_auc')
grid.fit(X_train, y_train)

# 최적 파라미터 확인
print(f'최적 파라미터: {grid.best_params_}')
print(f'최적 AUC: {grid.best_score_:.3f}')

📌 요점 정리:
• 앙상블 학습은 여러 약한 학습기를 결합하여 강한 학습기를 만드는 전략
• 다수결 투표로 최종 예측값 결정 (Hard/Soft Voting)
• VotingClassifier로 간편하게 구현 가능
• 파이프라인을 활용하여 각 분류기에 맞는 전처리 적용
• GridSearchCV로 동시에 여러 하이퍼파라미터 최적화

다음 편 예고:

[5편] 배깅과 부스팅 — 단일 결정 트리의 과적합을 해결하는 BaggingClassifier와 AdaBoost의 완전한 비교 분석

반응형

댓글