반응형
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
반응형
'Study > ML' 카테고리의 다른 글
지니계수 (0) | 2023.05.28 |
---|---|
7. 앙상블(Ensemble) - 부스팅(Boosting) (0) | 2023.05.28 |
5. 분류(Classification) - Decision Tree (0) | 2023.05.27 |
4. 성능 평가 (Evaluation) - Classification 평가방법 (0) | 2023.05.27 |
3. 데이터의 전처리 (Pre-processing) (1) | 2023.05.27 |
댓글