2021. 5. 12. 02:07ㆍMachine Learning
앙상블 학습(Ensemble Learning)
'앙상블 학습은 여러 모델이 전략적으로 생성되고 결합되어 특정 계산 지능 문제를 해결하는 과정이다.'
출처 : www.scholarpedia.org/article/Ensemble_learning
출처: nonmeyet.tistory.com/entry/Python-Voting-Classifiers%EB%8B%A4%EC%88%98%EA%B2%B0-%EB%B6%84%EB%A5%98%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EA%B5%AC%ED%98%84
위 그림은 앙상블 학습의 한 방법인 투표 기반 분류기이다.
여러 분류 예측기를 학습시키고, Input으로 주어진 인스턴스에 대해 각 예측기들이 예측값(클래스)을 출력하고,
가장 많이 언급된 클래스를 정답 클래스로 분류하는 방식이다.
X, y = make_moons(n_samples=50, noise=0.3)
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.25, shuffle=True, stratify=y,
random_state=42)
5장에서 사용한 Moons 데이터셋을 불러온 뒤, 훈련 세트와 검증 세트로 나누었다.
훈련은 데이터셋의 75%를 사용한다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC()
투표 기반 분류기의 구성원이 될 로지스틱 회귀, 랜덤 포레스트 분류기, 서포트 벡터 머신 객체를 각각 생성하였다.
voting_clf = VotingClassifier(
estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
voting='hard'
)
투표 기반 분류기에 생성한 분류기들을 넣고, voting 을 'hard'로 선언하였다.
가장 많이 언급된 클래스를 정답 클래스로 간주하는 방식이다.
반대로 'soft'로 선언하면 각 예측기의 예측을 평균내어 가장 높은 확률의 클래스를 출력한다.
for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
clf.fit(X_train, y_train)
y_pred = clf.predict(X_valid)
print(clf.__class__.__name__, accuracy_score(y_valid, y_pred))
각 후보 분류기와 투표 기반 분류기를 훈련시키고, 검증 세트로 정확도를 측정하였다.
LogisticRegression 0.8461538461538461
RandomForestClassifier 0.9230769230769231
SVC 0.9230769230769231
VotingClassifier 0.9230769230769231
배깅, 페이스팅
위에서 살펴본 예제에서는 같은 데이터셋에 대해 다른 알고리즘으로 예측하였다.
분류기를 학습시킬 때, 데이터셋의 각기 다른 서브셋으로 훈련시킬 수도 있을 것이다.
배깅은 서브셋을 샘플링할 때, 중복을 허용하는 방식이고,
페이스팅은 중복을 허용하지 않고 샘플링하는 방식을 말한다.
출처 : thecleverprogrammer.com/2020/07/31/bagging-and-pasting-in-machine-learning/
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,
max_samples=30, bootstrap=True, n_jobs=-1)
bag_clf.fit(X_train, y_train)
배깅을 이용한 분류기를 생성하였다. (중복을 허용(bootstrap = True))
기반이 되는 분류기는 결정 트리 분류기이며, 서브셋 당 최개 크기는 30로 설정하였다.
tree_clf = DecisionTreeClassifier()
tree_clf.fit(X_train, y_train)
비교를 위해 결정 트리 모델도 생성하여 훈련하였다.
for x_i in X:
if bag_clf.predict([x_i])==1:
ax1.scatter(x_i[0], x_i[1], c='purple', marker='s')
else:
ax1.scatter(x_i[0], x_i[1], c='orange', marker='o')
ax1.grid(linestyle='dotted')
ax1.set_title('tree clf (Bagging O)')
for x_i in X:
if tree_clf.predict([x_i])==1:
ax2.scatter(x_i[0], x_i[1], c='purple', marker='s')
else:
ax2.scatter(x_i[0], x_i[1], c='orange', marker='o')
ax2.grid(linestyle='dotted')
ax2.set_title('tree clf (Bagging X)')
plt.show()
단순 결정 트리 모델과 배깅을 적용한 결정 트리 모델을 비교하였다.
배깅을 적용한 쪽이 더 잘 데이터셋을 분류한 것으로 보인다.
'Machine Learning' 카테고리의 다른 글
7-3. 랜덤 포레스트(Random Forest) (0) | 2021.05.12 |
---|---|
7-2. oob 평가 / 랜덤 패치, 랜덤 서브스페이스 (0) | 2021.05.12 |
6. 결정 트리(Decision Tree) (0) | 2021.05.04 |
5-2. 서포트 벡터 머신(SVM) - 비선형 SVM 분류 (0) | 2021.05.04 |
5-1. 서포트 벡터 머신(SVM) - 선형 SVM 분류 (0) | 2021.05.04 |