move84

머신러닝 기초 - 부트스트랩 집계 (Bagging) 개념 본문

머신러닝

머신러닝 기초 - 부트스트랩 집계 (Bagging) 개념

move84 2025. 2. 21. 22:58
반응형

🔎 개요 및 소개
머신러닝에서 모델의 안정성과 예측력을 높이기 위한 앙상블(Ensemble) 기법 중 하나인 부트스트랩 집계(Bootstrap Aggregating, Bagging)는 단일 모델의 한계를 극복하는 데 큰 역할을 한다. Bagging은 주어진 데이터셋에서 여러 개의 샘플을 부트스트랩(bootstrap) 방식으로 추출해 각각의 모델을 학습시키고, 최종적으로 여러 모델의 예측 결과를 집계(aggregating)하여 결론을 내는 방법이다. 이 과정은 모델의 분산을 줄이고 과적합(Overfitting)을 방지하는 데 효과적이다. 본 글에서는 Bagging의 기본 개념과 원리, 그리고 파이썬 예제를 통해 초보자가 이해하기 쉽게 설명한다.


🔥 Bagging의 원리와 동작 방식
Bagging은 주어진 학습 데이터셋에서 중복을 허용하여 여러 개의 부트스트랩 샘플을 생성한다. 각 샘플은 원래 데이터셋의 일부를 포함하며, 이를 바탕으로 동일한 알고리즘(예: Decision Tree, k-NN 등)을 이용해 개별 모델을 학습시킨다. 이후 각 모델의 예측 결과를 평균(Regression) 또는 다수결(Voting, Classification) 방식으로 집계해 최종 예측값을 도출한다.
이 방식은 단일 모델에 비해 데이터의 다양한 부분을 반영할 수 있으며, 모델 간의 상호 보완성을 통해 전체 예측 성능을 높인다. Bagging은 특히 고분산(high-variance) 모델에서 그 효과가 두드러지며, 대표적인 예로 Random Forest가 있다. Random Forest는 여러 결정 트리(Decision Tree)를 Bagging 방식으로 학습시키고, 각 트리의 예측을 평균하거나 다수결로 결합하여 최종 예측을 수행한다.


💻 파이썬 코드 예시: BaggingClassifier를 이용한 분류
아래 코드는 사이킷런(scikit-learn)의 BaggingClassifier를 활용하여 아이리스(Iris) 데이터셋에 Bagging을 적용하는 예제다. 이 예제에서는 기본 분류기(base estimator)로 결정 트리(Decision Tree)를 사용하고, 여러 개의 결정 트리 모델을 학습시켜 다수결 투표(voting)를 통해 최종 예측 결과를 도출한다.

# 필요한 라이브러리 불러오기
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 아이리스 데이터셋 로드
iris = load_iris()
X = iris.data
y = iris.target

# 학습/테스트 데이터 분할 (70% 학습, 30% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 기본 분류기(Decision Tree) 생성
base_clf = DecisionTreeClassifier(random_state=42)

# BaggingClassifier 생성: n_estimators=50개의 결정 트리 모델을 사용
bagging_clf = BaggingClassifier(base_estimator=base_clf, n_estimators=50, random_state=42)
bagging_clf.fit(X_train, y_train)

# 테스트 데이터에 대해 예측 수행
y_pred = bagging_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("BaggingClassifier 정확도:", accuracy)

# 각 결정 트리의 예측 결과 중 일부를 확인 (예: 첫 5개의 모델 예측)
sample_preds = [estimator.predict(X_test[:5]) for estimator in bagging_clf.estimators_[:5]]
print("첫 5개 모델의 예측 결과 (첫 5개 샘플):", sample_preds)

# Bagging의 효과를 시각화하기 위한 간단한 예시: 결정 경계 비교 (2차원 데이터 예시)
from sklearn.datasets import make_moons
from matplotlib.colors import ListedColormap

# 2차원 moon 데이터 생성
X_moons, y_moons = make_moons(n_samples=300, noise=0.25, random_state=42)
X_train_moons, X_test_moons, y_train_moons, y_test_moons = train_test_split(X_moons, y_moons, test_size=0.3, random_state=42)

# 단일 결정 트리와 BaggingClassifier 비교
tree_clf = DecisionTreeClassifier(random_state=42)
tree_clf.fit(X_train_moons, y_train_moons)
bagging_moons = BaggingClassifier(base_estimator=DecisionTreeClassifier(random_state=42), n_estimators=50, random_state=42)
bagging_moons.fit(X_train_moons, y_train_moons)

# 결정 경계 그리기 함수
def plot_decision_boundary(clf, X, y, ax, title):
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 200), np.linspace(y_min, y_max, 200))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    ax.contourf(xx, yy, Z, alpha=0.3, cmap=ListedColormap(['red', 'blue']))
    ax.scatter(X[:, 0], X[:, 1], c=y, cmap=ListedColormap(['red', 'blue']), edgecolor='k', s=20)
    ax.set_title(title)

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
plot_decision_boundary(tree_clf, X_train_moons, y_train_moons, axes[0], "단일 결정 트리")
plot_decision_boundary(bagging_moons, X_train_moons, y_train_moons, axes[1], "BaggingClassifier")
plt.show()

