본문 바로가기
Study/ML

6. 앙상블(Ensemble) - 보팅(Voting),배깅(Bagging)

by 까망우동 2023. 5. 28.
반응형

Index

    앙상블(Ensemble)은 여러 개의 개별 머신러닝 모델을 조합하여 더 강력하고 정확한 예측 모델을 만드는 기법이다. 분류(Classification) 뿐 아니라 회귀(Regression) 문제에서도 매우 유용하게 쓰인다.

    개별모델을 '결합'하는 방법에 따라 크게 보팅(Voting), 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 4가지 정도로 나눠볼 수 있다.

    이번 포스팅에서는 앙상블 중에서도 보팅과 배깅에 대해서 정리하며, 분류문제를 기준으로 한다. (회귀에서의 앙상블은 사용하는 클래스와 개별 예측모델의 객체만 다르고 전체적인 개념은 같다) 

     

    1. 보팅(Voting)

    • 보팅은, 같은 데이터셋에 대해서 여러 다른 종류의 모델로 학습하고 예측한 결과를 통해 최종 투표하는 방식이다.    (서로 다른 데이터셋에 같은 모델을 학습한 후 Voting 하는 배깅과 상반된다) 

    • Voting 은 크게 두가지로 나뉘는데, Hard = 다수결의 원칙 / Soft = Class별 확률의 평균으로 결정한다. 일반적으로는 Soft Voting 을 주로 사용한다. 

    • 사이킷런에서 Voting 분류기 앙상블은 VotingClassifier 클래스를 이용한다. (회귀에서는 VotingRegressor)
    #개별 모델 생성
    lr_clf = LogisticRegression(solver='liblinear')
    knn_clf = KNeighborsClassifier(n_neighbors=8)
     
    from sklearn.ensemble import VotingClassifier
    # 인풋 파라미터는 estimator 와 voting
    # estimator 에는 리스트 값으로 보팅에 사용할 Classifier 객체들을 튜플 형식으로 입력
    # voting 에는 하드/소프트 보팅 방식 입력

    vo_clf = VotingClassifier( estimators=[('LR',lr_clf),('KNN',knn_clf)], voting='soft')
    x_train,x_test,y_train,y_test = train_test_split(cancer.data, cancer.target, test_size=0.2, random_state=156)

    # VotingClassifier 학습/예측/평가
    vo_clf.fit(x_train,y_train)
    pred = vo_clf.predict(x_test)
    print('Voting 분류기의 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))

     

    2. 배깅(Bagging) - 랜덤 포레스트 (Random Forest)

     배깅은 보팅과는 다르게 분류기의 종류는 모두 동일한데, 적용하는 데이터 셋이다르다. 배깅에서도 가장 대표적인 알고리즘인 랜덤 포레스트는, '결정트리'를 기반으로한다. 

    • 우선 전체 데이터를 분류기 개수만큼 '서브세트' 로 나누는데, 이때 중첩을 허용하도록 샘플링 하는 방식인 '부트스트래핑' 방식을 사용한다. 
    • 부트스트래핑으로 샘플링된 서브세트를, 여러개의 결정트리 분류기가 학습하고, Soft Voting 방식으로 최종값을 예측

     

    • 랜덤 포레스트 활용 코드 ; 랜덤 포레스트의 교차검증 및 하이퍼 파라미터 튜닝 과정 
     
        # GridSearchCV 를 통한 최적 파라미터 튜닝, Best estimator 반환
        from sklearn.model_selection import GridSearchCV
        from sklearn.ensemble import RandomForestClassifier
     
        params = {
            'max_depth' : [8, 16, 24],
            'min_samples_leaf' : [1, 6, 12 ],
            'min_samples_split' : [2, 8, 16]
        }
     
        # RandomForestClassifier 객체 생성 후 GridSearchCV 수행 // 
        rf_clf = RandomForestClassifier(random_state=0, n_jobs=-1)
        grid_cv = GridSearchCV(rf_clf , param_grid=params , cv=2, n_jobs=-1 )
        grid_cv.fit(X_train , y_train)

        print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
        print('최고 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))

        best_rf_clf = grid_cv.best_estimator_
        pred = best_rf_clf.predict(X_test)
        print('최고 예측 정확도 테스트셋: {0:.4f}'.format(accuracy_score(y_test,pred)))

     

    cf) 회귀모델 예측결과 혼합 

    앙상블 모델까지는 아니지만, 회귀모델은 때로 여러가지 개별 모델을 학습한뒤 예측값을 단순 가중평균 형태로 결합하기도한다. 예를들어 "최종예측값 = A모델 예측값 * 0.4 + B모델 예측값 * 0.6" 이런식으로 결합하고 모델별 가중치에 대한 기준은 따로 없이 주로 성능높은 모델에 더 가중하곤 한다. 

        # 개별 모델 예측
        ridge_pred = ridge_reg.predict(X_test)
        lasso_pred = lasso_reg.predict(X_test)

        # 개별 모델 예측값 혼합으로 최종 예측값 도출
        pred = 0.4 * ridge_pred + 0.6 * lasso_pred

     

     

     

    반응형

    댓글