본문 바로가기
Data Science/Machine Learning

StackingCVRegressor 개념 및 활용방법 정리

by Queen2 2022. 10. 31.
728x90
반응형

머신러닝 Stacking을 할 때 일반적으로 사이킷런의 StackingClassifier 혹은 StackingRegressor을 사용하는데요

이번에 StackingCVRegressor을 만나서 참고한 사이트의 내용을 정리해보려 합니다 :)

 


‼ StackingRegressor 과 StackingCVRegressor의 차이

둘 다 베이스 학습기와 메타 학습기를 통해서 여러 모델을 스택킹한다는 측면에서는 같지만,

이름에서 눈치챌 수 있듯이 CV(Cross Validate)을 하는지 여부에 차이가 있습니다.

 

=>  데이터가 통으로 train데이터를 쓰는지 vs KFold처럼 각 순회마다 k-1 폴드를 학습에 사용하는지의 차이

 

Source: http://rasbt.github.io/mlxtend/user_guide/regressor/StackingCVRegressor/

제가 참고한 사이트의 그림을 가지고 왔는데요, 보시면 일반적인 스택킹처럼 트레이닝 셋을 나눠서 일부는 베이스 학습기들의 학습에 사용하고 나머지는 예측에 사용하여 오버피팅이 발생하도록 하는 것이 아니라 Kfold 교차 검증처럼 K번의 k-1개 데이터를 통한 베이스 학습기의 학습, 나머지 1개 데이터를 통한 예측 과정을 거치게 됩니다. 

 


 👀 StackingCVRegressor 활용방법

from mlxtend.regressor import StackingCVRegressor

우선 이 모델을 활용하기 위해서 mltexnd.regressor에서 호출해줍니다.

그리고 객체를 만들어서 스택킹에 사용되는 모델, 메타 회귀 모델의 이름 등 파라미터를 지정해줍니다.

 

StackingCVRegressor(regressors, meta_regressor=메타학습기 이름, cv=5, shuffle=True, random_state, verbose, refit, use_features_in_secondary,store_train_meta_features,n_jobs, pre_dispatch, multi_output = False)

 

여러 파라미터 중에서 핵심적인 것들만 살펴보겠습니다.

lasso = Lasso()

rf = RandomForestRegressor(random_state=12)

 

regressors에 들어갈 모델들을 우선 명시해주고

regressors = (lasso,rf) 처럼 모델의 리스트를 넣습니다.

 

use_features_in_secondary 는 디폴트 값이 False인데요

만약 True로 지정을 하게 되면 뒤에 meta_regressor로 지정한 모델이 원본 데이터 셋과 베이스 학습기에서 만든 예측값을 둘 다 활용해서 학습을 하겠다는 것을 의미합니다. 즉, 메타학습기가 학습할 데이터의 범위를 정해줍니다.

 

 ✔ Stacking과 GridSearch 함께 활용하는 법

이 내용은 아래 rasbt.github 링크에서 발견한 신기한 내용이었는데요

StackingCVRegressor이 GridSearchCV와 함께 활용해서 베이스와 메타 학습기 모델들의 하이퍼파라미터 튜닝이 가능하다고 합니다!

 

사용방법은 일반적인  GridSearchCV와 동일하지만 estimator에 우리가 위에서 정의한 StackingCVRegressor이 들어간다는 차이점이 있습니다. (어떤 파라미터를 써야할지 모르겠다면, estimator.get_params().keys()를 통해서 우리가 어떤 파라미터 튜닝을 할 수 있는지 확인 가능합니다.)

 

from mlxtend.regressor import StackingCVRegressor
from sklearn.datasets import load_boston
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV

X, y = load_boston(return_X_y=True)

ridge = Ridge()
lasso = Lasso()
rf = RandomForestRegressor()

stack = StackingCVRegressor(regressors=(lasso, ridge),
                            meta_regressor=rf, 
                            use_features_in_secondary=True)

grid = GridSearchCV(
    estimator=stack, 
    param_grid={
        'lasso__alpha': [x/5.0 for x in range(1, 10)],
        'ridge__alpha': [x/20.0 for x in range(1, 10)],
        'meta_regressor__n_estimators': [10, 100]
    }, 
    cv=5,
    refit=True
)

grid.fit(X, y)
grid.best_params_
grid.best_score_

 

웹사이트의 예시를 조금 각색해봤는데요. 그리드 서치를 함께 사용하고 싶다면 StackingCVRegressor 을 먼저 만들고,

다음에 GridSearchCV를 호출해서 fit 학습을 시키고 best_params_ 과 best_score_을 확인하면 됩니다.

 

 

 

 

 

References:

https://www.geeksforgeeks.org/stacking-in-machine-learning/

http://rasbt.github.io/mlxtend/user_guide/regressor/StackingCVRegressor/

728x90
반응형

댓글