본문 바로가기
AI/Machine-Learning

앙상블(Ensemble)

by Wikinist 2023. 8. 30.

앙상블(Ensemble)은 머신러닝에서 여러 개의 모델을 조합하여 하나의 예측 모델을 생성하는 기법을 말합니다. 이는 단일 모델보다 더 나은 예측 성능을 달성하기 위해 사용됩니다. 앙상블은 다양한 모델의 다양한 예측을 결합하여 모델의 강점을 취하고 약점을 보완하여 더 정확하고 안정적인 예측을 할 수 있도록 도와줍니다.

앙상블은 크게 두 가지 유형으로 나뉩니다: 동일 모델의 다양한 버전을 결합하는 방법과 다양한 유형의 모델을 결합하는 방법입니다.

동일 모델의 다양한 버전 결합

이 방법은 하나의 머신러닝 알고리즘을 사용하여 다양한 버전의 모델을 생성하고, 이를 결합하여 예측을 수행하는 방식입니다. 이러한 방법은 모델을 다양하게 조정함으로써 과대적합을 줄이고 안정적인 예측을 도출할 수 있습니다.

배깅(Bagging)

배깅은 "Bootstrap Aggregating"의 약자로, 같은 모델의 다양한 버전을 생성하고 이들을 조합하여 예측을 수행하는 방법입니다. 주로 분류와 회귀 문제에 사용됩니다.

배깅의 주요 특징은 다음과 같습니다.

훈련 데이터의 부트스트랩 샘플링: 주어진 훈련 데이터로부터 복원 추출을 통해 다양한 데이터 부분집합을 생성합니다. 각 부분집합은 원본 데이터에서 중복을 허용하여 무작위로 추출된 것입니다.

병렬 학습: 이렇게 생성된 부분집합에 대해 동일한 모델을 학습하고 각각의 모델이 병렬적으로 예측을 수행합니다.

결합: 각 모델의 예측 결과를 결합하여 최종 예측을 만듭니다. 분류 문제에서는 보통 각 클래스에 대한 확률 예측의 평균을 사용합니다. 회귀 문제에서는 예측 값들의 평균을 사용합니다.

분산 감소: 배깅은 과대적합을 줄이고 모델의 안정성을 높이는 데 도움이 됩니다.

대표적인 배깅 알고리즘 중 하나는 랜덤 포레스트(Random Forest)입니다. 랜덤 포레스트는 배깅의 개념을 결정 트리에 적용한 것으로, 여러 개의 결정 트리를 만들고 그들의 예측을 조합하여 더욱 강력한 예측 모델을 만듭니다.

부트스트랩(Bootstrap)은 통계학에서 리샘플링(resampling) 기법 중 하나로, 주어진 데이터 집합에서 복원 추출을 통해 새로운 샘플을 만드는 과정을 말합니다. 부트스트랩은 주어진 데이터로부터 샘플링을 여러 번 수행하여 통계적 추정치를 구하거나 모델의 신뢰 구간을 계산하는 데 사용됩니다.

일반적인 통계 분석에서는 표본 추출을 통해 모집단의 특성을 추론합니다. 하지만 실제 데이터로 표본을 추출하는 경우, 그 표본은 해당 모집단의 모든 특성을 완벽하게 반영하지 못할 수 있습니다. 이 때, 부트스트랩은 이러한 불확실성을 다루는 방법 중 하나로 사용됩니다.

부트스트랩의 과정은 다음과 같습니다:

복원 추출: 주어진 데이터 집합으로부터 무작위로 하나의 데이터를 추출하고, 이를 다시 집합에 돌려놓습니다. 이로써 동일한 데이터가 여러 번 선택될 수 있습니다.

샘플링: 원본 데이터 크기와 동일한 크기의 부트스트랩 샘플을 생성합니다. 이 과정을 여러 번 반복하여 다수의 부트스트랩 샘플을 얻을 수 있습니다.

통계 계산: 각 부트스트랩 샘플에 대해 원하는 통계량(평균, 분산, 중앙값 등)을 계산합니다.

분포 추정: 부트스트랩 샘플의 통계량 분포를 통해 특정 추정치의 신뢰 구간이나 분포를 추정할 수 있습니다.

부트스트랩은 작은 데이터 집합이나 복잡한 분포를 다룰 때 유용하며, 통계적 추정치의 불확실성을 더 잘 이해하고 해석할 수 있도록 도와줍니다. 이는 모델의 성능 평가나 신뢰성 분석 등에서 유용하게 활용될 수 있습니다.

부스팅(Boosting)

