Stevelee_HMC 2022. 8. 25. 12:20

이번에는 Ensemble(앙상블)에 대해 정리해보고자 한다.

Ensemble은 Assemble의 불어이다. 

 

거두절미하고 본론으로 들어가면 , 

 

2개 이상의 모델의 결과를 조합해서 최적을 만들어내는 방식으로, 

회귀/분류 모델마다 약간의 상이한점이 있다.

 

본 포스팅에서는 sklearn에서 일반적으로 제공하는 VotingClassifier의 활용보단 Customizing한 방법을 설명하고자 한다.

 

추후 Voting의 'soft voting' , 'hard voting' 등등 다양한 개념들을 포스팅하고자한다.

 

Regression(회귀)문제에서의 Ensemble은 
대수적으로 더하고 나누고 비율을 선정하는 경우가 많다.
cat_reg = CatBoostRegressor()
cat_reg.fit(X_train ,y_train)
pred_cat = cat_reg.predict(X_test)
### catboost로 예측한 결과 

rf_reg = RandomForestRegressor()
rf_reg.fit(X_train , y_train) 
pred_rf = rf_reg.predict(X_test
### randomforest로 예측한 결과 

pred_total = (pred_cat + pred_rf) / 2   ### 2개를 더하고 나눠서 앙상블
예를 들어 , pred_cat 이 pred_rf 보다 모델의 성능이 더 좋을 경우 
비율로 정할 수 도 있다. 제출한 후 리더보드를 확인해가며 조정해보자!
pred_total = 0.7 * pred_cat + 0.3 * pred_rf

 

Classification(분류)문제에서의 Ensemble은
대수적으로 더하고 나눌 경우 정수형이 안될 수 있으므로 주의해야한다.
따라서 그럴때는 threshold를 선정해서 해야한다.
cat_clf = CatBoostClassifier()
cat_clf.fit(X_train ,y_train)
pred_cat = cat_clf.predict(X_test)
### catboost로 예측한 결과 

rf_clf = RandomForestClassifier()
rf_clf.fit(X_train , y_train) 
pred_rf = rf_clf.predict(X_test)
### randomforest로 예측한 결과 

pred_total = (pred_cat + pred_rf) / 2  
### 2개를 더하고 나눠서 앙상블하게 되면 0.5 , 0.67 등의 소수점 값이 나온다 따라서 
### 아래와 같이 threshold를 사용한다.

prediction ### 임의의 데이터프레임 
threshold = 0.5 ### 값은 알아서 정하시면 됩니다.
prediction.loc[prediction["pred_total"] >= threshold , "pred_total"] = 1
prediction.loc[prediction["pred_total"] < threshold , "pred_total"] = 0

submission["Target"] = prediction["pred_total"] 

### 이렇게 제출파일에 반영하시면 됩니다.

 

번외 1. random state만으로 앙상블하기 
스코어링이 좋은 모델이 타 모델과 앙상블했을때 오히려 결과가 안좋을때는 동일한 모델의 컨디션에서 
random_state(난수) 값만 변경해서 여러개를 더해서 앙상블하는 것도 한 방법

 

 

추가적인 패키지에 대한 내용은 다음 포스팅에서 설명하기로 한다.