10.결정트리와 앙상블(보팅배깅부스팅스태킹)
글 한눈에 보기
문제 설정
시각화를 위한 헬퍼 함수 (이전 실습에서 사용한 것과 동일)
원본 구조
원본 마크다운의 큰 섹션 흐름을 기준으로 이 실습을 다시 읽을 수 있게 정리했습니다.
데이터 맥락
원본 노트에서 데이터를 설명한 부분을 기준으로 실습 맥락을 정리했습니다.
주요 장
전처리와 입력 정리 · 분류 문제 · 결정 트리와 앙상블 · 피처 엔지니어링
구현 흐름
학습/검증 데이터 분리 -> DecisionTree 모델 학습 -> 예측 결과 점검
자료
ipynb / md · 코드 8 · 실행 7
주요 스택
numpy, matplotlib, sklearn
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, BaggingClassifier, VotingClassifier, StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from matplotlib.colors import ListedColormap
# 시각화를 위한 헬퍼 함수 (이전 실습에서 사용한 것과 동일)
def plot_decision_boundary(clf, X, y, ax, title):
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),
np.linspace(y_min, y_max, 100))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00'])
ax.contourf(xx, yy, Z, alpha=0.8, cmap=cmap_light)
ax.scatter(X[:, 0][y==0], X[:, 1][y==0], c='red', marker='o', label='Class 0')
ax.scatter(X[:, 0][y==1], X[:, 1][y==1], c='blue', marker='x', label='Class 1')
ax.set_title(title)
ax.set_xlabel('Feature 1')
ax.set_ylabel('Feature 2')
ax.legend()
ax.grid(True)
X, y = make_moons(n_samples=1000, noise=0.3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 모델별 정확도 저장 딕셔너리
accuracies ={}
fig, axes = plt.subplots(2, 2, figsize=(12,11))
axes = axes.flatten()
# 1. 보팅
# 1-1. 기본 모델 세팅
clf1 = LogisticRegression()
clf2 = DecisionTreeClassifier(max_depth=5)
clf3 = KNeighborsClassifier(n_neighbors=5)
# 1-2. 소프트 보팅
voting_clf = VotingClassifier(
estimators=[('lr', clf1), ('dt', clf2), ('KNN', clf3)],
voting='soft',
weights=[1,1,1]
)
voting_clf.fit(X_train, y_train)
y_pred_voting = voting_clf.predict(X_test)
accuracy_voting = accuracy_score(y_test, y_pred_voting)
accuracies['Voting'] = accuracy_voting
plot_decision_boundary(voting_clf, X_test, y_test, axes[0], f'Voting (Acc:{accuracy_voting:.4f})')
# 배깅
bagging_clf = BaggingClassifier(
estimator=DecisionTreeClassifier(max_depth=5),
n_estimators=100,
max_samples=0.7, # 각 트리가 훈련 데이터의 70% 사용 (중복 허용)
bootstrap=True
)
bagging_clf.fit(X_train, y_train)
y_pred_bagging = bagging_clf.predict(X_test)
accuracy_bagging = accuracy_score(y_test, y_pred_bagging)
accuracies['Bagging'] = accuracy_bagging
plot_decision_boundary(bagging_clf, X_test, y_test, axes[1], f'Bagging (Acc:{accuracy_bagging:.4f})')
# 3. 부스팅
gb_clf = GradientBoostingClassifier(
n_estimators=100,
learning_rate=0.1,
max_depth=3
)
gb_clf.fit(X_train, y_train)
y_pred_boosting = gb_clf.predict(X_test)
accuracy_boosting = accuracy_score(y_test, y_pred_boosting)
accuracies['Boosting'] = accuracy_boosting
plot_decision_boundary(gb_clf, X_test, y_test, axes[2], f'Boosting (Acc:{accuracy_boosting:.4f})')
# 4. 스태킹
# 4-1. 기본 모델 설정
estimators=[
('lr', LogisticRegression()),
('dt', DecisionTreeClassifier(max_depth=5)),
('KNN', KNeighborsClassifier(n_neighbors=5))
]
# 4-2. 메타 모델 설정
stacking_clf = StackingClassifier(
estimators=estimators,
final_estimator=LogisticRegression(),
cv=5
)
stacking_clf.fit(X_train, y_train)
y_pred_stacking = stacking_clf.predict(X_test)
accuracy_stacking = accuracy_score(y_test, y_pred_stacking)
accuracies['Stacking'] = accuracy_stacking
plot_decision_boundary(stacking_clf, X_test, y_test, axes[3], f'Stacking (Acc:{accuracy_stacking:.4f})')
for model_name, acc in accuracies.items():
print(f'{model_name}: {acc:.4f}')