7-1. 앙상블 학습(Ensemble Learning)

2021. 5. 12. 02:07Machine Learning

 

앙상블 학습(Ensemble Learning)


'앙상블 학습은 여러 모델이 전략적으로 생성되고 결합되어 특정 계산 지능 문제를 해결하는 과정이다.'

 

출처 : www.scholarpedia.org/article/Ensemble_learning

 

Ensemble learning - Scholarpedia

Ensemble learning is the process by which multiple models, such as classifiers or experts, are strategically generated and combined to solve a particular computational intelligence problem. Ensemble learning is primarily used to improve the (classification

www.scholarpedia.org

 

투표 기반 분류기

출처: 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()

단순 결정 트리 모델과 배깅을 적용한 결정 트리 모델을 비교하였다. 

 

단순 결정 트리와 배깅 결정 트리 비교

배깅을 적용한 쪽이 더 잘 데이터셋을 분류한 것으로 보인다.