susinlee 님의 블로그
앙상블 본문
앙상블
- 여러 개의 머신러닝 모델을 조합하여 더 나은 예측 성능을 얻는 기법
- 하나의 모델보다 여러 개의 모델을 조합하면 일반적으로 과적합 방지 및 성능 향상 효과를 얻을 수 있음
- 대표적인 기법: 보팅, 배깅, 부스팅, 스태킹
1. 보팅(Voting)
- 서로 다른 모델을 여러 개 조합하여 최종 예측을 하는 방법
- 특징
- 여러 개의 다양한 모델을 조합하여 예측
- 모델들이 서로 다른 알고리즘을 사용
- 예측 방식에 따라 하드 보팅과 소프트 보팅이 있음
- 보팅의 종류
- 하드 보팅 → 다수결 방식
- 각 모델이 예측한 결과 중 가장 많이 선택된 클래스를 최종 결과로 함
- 소프트 보팅 → 확률 평균 방식
- 각 모델이 예측한 확률 값의 평균을 계산한 후, 가장 높은 확률을 가진 클래스를 선택
- 하드 보팅 → 다수결 방식
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifier
from sklearn.datasets import load_iris
# 데이터 셋 로드
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 개별 모델 정의
xgb = XGBClassifier()
lgbm = LGBMClassifier(verbose=-1)
catboost = CatBoostClassifier(verbose=0)
rf = RandomForestClassifier()
# 보팅 분류기 (소프트 보팅)
voting_clf = VotingClassifier(
estimators=[
('xgb', xgb), # 앞의 모델 이름은 자유롭게 써도 됨
('lgbm', lgbm),
('catboost', catboost),
('rf', rf)
],
voting='soft' # 확률 기반 평균, 'hard': 최빈값을 예측
# weight=[3, 2, 2, 1] # XGBoost에 높은 가중치 부여
)
# 모델 학습
voting_clf.fit(X_train, y_train)
# 예측 및 평가
y_pred = voting_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Voting Classifier Accuracy: {accuracy:.4f}')
# 개별 모델과 비교
models = {
'XGBoost': xgb,
'LightGBM': lgbm,
'CatBoost': catboost,
'RandomForest': rf
}
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f'{name} Accuracy: {acc:.4f}')
2. 배깅(Bagging)
- 동일한 모델을 여러 개 훈련하여 예측 결과를 평균 내는 방식
- 배깅의 특징
- 같은 모델을 여러 개 훈련하지만, 훈련 데이터가 서로 다름
- 데이터 샘플링 시 중복 허용(bootstrap sampling) → 일부 데이터가 반복적으로 선택될 수 있음
- 개별 모델을 독립적으로 학습하여 분산을 줄이는 효과가 있음
from sklearn.ensemble import BaggingClassifier
# 배깅 분류기 생성 (기본 모델: 결정 트리)
bagging_clf = BaggingClassifier(
estimator=RandomForestClassifier(),
n_estimators=10, # 10개의 모델 사용
bootstrap=True, # 중복 샘플링 허용
random_state=42
)
# 모델 학습
bagging_clf.fit(X_train, y_train)
# 예측 및 평가
y_pred = bagging_clf.predict(X_test)
print(f'Bagging Classifier Accuracy: {accuracy_score(y_test, y_pred):.4f}')
보팅 | 배깅 | |
모델 | 서로 다른 모델 사용 가능 | 같은 모델을 여러 개 사용 |
데이터 샘플링 | 원본 데이터 그대로 사용 | 데이터 샘플을 부트스트랩 샘플링 (중복 포함) |
결합 방식 | 다수결(hard) 또는 확률 평균(soft) |
평균 또는 다수결 |
대표적인 알고리즘 | VotingClassifier | BaggingClassifier |
재밌는 점
랜덤포레스트 자체가 배깅을 기반으로 한 모델임에도 배깅에 랜덤포레스트를 기본 모델로 사용할 수 있음!
배깅에 배깅...
→ 효율적이지 않으며 랜덤포레스트 n_estimators 파라미터에 높은 값을 쓰는 게 더 낫다!
2. 스태킹(Stacking)
- 여러 개의 서로 다른 개별 모델(기본 학습기, Base Models)을 훈련
- 각 모델의 예측 결과를 새로운 데이터셋(메타 피처, Meta Features)으로 변환
- 이 메타 피처를 이용해 최종 예측을 수행하는 메타 모델(Meta Learner)을 훈련
- 1단계 모델
- 서로 다른 머신러닝 알고리즘을 사용하여 다양한 특성을 학습
- 예: 선형 회귀, 랜덤 포레스트, XGBoost 등
- 2단계 모델
- 1단계 모델이 생성한 예측값을 입력으로 받아 최종 예측을 수행
- 일반적으로 선형 회귀, 로지스틱 회귀, 신경망 등이 사용됨
- 역할: 1단계 모델의 약점을 보완하고, 가장 적절한 조합을 찾음
- 다양한 모델 조합 가능
- 개별 모델보다 성능 향상 기능
- 과적합 위험 존재 → 교차 검증 필수
- 훈련 시간이 길고 계산 비용이 큼
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 데이터 준비
X, y = load_some_data() # 데이터셋 로드 (사용자 정의 함수)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 1단계 모델 (Base Models)
model_1 = RandomForestClassifier(n_estimators=100, random_state=42)
model_2 = GradientBoostingClassifier(n_estimators=100, random_state=42)
# 모델 훈련
model_1.fit(X_train, y_train)
model_2.fit(X_train, y_train)
# 1단계 모델 예측값 생성 (메타 데이터)
meta_train = np.column_stack([
model_1.predict_proba(X_train)[:, 1],
model_2.predict_proba(X_train)[:, 1]
])
meta_test = np.column_stack([
model_1.predict_proba(X_test)[:, 1],
model_2.predict_proba(X_test)[:, 1]
])
# 2단계 모델 (Meta Model)
meta_model = LogisticRegression()
meta_model.fit(meta_train, y_train)
# 최종 예측
final_pred = meta_model.predict(meta_test)
# 성능 평가
print("Stacking Accuracy:", accuracy_score(y_test, final_pred))
- 스태킹은 서로 다른 모델을 결합하여 최적의 조합을 찾는 앙상블 기법
- 기본 모델의 예측값을 메타 모델이 학습하여 최종 예측을 수행
- 계산 비용이 크지만, 성능 향상 가능성이 높음
- 데이터 분할 및 교차 검증을 통해 과적합을 방지하는 것이 중요
'학습 > 머신러닝' 카테고리의 다른 글
k-NN, 선형 모델, 나이브 베이즈 분류 (0) | 2025.02.09 |
---|---|
손실, 비용, 목적 함수 (0) | 2025.02.09 |
결측치 (0) | 2025.01.30 |
회귀 (0) | 2025.01.30 |
분류 (0) | 2025.01.29 |