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

왜 단일 모델보다 안정적인가
- 단일 모델은 특정 데이터 분할이나 잡음에 흔들릴 수 있음
- 서로 다른 모델의 오류가 완전히 같지는 않음
- 여러 예측을 결합하면 우연한 오류를 줄일 수 있음
- 성능뿐 아니라 변동성 감소도 중요한 장점
배깅
- 배깅(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)

경사 부스트
- 경사 부스트(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가 각광
- 딥러닝도 일종의 앙상블로 이해할 수 있음
- 앙상블은 성능은 높지만 계산량이 많음
- 예측 정확도보다 계산량이나 속도가 더 중요하면 쓰지 않을 때도 많음
- 명시적인 앙상블 기법은 아니어도 비슷한 아이디어는 널리 사용됨
- 예: 넷플릭스 추천 시스템은 한 사용자에게 복수의 추천 알고리즘을 사용