들어가며
저번 글에서 알아본 결정 트리는 데이터에 민감해서 분산이 상당히 크며 과대적합되기 쉽다는 문제가 있었다
이 문제를 해결하기 위해 여러 모델을 결합하는 앙상블 기법이 제시되었으며
앙상블 기법을 활용한 대표적인 알고리즘으로는
투표 기반 분류기, 배깅과 페이스팅, 랜덤 포레스트, 부스팅, 스태킹 등이 있다
오늘은 이 중 투표 기반 분류기와 배깅,페이스팅에 대하여 알아볼 것이다
투표 기반 분류기
투표 기반 분류기는 이름만 보고 직관적으로 이해 할 수 있듯이
여러 모델의 예측을 집계하여 가장 많은 표를 얻은 클래스가 앙상블의 예측이되는 가장 기본적인 형태의 앙상블 기법이다
이렇게 다수결 투표로 정해지는 분류기를 직접 투표 분류기라고한다
간접 투표 방식도 뒤에서 다루도록하겠다

데이터가 들어왔을 때 각 분류기를 가친 후 예측을 집계하여
가장 많이 예측된 클래스를 최종 예측으로 도출하는 방식이다
사이킷런에서 투표 기반 분류기를 사용할 수 있도록 VotingClassifier를 제공한다
이름,예측기 쌍을 리스트를 제공하면 쉽게 사용 가능하다
from sklearn.datasets import make_moons
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
voting_clf = VotingClassifier(
estimators=[
('lr', LogisticRegression(random_state=42)),
('rf', RandomForestClassifier(random_state=42)),
('svc', SVC(random_state=42))
]
)
voting_clf.fit(X_train, y_train)
estimators 매개변수에 분류기 이름과 분류기 클래스 객체 쌍을 리스트로 입력받는 것을 확인할 수 있다
간접 투표
분류기는 클래스를 예측할 수 있지만
만약 예측할 클래스의 확률도 도출해낼 수 있다면(predict_proba() 메서드가 있다면)
각각의 분류기의 예측 확률을 평균내어 확률이 가장 높은 클래스를 예측값으로 출력해낼 수 있게된다
이러한 방식을 간접 투표라고 한다
clf1 = LogisticRegression()
clf2 = RandomForestClassifier()
clf3 = SVC(probability=True)
voting_clf = VotingClassifier(
estimators=[
('lr', clf1),
('rf', clf2),
('svc', clf3)
],
voting='soft'
)
voting_clf.fit(X_train, y_train)
y_pred = voting_clf.predict(X_test)
voting 매개변수를 soft로 지정해주면 간단하게 사용 가능하다
참고로 SVC는 디폴트로는 클래스 예측 확률을 제공해주지 않으므로
probability=True로 지정해주어서 사용해야한다
이러한 간접 투표 방식은 확률이 높은 투표에 더 비중이 가게 되어있으므로
직접 투표 방식보다 성능이 높다
배깅과 페이스팅
다양한 분류기를 만들 때는 위의 투표 기반 분류기처럼 여러가지 서로 다른 알고리즘 모델을 사용하는 것이 있고
또 다른 방법으로는 훈련 세트의 서브셋을 랜덤으로 구성해서 분류기를 각각 다르게 학습시키는 방법이 있다
이 방법을 사용하는 대표적인 방식으로는 배깅과 페이스팅이 있다
배깅은 훈련 세트에서 중복을 허용하여 샘플링하는 방식으로
데이터셋이 [A,B,C,D,E] 있다면
모델 1 = [A,C,C]
모델 2 = [B,B,C]
모델 3 = [B,E,A]
이런 식으로 한 모델의 훈련 세트의 서브셋에 중복된 데이터를 포함하여 샘플링하는 방식이다
반면 페이스팅은 중복을 허용하지 않고 샘플링하는 방식을 의미한다
모델 1 = [A,B,C]
모델 2 = [C,D,E]
모델 3 = [B,E,A]
여기서 알아야 할 것은 서로 다른 모델 간에는 나왔던 데이터가 또 나올 수 있다는 점이다

