2022.03.23 수
Booststrap aggregating
: 중복을 허용한 랜덤 샘플링으로 만든 훈련 세트를 이용하여 분류기를 각각 다르게 학습 시킴
랜덤 포레스트의 특징과 같음
예측 결과 ⇒ 가장 빈도가 높은 클래스 레이블
predict_proba()
매개변수
oob_score : Out of Bag = OOB 오차 = True : 부트스트래핑에 포함되지 않은 샘플로 훈련모델 평가 = False : 기본값 테스트 성능 짐작 가능 (RandomForestClassifier도 지원)
max_samples 부트스트랩 샘플의 크기 지정
배깅을 사용한 LogisticRegression 모델 훈련 앙상블
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import BaggingClassifier
# logistic regression 모델 앙상블 (cancer)
bagging = BaggingClassifier(LogisticRegression(), n_estimators=100, oob_score=True, n_jobs=-1, random_state=42)
bagging.fit(Xc_train, yc_train)
print("훈련 세트 정확도 : {:.3f}".format(bagging.score(Xc_train, yc_train)))
print("테스트 세트 정확도 : {:.3f}".format(bagging.score(Xc_test, yc_test)))
print("oob샘플 세트 정확도 : {:.3f}".format(bagging.oob_score_))
훈련 세트 정확도 : 0.953 테스트 세트 정확도 : 0.958 oob샘플 세트 정확도 : 0.941
배깅을 사용한 결정 트리 앙상블
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
# 결정 트리 앙상블 - 배깅 (moon)
bagging = BaggingClassifier(DecisionTreeClassifier(), n_estimators=5, n_jobs=-1,random_state=42)
bagging.fit(Xm_train, ym_train)
# 결정 경계 시각화
fig,axes = plt.subplots(2,3,figsize=(20,10))
for i, (ax,tree) in enumerate(zip(axes.ravel(), bagging.estimators_)):
ax.set_title("Tree {}".format(i))
mglearn.plots.plot_tree_partition(Xm,ym,tree,ax=ax)
mglearn.plot_2d_separator(bagging, Xm, fill=True, ax=axes[-1,-1], alpha=.4)
axes[-1,-1].set_title("Bagging")
mglearn.discrete_scatter(Xm[:,0],Xm[:,1],ym)
plt.show()
# 결정 트리 앙상블 - 배깅 (cancer)
bagging = BaggingClassifier(DecisionTreeClassifier(), n_estimators=100, oob_score=True, n_jobs =-1, random_state=42, max_samples=100)
bagging.fit(Xc_train, yc_train)
print("훈련 세트 정확도 : {:.3f}".format(bagging.score(Xc_train, yc_train)))
print("테스트 세트 정확도 : {:.3f}".format(bagging.score(Xc_test, yc_test)))
print("oob샘플 세트 정확도 : {:.3f}".format(bagging.oob_score_))
훈련 세트 정확도 : 0.979 테스트 세트 정확도 : 0.965 oob샘플 세트 정확도 : 0.948
→ max_samples=100으로 훈련
랜덤 포레스트와 차이점
예제
# 엑스트라 트리 (moon) - 바로 적용 가능
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.model_selection import train_test_split
xtree = ExtraTreesClassifier(n_estimators=5, n_jobs=-1, random_state=0)
xtree.fit(Xm_train,ym_train)
# 결정 경계 시각화
fig,axes = plt.subplots(2,3,figsize=(20,10))
for i, (ax,tree) in enumerate(zip(axes.ravel(), xtree.estimators_)):
ax.set_title("Tree {}".format(i))
mglearn.plots.plot_tree_partition(Xm,ym,tree,ax=ax)
mglearn.plot_2d_separator(xtree, Xm, fill=True, ax=axes[-1,-1], alpha=.4)
axes[-1,-1].set_title("Extra Trees")
mglearn.discrete_scatter(Xm[:,0],Xm[:,1],ym)
plt.show()
→ 후보 노드를 랜덤 분할 → 최선의 분할 찾기 ⇒ 그래서 개별 트리의 결정경계 완전 복잡
→ 엑스트라 트리의 결정 경계 = 안정적
# 엑스트라 트리 (cancer)
xtree = ExtraTreesClassifier(n_estimators=100, n_jobs=-1, random_state=0)
xtree.fit(Xc_train,yc_train)
print("훈련 세트 정확도 : {:.3f}".format(xtree.score(Xc_train, yc_train)))
print("테스트 세트 정확도 : {:.3f}".format(xtree.score(Xc_test, yc_test)))
훈련 세트 정확도 : 1.000 테스트 세트 정확도 : 0.972
→ 랜덤 포레스트와 거의 같은 성능을 냄
계산 비용 : 엑스트라 트리 < 랜덤 포레스트
BUT, 분할 때문에 일반화 성능 향상시 많은 트리 필요 🥲 ⇒ 일반적으로 랜덤 포레스트 선호
특성 중요도
# 특성 중요도
n_features = cancer.data.shape[1]
plt.barh(range(n_features), xtree.feature_importances_, align='center')
plt.yticks(np.arange(n_features), cancer.feature_names)
plt.xlabel("특성 중요도")
plt.ylabel("특성")
plt.ylim(-1, n_features)
plt.show()
→ 랜덤 포레스트와 비슷