민프
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 2. 배깅편(bagging) 본문
이번 포스팅에서는 Bagging에 대해서 말씀드려보겠습니다.
이전 포스팅 1.Voting편과 비교하며 설명해보겠습니다.
(이전 포스팅을 보지 않으신 분들은 필히 보고 오셔야합니다.)
(Leo Breiman Random Forests 논문을 참고하였습니다.)
1. Bagging의 등장 배경
논문 및 위키백과에 따르면 이전 포스팅 에서의 등장 배경과 비슷한데 Bagging은 모델의 과적합과 불안정성을 줄이고자 개발되었습니다. 결정 트리(Decision Tree)와 같은 불안정한 모델은 학습 데이터의 작은 변화에도 민감하게 반응해 성능 변동성이 큽니다. Bagging은 각 모델이 다른 샘플을 통해 독립적으로 학습하고, 결과를 결합함으로써 이러한 문제를 해결하려는 목표로 등장했습니다.
2. Bagging 이란?
먼저 위키백과에 따르면 아래와 같습니다.
부트스트랩 집계(Bootstrap aggregating )는 배깅(bagging) 이라고도 하며 ( bootstrap agg regating 에서 유래 ), 통계적 분류 및 회귀 에 사용되는 머신 러닝 알고리즘 의 안정성 과 정확성을 개선하도록 설계된 머신 러닝 앙상블 메타 알고리즘 입니다. 또한 분산을 줄이고 과적합(overfitting)을 방지하는 데 도움이 됩니다 . 일반적으로 결정 트리 방법 에 적용되지만 모든 유형의 방법에 사용할 수 있습니다. 배깅은 모델 평균화 접근 방식의 특수한 경우입니다.
정리하자면 Bagging은 여러 모델의 예측을 결합해 예측 성능을 향상시키는 앙상블 학습 방법입니다.
이전 Voting에서도 여러 모델의 예측을 결합한다고 했었는데 이번 Bagging이 Voting과 비교하여 어떤 차이점이 존재하는지에 대해서 자세하게 알아보겠습니다.
3. Bagging 동작 과정
위 사진은 위키피디아에서 배깅의 동작과정 부분을 가져와봤습니다.
- Original Data (원본 데이터):
- 상단의 다양한 색으로 이루어진 원들이 원본 데이터를 나타냅니다.
- Bootstrapping (부트스트래핑):
- 부트스트랩 샘플링을 통해 원본 데이터에서 중복을 허용하여 여러 개의 훈련 데이터 세트를 생성합니다. 각 부트스트랩 샘플은 원본 데이터와 크기가 동일하지만, 데이터의 일부가 여러 번 포함되거나 일부 데이터는 포함되지 않을 수 있습니다.
* 중복을 허용한다는 건 예를 들어, 원본 데이터가 개의 데이터 포인트를 가지고 있다면, 부트스트랩 샘플 역시 개의 데이터 포인트로 구성되지만, 특정 데이터가 중복으로 선택될 수 있습니다. - 이렇게 추출된 샘플들이 훈련 데이터 세트가 되고, 각각 개별 모델을 학습하는 데 사용됩니다. 이 과정에서 원본 데이터를 여러 번 추출할 뿐, 원본 데이터 자체를 여러 번 생성하는 것은 아닙니다.
- 그림에서 각 분류기(Classifier) 아래에 있는 데이터 집합들이 각각 부트스트랩 샘플에 해당합니다. 각 샘플은 원본 데이터에서 랜덤하게 추출되므로, 색 구성(데이터 포인트)이 서로 다르게 나타나 있습니다.
- 부트스트랩 샘플링을 통해 원본 데이터에서 중복을 허용하여 여러 개의 훈련 데이터 세트를 생성합니다. 각 부트스트랩 샘플은 원본 데이터와 크기가 동일하지만, 데이터의 일부가 여러 번 포함되거나 일부 데이터는 포함되지 않을 수 있습니다.
- Classifier Training (분류기 학습):
- 각 부트스트랩 샘플을 사용해 개별 학습 모델을 학습시킵니다. 보통 불안정한 성질을 가진 결정 트리와 같은 모델을 사용해 성능을 높입니다.
- 그림에서 각 부트스트랩 샘플 아래에 있는 Classifier는 이 데이터로 학습된 모델을 나타냅니다. 각 모델은 다른 데이터를 학습하기 때문에 개별적으로 독립된 학습을 수행합니다.
- Aggregating (결합):
- 학습이 완료되면, 각 모델의 예측을 결합하여 최종 예측을 도출합니다. 분류 문제에서는 다수결 투표 방식(majority voting)을 사용해 최종 클래스를 예측합니다. 회귀 문제에서는 각 모델의 예측을 평균하여 최종 예측을 산출합니다.
- 그림에서 모든 Classifier의 예측 결과는 최종 앙상블 분류기(Ensemble Classifier)로 집계되어, 더 높은 정확도의 예측 결과를 제공합니다.
여기에서 Aggregating 부분에서 Voting에 대한 언급이 나오게 되는데요. 또 여기에서 의문이 드실 수 있으실겁니다.
Bagging은 Voting과 서로 다른 방법인데 왜 Bagging에서 Voting이 나오게 될까?
일단 결론적으로 말씀드리자면 서로 다른 방법은 맞습니다.
Bagging에서는 개별 모델을 학습한 후, 투표(Voting) 방식을 통해 최종 예측을 만듭니다.
이 때, Bagging은 Voting을 포함하는 앙상블 기법의 일종입니다.
Bagging과 Voting은 각각 앙상블 학습의 개념과 최종 결정을 내리는 방식에서 차이를 보이지만, Bagging 내부에서 Voting을 활용할 수 있는 것입니다.
그렇다면 Bagging과 Voting의 차이점은 무엇이 있는지 알아보겠습니다.
4. Bagging과 Voting의 차이점
- Bagging
- Bagging에서는 원본 데이터에서 여러 개의 샘플 데이터를 중복을 허용하여 랜덤하게 추출합니다. 이 샘플링된 데이터들로 여러 분류기 또는 회귀기를 학습시킵니다.
- 이 과정에서 각 모델은 서로 다른 데이터 샘플을 학습하기 때문에 모델 간의 다양성을 얻을 수 있습니다.
- 개별 모델들의 예측 결과를 평균 또는 다수결로 결합하여 최종 예측을 수행합니다. Random Forest가 Bagging을 대표하는 예입니다.
- Voting
- Voting은 하나의 동일한 데이터셋으로 여러 개의 서로 다른 모델(예: KNN, SVM, Decision Tree 등)을 학습시키는 방법입니다.
- 각각의 모델들은 동일한 데이터를 기반으로 하되, 서로 다른 알고리즘을 사용하기 때문에 예측 방식을 달리합니다.
- Voting의 결과는 각 모델의 예측을 종합하여 최종 예측을 내립니다. Hard Voting은 다수결을 따르고, Soft Voting은 확률을 평균하여 결정을 내립니다.
보기 쉽게 차트로 나타내보겠습니다.
요소 | Voting | Bagging |
모델 종류 | 서로 다른 모델 (KNN, SVM 등) | 동일한 모델 (주로 Decision Tree) |
데이터 샘플링 방식 | 하나의 Training 데이터, 중복 샘플링 없음 | Bootstrapping을 통해 여러 샘플 데이터 생성 |
목적 | 여러 모델의 장점을 결합하여 성능 향상 | 단일 모델의 변동성을 줄여 안정성 향상 |
예측 결합 방식 | Hard/Soft Voting | Voting (주로 다수결) |
5. Bagging 안에서 Voting의 역할
Bagging은 여러 모델의 예측 결과를 모아 최종 결론을 내릴 때 Voting을 사용하여 가장 빈도가 높은 예측값을 선택합니다. 이런 방식으로 개별 모델의 예측이 결합되며, Voting은 그 결합 방법 중 하나로 활용됩니다.
따라서 Bagging과 Voting은 서로 다른 개념이지만, Bagging은 Voting을 사용하여 앙상블 결과를 결합하는 방식 중 하나로 사용된다고 볼 수 있습니다.
6. 코드 적용
# import 코드
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, accuracy_score
# DataSet적용 코드
Train CSV 파일 로드
df_train = pd.read_csv(bootstrap_csvs_out_folder)
# Test CSV 파일 로드
df_test = pd.read_csv(bootstrap_csvs_out_test_folder)
아래 학습기 적용 구간에서 기본 분류기를 적용할 수 있습니다.
# 학습기 적용
# KNN을 기본 학습기로 사용한 Bagging
base_classifier = KNeighborsClassifier(n_neighbors=5)
bagging_model = BaggingClassifier(
base_estimator=base_classifier,
n_estimators=10, # 10개의 학습기 사용
max_samples=1.0, # 전체 데이터를 학습기에 사용
max_features=1.0, # 모든 피처 사용
bootstrap=True, # 부트스트래핑 사용
random_state=42,
n_jobs=-1
)
# 모델 학습 및 평가
bagging_model.fit(X_train_scaled, y_train)
y_test_pred_bagging = bagging_model.predict(X_test_scaled)
# 로그 출력 부분
print("Bagging (KNN) - Classification Report:")
print(classification_report(y_test, y_test_pred_bagging))
accuracy_bagging = accuracy_score(y_test, y_test_pred_bagging)
print(f"Bagging (KNN) - Accuracy: {accuracy_bagging * 100:.2f}%")
# Bagging의 특징 로그 출력
print("\nBagging 특징:")
print(f"1. Base Classifier: {base_classifier.__class__.__name__}")
print("2. Number of estimators:", bagging_model.n_estimators)
print("3. Sampling 방식: Bootstrap (With Replacement)")
print(f"4. 각 학습기에서 사용하는 샘플 비율: {bagging_model.max_samples * 100}%")
print("5. 각 학습기의 예측 결과를 평균하거나 다수결을 통해 결합합니다.")
# 테스트 데이터 예측 결과 로그 출력
print("\nTest Data Predictions (Bagging):")
for i in range(len(y_test)):
actual_class = y_test[i]
predicted_class = y_test_pred_bagging[i]
correct = "Correct" if predicted_class == actual_class else "Incorrect"
print(f"Test Sample {i+1}: Actual: {actual_class}, Predicted: {predicted_class} (Bagging) - {correct}")
아래는 출력 결과 입니다.
이것도 마찬가지로 100%로 정답으로 맞췄네요.
어떤 기본 분류기를 사용하느냐, 하이퍼 파라미터의 조절 에도 결과가 달라질 것 같습니다.
Bagging (KNN) - Classification Report:
precision recall f1-score support
sphinx_down 1.00 1.00 1.00 77
sphinx_up 1.00 1.00 1.00 77
accuracy 1.00 154
macro avg 1.00 1.00 1.00 154
weighted avg 1.00 1.00 1.00 154
Bagging (KNN) - Accuracy: 100.00%
Bagging 특징:
1. Base Classifier: KNeighborsClassifier
2. Number of estimators: 10
3. Sampling 방식: Bootstrap (With Replacement)
4. 각 학습기에서 사용하는 샘플 비율: 100.0%
5. 각 학습기의 예측 결과를 평균하거나 다수결을 통해 결합합니다.
Test Sample 6: Actual: sphinx_down, Predicted: sphinx_down (Bagging) - Correct
여기까지 Bagging에 대해서 알아보았습니다.
참고링크
https://itwiki.kr/w/%EC%95%99%EC%83%81%EB%B8%94_%EA%B8%B0%EB%B2%95
https://dlaguddnr.tistory.com/7
https://www.ibm.com/topics/bagging
https://en.wikipedia.org/wiki/Bootstrap_aggregating
https://link.springer.com/article/10.1023/A:1010933404324
'[AI | ML]' 카테고리의 다른 글
[AI | ML] [LLM] 1. LLM(Large Language Model)이란? (feat. LLM의 역사) (1) | 2024.12.12 |
---|---|
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 3. Random Forest 편 (마지막) (11) | 2024.10.28 |
[AI | ML] [분류기] Random Forest에 대해서 알아보자 - 1. 보팅편(Voting) (8) | 2024.10.28 |
[AI | ML] [HPE] Landmarks 정보 (2D, 3D) 선택에 대한 고찰 (8) | 2024.10.23 |
[AI | ML] [분류기] Decision Tree (결정 트리)에 대해서 알아보자 (14) | 2024.10.23 |