부스팅은 약한 학습기(Weak Learner)를 순차적으로 학습시켜 강력한 모델을 만드는 앙상블 기법입니다. 부스팅은 이전 모델이 잘못 예측한 샘플에 가중치를 부여하여 새로운 모델을 학습하는 방식입니다. 주로 분류 문제에 사용되며, 잘못 예측된 샘플에 집중하여 정확도를 높이는 데 초점을 둡니다.

예를 들어, AdaBoost나 Gradient Boosting과 같은 알고리즘이 있습니다. 이들은 이전 모델이 실패한 예제에 초점을 맞추어 새로운 모델을 학습시키는 방식으로 작동합니다.

부스팅의 주요 특징은 다음과 같습니다.

순차적 학습: 이전 모델이 잘못 예측한 샘플에 가중치를 높게 설정하여 다음 모델을 학습시킵니다.
가중치 업데이트: 각 모델의 예측 결과에 가중치를 부여하여 다음 모델을 학습하는데 반영합니다.
약한 학습기 활용: 각 모델은 약한 학습기로서 예측 성능이 무작위 추측보다 조금 더 나은 모델을 사용합니다.
부스팅의 대표적인 알고리즘으로는 AdaBoost(Adaptive Boosting), Gradient Boosting, XGBoost, 그리고 LightGBM 등이 있습니다. 이러한 알고리즘은 부스팅의 개념을 활용하여 예측 성능을 높이는데 사용됩니다.

다양한 유형의 모델 결합

이 방법은 서로 다른 유형의 머신러닝 알고리즘을 결합하여 예측을 수행합니다. 이는 다양한 시각에서 데이터를 분석하고 예측하는 데 도움이 될 수 있습니다.

보팅(Voting)

보팅은 여러 다른 머신러닝 모델의 예측 결과를 조합하여 최종 예측을 수행하는 방법입니다. 이는 분류(Classification)와 회귀(Regression) 모두에 적용될 수 있습니다.

보팅은 크게 두 가지 유형으로 나뉩니다.

Hard Voting(하드 보팅): 다양한 모델들이 예측한 클래스 레이블 중 가장 많이 선택된 클래스를 최종 예측으로 선택합니다. 이 방식은 다수결 원칙에 기반하며, 각 모델의 예측 결과가 투표로서 최종 결정됩니다.

Soft Voting(소프트 보팅): 다양한 모델들이 예측한 클래스에 대한 확률값들을 평균하고, 이들의 평균 확률값이 가장 높은 클래스를 최종 예측으로 선택합니다. 이 방식은 각 모델의 확률 예측을 고려하여 가중 평균을 계산합니다.

랜덤 포레스트(Random Forest)

랜덤 포레스트는 배깅(Bootstrap Aggregating)의 개념을 결정 트리에 적용한 앙상블 기법입니다. 여러 개의 결정 트리를 생성하고 이들의 예측을 조합하여 예측을 수행합니다. 주로 분류와 회귀 문제에 사용되며, 과대적합을 줄이고 안정적인 예측 모델을 만드는 데 사용됩니다.

랜덤 포레스트의 주요 특징은 다음과 같습니다.

부트스트랩 샘플링: 훈련 데이터로부터 복원 추출을 통해 다양한 데이터 부분집합을 생성합니다.
랜덤한 특성 선택: 각 결정 트리 생성 시에 무작위로 일부 특성만 선택하여 트리를 구성합니다.
앙상블: 생성된 결정 트리들의 예측을 조합하여 최종 예측을 수행합니다.

스태킹(Stacking)

스태킹은 여러 다른 모델들의 예측을 입력으로 받아 최종 메타 모델을 학습하는 방법입니다. 다양한 모델들의 다양한 예측을 활용하여 최종 예측을 더욱 정교하게 만들 수 있습니다.

스태킹의 주요 특징은 다음과 같습니다.

여러 모델의 예측 활용: 다양한 종류의 모델들이 예측한 결과를 활용합니다.
메타 모델: 다양한 모델의 예측 결과를 입력으로 받아 최종 예측을 수행하는 메타 모델을 학습합니다.
계층화: 보통은 두 단계의 모델 구조로, 첫 번째 단계에서는 여러 개의 기본 모델을 각각 학습시키고, 두 번째 단계에서는 첫 번째 단계의 예측 결과를 사용해 메타 모델을 학습합니다.
스태킹은 모델 간의 다양한 조합과 설정에 따라 성능을 높일 수 있지만, 조절해야 할 하이퍼파라미터가 많아 조정이 복잡할 수 있습니다.

