앙상블 : 전체적인 어울림이나 통일을 뜻하는 프랑스어이다.
머신러닝에서의 앙상블
- 여러 개의 모델을 결합하여 단일 모델보다 더 나은 성능을 얻기 위한 방법
- 다양한 모델의 예측을 결합해서 성능을 향상시키고, 각 모델의 약점을 보완한다
- 캐글(Kaggle)과 같은 많은 기계학습 경쟁에서 상위순위이다
앙상블 방법
- 병렬 앙상블 - 여러 모델이 독립적으로 학습됨. 예) 보팅, 배깅
- 순차 앙상블 - 모델들이 순차적으로 학습하며, 이전 모델의 오류를 보완하는 방식. 예) 부스팅
- 스태킹 - 개별 모델의 예측 결과를 다시 최종 모델에 입력으로 제공하여 최종 예측을 내리는 방법
1. 앙상블 알고리즘 종류
1.1 배깅(Bagging, Bootstrap Aggregating)
- 여러 모델을 독립적으로 학습한 후 예측 결과를 결합함.
- 데이터의 일부를 랜덤하게 샘플링(부트스트랩)해 여러 모델을 훈련함.
- 최종 결과는 **평균(회귀)**이나 **다수결(분류)**로 결정함.
대표 알고리즘
- 랜덤 포레스트(Random Forest): 여러 의사결정 트리를 활용해 예측을 수행하고 투표로 결과를 도출함.
1.2 부스팅(Boosting)
- 이전 모델이 틀린 예측에 가중치를 부여해 순차적으로 학습함.
- 각 모델은 이전 모델의 오류를 보완하며 성능을 개선함.
- 최종 예측은 여러 모델의 결과를 가중 합산해 도출함.
대표 알고리즘
- AdaBoost: 예측에 실패한 데이터에 높은 가중치를 부여해 학습함.
- XGBoost: GBM을 개선한 버전으로 병렬 처리와 정규화를 지원함.
- LightGBM: 대용량 데이터 처리에 최적화된 부스팅 알고리즘임.
1.3 스태킹(Stacking)
- 서로 다른 모델의 예측 결과를 메타 모델에 입력해 최종 결정을 내림.
- 여러 모델의 예측을 조합해 최종 메타 모델이 더 나은 성능을 제공하도록 유도함.
1.4 보팅(Voting)
- 하드 보팅과 소프트 보팅으로 나뉨.
- 하드 보팅은 각 모델의 예측을 다수결로 결정함.
- 소프트 보팅은 모델의 예측 확률을 평균내어 가장 높은 확률을 가진 클래스를 선택함.
2. 앙상블 종류 비교
구분 | 배깅(Bagging) | 부스팅(Boosting) | 보팅(Voting) |
학습 방식 | 병렬 학습 | 순차 학습 | 독립된 모델 결합 |
목표 | 분산 감소 | 편향 감소 | 다수결 또는 확률 평균으로 결합 |
대표 알고리즘 | 랜덤 포레스트 | XGBoost, LightGBM | 하드 보팅, 소프트 보팅 |
앙상블 코드 예시
# 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings(action='ignore')
%config InlineBackend.figure_format = 'retina'
# 데이터 불러오기
path = 'admission_simple.csv'
data = pd.read_csv(path)
# target 확인
target = 'ADMIT'
# 데이터 분리
x = data.drop(columns=target)
y = data.loc[:, target]
# 모듈 불러오기
from sklearn.model_selection import train_test_split
# 7:3으로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
# 모듈 불러오기
from sklearn.preprocessing import MinMaxScaler
# 정규화
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train_s = scaler.transform(x_train)
x_test_s = scaler.transform(x_test)
여기까지는 모델링전 데이터 준비
# 라이브러리 불러오기
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.metrics import *
#KNN 알고리즘
# 선언하기
model = KNeighborsClassifier(n_neighbors=5)
# 학습하기
model.fit(x_train_s, y_train)
# 예측하기
y_pred = model.predict(x_test_s)
# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
#Decision Tree 알고리즘
# 선언하기
model = DecisionTreeClassifier(max_depth=5, random_state=1)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 5단계: 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
# Logistic Regression 알고리즘
# 선언하기
model = LogisticRegression()
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 5단계: 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
**4) Random Forest**
- Random Forest 알고리즘으로 모델링하고 성능을 확인합니다.
# 선언하기
model = RandomForestClassifier(max_depth=5, random_state=1)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 5단계: 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
# Feature 중요도 확인
plt.figure(figsize=(5, 5))
plt.barh(list(x), model.feature_importances_)
plt.show()
#XGBoost**
# 선언하기
model = XGBClassifier(max_depth=5, random_state=1)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
# Feature 중요도 확인
plt.figure(figsize=(5, 5))
plt.barh(list(x), model.feature_importances_)
plt.show()
# LightGBM**
# 선언하기
model = LGBMClassifier(max_depth=5, random_state=1, verbose=-1)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
# Feature 중요도 시각화
plt.figure(figsize=(5, 5))
plt.barh(list(x), model.feature_importances_)
plt.show()
하이퍼파라미터(Hyperparameter)**
는 머신러닝 모델의 성능에 영향을 미치는 중요한 값으로, 훈련 전에 설정해야 하는 매개변수임. 하이퍼파라미터는 모델의 구조와 학습 과정에 영향을 주며, 훈련 중에 자동으로 학습되지 않음. 주어진 데이터와 문제 유형에 맞게 최적의 하이퍼파라미터를 찾는 과정이 매우 중요함.
파라미터 | 설명 |
learning_rate | 0 |
n_estimators | weak learner(약한 학습기)의 개수. 많을수록 성능이 좋아질 수 있지만, 너무 많으면 학습 시간이 오래 걸림. 기본값은 100 |
min_child_weight | 트리가 추가적으로 분할될지 결정하는 데 필요한 데이터의 가중치 합. 값이 클수록 분할을 제한함. 기본값은 1 |
gamma | 트리에서 추가적으로 분할할지 결정하기 위해 필요한 최소 손실 감소량. 값이 클수록 분할이 적게 일어남. 기본값은 0 |
max_depth | 트리의 최대 깊이를 설정해 모델 복잡도를 조절. 값이 클수록 복잡한 모델이 되며 과적합 위험이 있음. 기본값은 6 |
sub_sample | weak learner가 학습에 사용하는 데이터 샘플링 비율. 1보다 작게 설정할 경우 과적합 방지에 유리. 기본값은 1 (전체 데이터 사용) |
colsample_bytree | 각 트리 생성 시 사용할 Feature의 비율을 조절. 기본값은 1 (모든 Feature 사용) |
reg_lambda | L2 정규화 적용값으로, Feature가 많은 경우 값이 커지면 과적합 위험을 줄일 수 있음. 기본값은 1 |
reg_alpha | L1 정규화 적용값으로, Feature가 많은 경우 값이 커지면 과적합 위험을 줄일 수 있음. 기본값은 0 |
- learning_rate: 학습률이 너무 크면 최적값을 지나칠 수 있고, 너무 작으면 학습 속도가 느려질 수 있음.
- n_estimators: 약한 학습기를 몇 개 사용할지 결정하며, 너무 많이 설정하면 계산 비용이 증가함.
- max_depth: 트리의 깊이를 제한해 과적합을 방지하지만, 너무 작으면 과소적합될 수 있음.
- gamma: 트리의 분할을 최소한의 손실 감소가 있을 때만 허용해 모델을 단순하게 유지함.
- sub_sample: 전체 데이터 중 일부만 사용해 학습함으로써 과적합을 방지할 수 있음.