logo

앙상블

앙상블 학습

  • 앙상블: 여러 모델의 예측을 결합하는 방법
  • 한 모델의 판단보다 여러 모델의 판단을 모아 안정성 향상
  • 분류에서는 다수결이나 확률 평균 사용
  • 회귀에서는 여러 예측값의 평균 사용
  • 종류
    • 배깅
    • 부스팅
    • 스태킹

여러 모델의 결정 경계를 결합하는 앙상블 예시

왜 단일 모델보다 안정적인가

  • 단일 모델은 특정 데이터 분할이나 잡음에 흔들릴 수 있음
  • 서로 다른 모델의 오류가 완전히 같지는 않음
  • 여러 예측을 결합하면 우연한 오류를 줄일 수 있음
  • 성능뿐 아니라 변동성 감소도 중요한 장점

배깅

  • 배깅(bagging): bootstrap aggregation의 약자
  • 데이터셋에서 동일한 크기의 부분집합들을 샘플링
  • 부분집합으로 여러 개의 약한 모델을 학습
  • 각 모델은 조금씩 다른 데이터를 보고 학습
  • 최종 예측은 여러 모델의 평균 또는 다수결
  • 대표 모델: 랜덤 포레스트(random forest)

배깅에서 여러 부분집합과 모델을 결합하는 구조

랜덤 포레스트 분류 실습

  • 여러 결정트리를 학습해 예측을 결합
  • 단일 결정트리보다 과대적합에 강한 편
from sklearn.ensemble import RandomForestClassifier

rf_clf = RandomForestClassifier(n_estimators=200, random_state=42)
rf_clf.fit(X_train, y_train)

y_pred_rf = rf_clf.predict(X_test)
accuracy_score(y_test, y_pred_rf)

랜덤 포레스트 변수 중요도

  • 변수 중요도는 모델이 어떤 변수를 많이 활용했는지 확인하는 값
  • 높은 중요도는 예측에 자주 기여했다는 의미
  • 인과관계를 바로 의미하지는 않음
import seaborn as sns
import matplotlib.pyplot as plt

importance = pd.DataFrame({
    "feature": X.columns,
    "importance": rf_clf.feature_importances_,
}).sort_values("importance", ascending=False).head(10)

sns.barplot(data=importance, x="importance", y="feature")

부스팅

  • 부스팅(boosting): 약한 모델을 순서대로 학습해 앞 모델의 오류를 보완하는 방법
  • 앞 단계에서 틀린 부분에 다음 모델이 더 집중
  • 성능이 강력하지만 학습 설정에 민감할 수 있음
  • 대표 모델: Gradient Boosting, XGBoost, LightGBM

부스팅에서 순차적으로 모델 오류를 보완하는 구조

AdaBoost

  • 이전 모델에서 잘못 분류한 사례에 가중치를 주어 다음 모델을 학습
from sklearn.ensemble import AdaBoostClassifier

ada = AdaBoostClassifier(n_estimators=100, random_state=42)
ada.fit(X_train, y_train)

y_pred_ada = ada.predict(X_test)
accuracy_score(y_test, y_pred_ada)

AdaBoost에서 잘못 분류한 사례의 가중치를 높이는 과정

경사 부스트

  • 경사 부스트(gradient boost): 경사하강법을 부스팅으로 구현한 것
  • 이전 모델의 예측 오차를 다음 모델로 예측
  • 모델을 추가할 때마다 예측 오차가 점진적으로 줄어듦
from sklearn.ensemble import GradientBoostingClassifier

gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb.fit(X_train, y_train)

y_pred_gb = gb.predict(X_test)
accuracy_score(y_test, y_pred_gb)

경사 부스트에서 반복이 진행되며 오차가 줄어드는 과정

스태킹

  • 스태킹(stacking): 여러 모델의 예측을 다시 입력으로 사용하는 방식
  • 1단계 모델들이 각자 예측
  • 2단계 모델이 그 예측 결과를 보고 최종 판단
  • 서로 성격이 다른 모델을 조합할 때 활용

스태킹에서 기본 모델의 예측을 메타 모델이 결합하는 구조

StackingClassifier 실습

  • 결정트리와 KNN의 예측을 결합
  • 최종 모델은 얕은 결정트리 사용
  • 서로 다른 모델의 장점을 함께 활용
from sklearn.ensemble import StackingClassifier

stack_clf = StackingClassifier(
    estimators=[
        ("tree", DecisionTreeClassifier(max_depth=4, random_state=42)),
        (
            "knn",
            make_pipeline(
                StandardScaler(),
                KNeighborsClassifier(n_neighbors=5),
            ),
        ),
    ],
    final_estimator=DecisionTreeClassifier(max_depth=2, random_state=42),
    cv=5,
)

stack_clf.fit(X_train, y_train)
y_pred_stack = stack_clf.predict(X_test)
accuracy_score(y_test, y_pred_stack)

앙상블의 동향

  • 표 형태의 데이터에서는 의사결정나무에 기반한 앙상블이 주류
  • 특히 경사부스팅 계열 알고리즘인 XGBoost, LightGBM, CatBoost가 각광
  • 딥러닝도 일종의 앙상블로 이해할 수 있음
  • 앙상블은 성능은 높지만 계산량이 많음
  • 예측 정확도보다 계산량이나 속도가 더 중요하면 쓰지 않을 때도 많음
  • 명시적인 앙상블 기법은 아니어도 비슷한 아이디어는 널리 사용됨
    • 예: 넷플릭스 추천 시스템은 한 사용자에게 복수의 추천 알고리즘을 사용
Previous
의사결정 나무