앙상블은 보통 단일 모델보다 더 높은 예측 성능을 보여주지만, 모든 상황에서 항상 더 나은 결과를 보장하는 것은 아닙니다. 데이터의 특성과 문제에 따라 앙상블의 유형과 매개변수를 조정해야 합니다. 또한 앙상블은 모델의 복잡도와 학습 시간을 증가시킬 수 있기 때문에, 문제의 복잡도와 자원 제약을 고려하여 사용해야 합니다.

Classifier

VotingClassifier, BaggingClassifier, RandomForestClassifier

AdaBoostClassifier

AdaBoostClassifier는 Adaptive Boosting의 줄임말로, 약한 분류기를 순차적으로 학습시켜 강력한 분류기를 만드는 앙상블 기법입니다. 초기에는 모든 샘플에 동일한 가중치를 부여하고, 잘못 분류된 샘플에 가중치를 더 부여하여 이를 보정합니다. 이후 약한 분류기의 예측을 결합하여 최종 예측을 만듭니다. AdaBoost는 주로 단순한 분류기를 기반으로 하지만, 순차적인 학습을 통해 예측 성능을 높일 수 있습니다.

XGBoostClassifier

XGBoost는 eXtreme Gradient Boosting의 약자로, 그래디언트 부스팅 알고리즘을 기반으로 개발된 라이브러리입니다. 데이터셋의 예측 오류를 최소화하기 위해 약한 분류기를 순차적으로 학습시키는 기법을 사용합니다. 특히 XGBoost는 정규화 항과 트리 복잡도에 대한 항을 추가하여 모델의 안정성과 일반화 능력을 향상시켰습니다. 또한, 조기 중단(early stopping)을 통해 과적합을 방지하고, 트리의 깊이를 제한함으로써 모델의 복잡도를 제어할 수 있습니다.

LGBMClassifier

LightGBM은 Microsoft이 개발한 머신러닝 라이브러리로, 그래디언트 부스팅 알고리즘을 기반으로 합니다. LightGBM은 데이터셋을 효율적으로 처리하기 위해 '균형 트리 분할'보다 '리프 중심 트리 분할'을 사용하여 속도와 메모리 사용량을 줄였습니다. 이로 인해 대규모 데이터셋에서도 뛰어난 성능을 발휘하며, 범주형 변수의 자동 변환과 결측치 처리 등의 편의 기능도 제공합니다.

XGBoost와 LightGBM은 둘 다 그래디언트 부스팅 알고리즘을 기반으로 하며, 트리를 순차적으로 학습시켜 모델의 예측력을 향상시킵니다. 이들은 대용량 데이터와 다양한 유형의 특성을 다루는 데 강점을 가지고 있으며, 매개변수 튜닝을 통해 최적의 모델을 찾을 수 있습니다.

예제

아래 예제는 앞서 언급한 다양한 분류기를 사용하여 앙상블을 구성하는 간단한 예제입니다. 데이터셋이나 파라미터 설정 등은 실제 상황에 따라 조정해야 합니다.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier

# 데이터 불러오기
data = load_iris()
X = data.data
y = data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 다양한 분류기 생성
clf_voting = VotingClassifier(
    estimators=[
        ('bagging', BaggingClassifier()),
        ('random_forest', RandomForestClassifier()),
        ('adaboost', AdaBoostClassifier()),
        ('xgboost', XGBClassifier()),
        ('lightgbm', LGBMClassifier())
    ],
    voting='soft'  # soft voting 선택
)

# 각 분류기 학습 및 예측
clf_voting.fit(X_train, y_train)
y_pred = clf_voting.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print("Ensemble Accuracy:", accuracy)

이 예제에서는 다양한 분류기를 생성하고, VotingClassifier를 사용하여 이들의 예측을 조합하여 최종 예측을 수행합니다. 'soft' 투표 방식을 선택하여 각 분류기의 확률 예측을 평균하여 가장 높은 확률을 가진 클래스를 선택하도록 합니다. 주어진 데이터셋이나 문제에 따라서 분류기와 파라미터를 조정하면서 성능을 향상시킬 수 있습니다.

해당 게시글은 ChatGPT의 도움을 받아 작성되었습니다.

'AI > Machine-Learning' 카테고리의 다른 글

[sklearn] KMeans  (0) 2023.08.31
[sklearn] KFold와 cross_val_score  (0) 2023.08.31
[sklearn] 결정트리  (0) 2023.08.30
[sklearn] K-Nearest Neighbors  (0) 2023.08.30
ROC curve  (0) 2023.08.30