이 코드는 아이리스 데이터셋을 이용해 BaggingClassifier의 정확도를 평가하고, make_moons 데이터를 활용하여 단일 결정 트리와 BaggingClassifier의 결정 경계를 비교하는 예제다. Bagging을 적용하면 단일 모델에 비해 예측 성능이 안정되고, 과적합을 줄일 수 있음을 확인할 수 있다.


📊 Bagging의 장점과 단점
Bagging은 여러 모델의 예측 결과를 결합해 전체 모델의 분산을 줄이고, 안정성을 높이는 데 효과적이다.

  • 장점:
    • 데이터의 부트스트랩 샘플을 활용해 다양한 모델을 학습하므로, 단일 모델의 불안정한 예측을 보완할 수 있다.
    • 과적합(Overfitting)을 줄여 모델의 일반화 성능을 향상시킨다.
    • 모델의 분산(Variance)을 감소시켜 예측의 신뢰도를 높인다.
  • 단점:
    • 여러 모델을 학습해야 하므로 계산 비용이 증가한다.
    • 해석력(Interpretability)이 떨어질 수 있다. 여러 모델의 결과를 집계하기 때문에 개별 모델의 결정 과정이 불투명해진다.

🔍 초보자를 위한 실습 및 이해 포인트
초보자가 Bagging을 이해하고 활용하기 위해 다음의 실습 포인트를 참고하면 좋다.

  1. 기본 아이디어 체험:
    • 동일한 데이터셋에서 여러 번 샘플링하여 부트스트랩 샘플을 생성한 후, 각각의 모델이 어떻게 다른 예측을 내는지 확인해본다.
  2. 단일 모델과 비교:
    • 단일 결정 트리와 BaggingClassifier의 예측 결과와 결정 경계를 비교해, Bagging이 어떻게 분산을 줄이고 예측 성능을 향상시키는지 실습해본다.
  3. 하이퍼파라미터 실험:
    • n_estimators(모델 수) 값을 변경해보며, 모델의 성능과 계산 비용의 관계를 이해한다.
  4. 다양한 데이터셋 적용:
    • 아이리스 데이터셋, make_moons와 같이 서로 다른 데이터셋에 Bagging을 적용해보고, 결과를 비교 분석해본다.

이러한 실습 과정을 통해 Bagging의 기본 원리와 장점을 체험하며, 모델 앙상블 기법에 대한 이해를 높일 수 있다.


📚 주요 용어 정리
이번 블로그에서 다룬 주요 용어들을 간단히 정리하면 다음과 같다.

  • 부트스트랩(bootstrap): 주어진 데이터셋에서 중복을 허용해 여러 샘플을 무작위로 추출하는 방법.
  • 앙상블(Ensemble): 여러 모델의 예측 결과를 결합하여 최종 예측을 내는 기법.
  • Bagging (Bootstrap Aggregating): 부트스트랩 기법을 사용해 여러 모델을 학습시키고, 이들의 예측을 집계해 결과를 도출하는 앙상블 기법.
  • 과적합 (Overfitting): 모델이 학습 데이터에 지나치게 맞춰져 새로운 데이터에 대한 일반화 성능이 저하되는 현상.
  • 결정 트리 (Decision Tree): 데이터를 분할하는 규칙을 만들어 예측하는 트리 기반 모델.

🧪 실제 프로젝트에서의 Bagging 활용 방안
실무에서는 Bagging 기법이 다양한 분야에서 활용된다. 예를 들어, 금융 분야에서는 신용 평가 모델에서 단일 모델의 불안정한 예측을 보완하기 위해 Bagging을 적용할 수 있다. 또한, 의료 데이터 분석이나 이미지 분류 문제에서도 여러 모델의 예측을 집계해 보다 안정적인 결과를 도출하는 데 유용하다. Random Forest는 대표적인 Bagging 기반 알고리즘으로, 수많은 결정 트리를 학습시켜 평균 또는 다수결 방식으로 최종 예측을 내며 높은 성능을 보여준다.
실제 프로젝트에서는 데이터의 크기, 계산 비용, 모델 해석력 등을 고려해 단일 모델과 앙상블 모델의 성능을 비교 분석한 후, 최적의 모델을 선택하는 것이 중요하다.


🔍 마무리 및 요약
부트스트랩 집계(Bagging)는 머신러닝에서 모델의 분산을 줄이고, 예측의 안정성을 높이기 위한 효과적인 앙상블 기법이다. 여러 개의 부트스트랩 샘플을 생성해 다양한 모델을 학습시키고, 이들의 예측 결과를 집계함으로써 단일 모델의 한계를 극복할 수 있다. 초보자는 위의 파이썬 예제와 실습 포인트를 참고해 Bagging의 원리를 직접 체험하고, 단일 모델과 비교하며 그 효과를 확인해볼 필요가 있다. 다양한 데이터셋에 Bagging을 적용해보고, 하이퍼파라미터 실험을 통해 최적의 모델 구성을 찾는 과정은 머신러닝 프로젝트의 성공적인 수행에 큰 도움이 된다.

#부트스트랩집계 #앙상블기법 #Bagging #머신러닝기초

반응형