훈련 세트의 서브셋으로 훈련된 각각의 예측기들의 예측을 모아서
분류 모델일 때는 투표 기반 분류기처럼 가장 많은 예측 결과를 최종 예측으로 내고
회귀 모델일 경우 각 모델의 예측값의 평균을 최종 예측으로 낸다
사이킷런에서 배깅과 페이스팅을 사용할 수 있도록 BaggingClassifier 클래스를 제공한다
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,
max_samples=100, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)
위 알고리즘은 결정트리 모델 500개로 구성된 앙상블을 배깅 방식을 사용하여 훈련시키는 코드이다
훈련세트에서 중복을 허용하여 랜덤으로 선택된 100개의 샘플로 훈련을 한다
만약 페이스팅을 사용하고 싶다면 bootstrap=False로 지정해주면 된다

위 사진의 왼쪽은 결정 트리 1개의 결정 경계를 시각화한 것이고
오른쪽은 500개의 트리로 만든 배깅 앙상블 모델의 결정 경계를 시각화한 것이다
그래프를 보면 앙상블의 예측이 결정 경계가 더 부드럽고 안정적이므로
훨씬 더 일반화가 잘 될 것임을 알 수 있다
단일 결정 트리를 사용한 모델은 결정 경계가 복잡하게 얽혀있다
이러면 새로운 데이터에 대하여 과대적합이 발생하기 쉽고 작은 노이즈라도 민감하게 반응하게된다
OOB 평가
배깅은 샘플을 중복해서 선택이 가능하므로
어떤 샘플은 여러번 선택되고 어떤 샘플은 아예 선택도 받지 못하게 될 수 있다
이 때 선택받지 못한 샘플들을 검증세트로 사용하여 훈련세트를 평가할 수 있게된다
선택받지 못한 샘플들을 OOB(out of bag)샘플이라고 부르며
별도의 검증세트를 세팅할 필요없이 OOB 샘플을 사용해 검증세트처럼 사용할 수 있다
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,
oob_score=True, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)
BaggingClassifier 클래스 객체를 생성할 때 oob_score=True로 지정해주면
훈련 세트의 훈련이 끝난 후 자동으로 OOB 샘플로 평가를 진행하게된다
bag_clf.oob_score_
0.896
평가 점수 결과는 oob_score_ 변수에 저장되어 있다
OOB 샘플이 89.6% 정도의 정확도를 얻었다는 것을 볼 수 있다
bag_clf.oob_decision_function_[:3]
array([[0.32352941, 0.67647059],
[0.3375 , 0.6625 ],
[1. , 0. ]])
OOB 샘플의 결정함수 값은 oob_decision_function_에 저장되어 있다
각 샘플마다 사용되지 않은 모델로부터 예측된 클래스 확률을 나타낸다
여기서의 값을 기반으로 클래스를 예측하고 정답 레이블과 비교하여 정확도를 측정한다
마치며
이번 글에서는 앙상블 기법을 활용한 알고리즘들 중 투표 기반 분류기와 배깅과 페이스팅 앙상블에 대하여 알아보았다
투표 기반 분류기는 직관적이여서 이해하기 수월했는데
배깅과 페이스팅 파트를 공부할 때 샘플링이 정확히 어떤 식으로 이루어지는 지 머리 속에서 잘 그려지지 않아
여러번 검색해보고 시각화하고 정리해보면서 이해하려고 노력했다
개인적으로 OOB 평가라는 개념이 되게 기발하다고 생각했고
선택되지 못한 샘플이 이런 식으로 쓰일 거라고는 전혀 예상하지 못해서
이 방법을 개발해낸 사람을 굉장히 리스펙하게 되었다
다음 글에서는 다른 앙상블 알고리즘인 랜덤 패치, 랜덤 서브스페이스, 랜덤 포레스트 등에 대하여 알아보겠다
'AI > Machine Learning' 카테고리의 다른 글
| [AI] 스태킹(Stacking) (1) | 2026.04.25 |
|---|---|
| [AI] 랜덤 패치, 랜덤 서브스페이스, 랜덤 포레스트 (0) | 2026.04.21 |
| [AI] 결정 트리(Decision Tree) (0) | 2026.04.15 |
| [AI] 비선형 서포트 벡터 머신(SVM) 분류 (0) | 2026.04.05 |
| [AI] 서포트 벡터 머신(SVM) 회귀 (0) | 2026.03.31 |
