[AutoML] PyCaret : 소개 및 과정

ddurru·2023년 11월 6일

PyCaret이란?

  • PyCaret은 scikit-learn 패키지 기반으로, Machine Learning Workflow를 자동화하는 오픈소스 라이브러리
  • Classification, Regression, Clustering 등 여러 모델을 동일한 환경에서 한 번에 한 줄의 코드로 실행할 수 있도록 자동화한 라이브러리

1. Setting

(1) Installation

# Colab 
pip install --use-deprecated=legacy-resolver pycaret[full]

# local 
pip install pycaret
pip install pycaret[full] # install the full version of pycaret 

(2) Import Module

ModuleCode
Classificationfrom pycaret.classification import *
Regressionfrom pycaret.regression import *
Clusteringfrom pycaret.clustering import *
Anomaly Detectionfrom pycaret.anomaly import *
NLPfrom pucaret.nlp import *
ARMfrom pucaret.arules import *

(3) Setup

  • setup 함수는 필요한 환경을 initialize해주는 것
  • 종속변수(target), train/test data 분리, label column 등을 설정하는 부분
  • 추가로 scaling, normalization, transformation, fold strategy(검증), outlier(이상치) 제거 등 여러가지 전처리 기법을 적용 가능

즉, setup은 파이프라인으로 전처리한 데이터 및 변수 정보를 포함한 다양한 정보를 포함 가능

파라미터를 통해 옵션 설정을 진행할 수 있으며, 설명은 다음과 같음

# 예시
setup_genie = setup(data=data, 
					target='target_col', 
                    train_size=0.7, 
                    sessioon_id=2023,
                    use_gpu=False)
# 1. data : input data 입력 
# 2-1. train/test를 별도 분리하지 않으면 train_size에 입력한 비율대로 train/test를 분리
# 2-2. 별도로 분리하여 입력을 한다면 data에 train 데이터를 입력 & test_data 부분에 test 데이터를 입력
# 3. target : 최종적으로 분류/예측해야 하는 column (train data에 존재하는 column)
# 4. session_id : random seed 설정
# 5. normalize : 데이터에 정규화(Normalization) 적용 여부 (True/False)
# 6. normalize_method : normalize가 True라면 어떤 방식으로 정규화를 진행할 것인지 설정 (zscore, minmax, maxabs, robust ...)
# 7. transformation : 데이터 샘플들의 분포가 가우시안 분포(정규 분포)에 더 가까워지도록 처리해주는 과정 
# 8-1. fold_strategy : 기본적으로 10-fold Cross-Validation(kfold)을 수행, Stratified K-fold(stratifiedkfold)도 가능 
# 8-2. regression인 경우, label이 int형이라면 Stratified K-fold가 제대로 실행 가능하지만 float형이라면 학습이 제대로 수행 X 
# 8-3. 따라서, float형태로 되어있는 label 값을 int형으로 변환하여 소수점 아래를 버리고 수행하는 방법도 존재
# 9. fold : CV를 진행할 횟수 설정 
# 10. use_gpu : GPU 사용 여부 (True/False)

>>> 위 파라미터를 설정한 후 코드를 돌리게 된다면 feature들이 numeric인지 categorical인지 column에 대한 자료형을 확인을 할 수 있음 
>>> 데이터에 대한 간단한 설명과 전처리한 내용 그리고 설정한 옵션들도 표시  
+) numeric_features, categorical_features : 자료형에 따라 numeric feature와 categorical feature를 분리하여 설정 가능 

2. Modeling

(1) Select Model

사용하고자 하는 모델은 다음 사이트를 활용 : Classification, Regression
  • setup() 함수 실행 이후, models() 메서드를 통해 사용 가능한 모델을 볼 수 있음
models() 

(2) Compare Models

  • models()에서 제공하는 모델들이나 scikit-learn에서 제공하는 모델을 별도로 선언하면 학습을 수행한 모델을 최종적으로 반환
  • 해당 모델의 성능(MAE, MSE, RMSE, MAPE, R2, Train Time ...)을 DataFrame 형태로 제공
# 예시
top_4_models = compare_models(n_select=4, sort='MAE', include=['rf', 'xgboost', 'lightgbm', 'dt', 'gbr'])

# 1. n_select : 가장 좋은 성능 순으로 n_select에서 설정한 수만큼의 모델을 저장 
# 2. sort : 최종적으로 반환해주는 모델들을 Sorting할 때, 어떤 Metric을 기준으로 Sorting할지 결정해주는 파라미터 
# 3. include : 어떤 모델들을 비교할지 설정해주는 함수로 여러 모델들을 리스트의 형식으로 입력 (models()에서 보았던 id나 별도로 이전에 선언한 모델을 리스트 안에 넣어주면 됨)
# 4. exclude : include의 반대 (빼고 싶은 모델 선택)

(2-1) Add Metrics

  • 평가 지표 (Metrics)의 종류
    Classification : Accuracy, AUC, Recall, Precision, F1, Kappa, MCC
    Regression : MAE, MSE, RMSE, R2, RMSLE, MAPE
# 01 : Classification
from sklearn.metrics import log_loss 
add_metric('logloss', 'Log Loss', log_loss, greater_is_better=False) 

# 02 : Regression 
from sklearn.metrics import explained_variance_score
add_metric('evs', 'EVS', explained_variance_score)

top_4_models = compare_models(n_select=4, sort='MAE', include=['rf', 'xgboost', 'lightgbm', 'dt', 'gbr'])

>>> 위와 같이 평가 지표를 추가하고 compare_models를 수행하게 되면 해당 지표가 추가되어 모델의 성능을 나타냄 

(3) Create Model

  • 여러 모델이 아닌 하나의 모델에 대해서 setup()의 설정대로 학습을 진행하고, 결과 확인이 가능
  • 세부적으로 create_model() 함수 내부에 사용하고자 하는 modelfold, cross_validation, max_depth, learning_rate 등 튜닝값을 설정하는 것이 가능
# 예시 
lgbm = create_model('lightgbm', fold = 10)
rf = create_model('rf', fold = 10)
xgb = create_model('xgboost', fold = 10)

+) range 0.1 ~ 0.5 : learning_rate 
lgbms = [create_model('lightgbm', learning_rate=i) for i in np.arrange(0.1, 0.5)]

>>> 위 코드에서 입력한 fold에 따라서 성능을 확인할 수 있음

(4) Tune Model

  • 입력한 모델에 대해서 Hyper-parameter Tuning을 수행하는 기본적인 함수로 K-Fold를 수행
# 예시 01 
tuned_xgb = tune_model(xgb, 
					   n_iter=100,
                       optimize='MAPE')
                       
# 예시 02 
top5 = compare_models(sort='Accuracy', n_select=5)
tuned_top5 = [tune_model(i) for i in top5]


# 예시 03 : Custom Grid 매개변수를 사용하여 사용자 정의 그리드를 전달 가능 
params = {
    'learning_rate': [0.01, 0.1],
    'max_depth': [5, 6, 7, 8],
    'subsample': [0.6, 0.7, 0.8],
    'n_estimators' : [100, 300, 400, 500]
}

tuned_model = tune_model(
    model, 
    optimize='RMSE',
    fold=10,
    custom_grid=params, 
    n_iter=20
)   

# 예시 04 : 탐색 알고리즘 변경 
# tune model optuna
tune_model(__model__, search_library = 'optuna')

# tune model scikit-optimize
tune_model(__model__, search_library = 'scikit-optimize')

# tune model tune-sklearn
tune_model(__model__, search_library = 'tune-sklearn', search_algorithm = 'hyperopt')

# 1-1. n_iter : Tuning을 통해 성능을 비교할 후보군의 수를 의미
# 1-2. 값이 클수록 성능이 더 좋아진 가능성이 있지만 시간이 더 걸리므로 각 task에 맞게 적절한 값을 설정해주어야 함 
# 2. optimize : Tuning시, 어떤 Metric을 기준으로하여 Tuning된 모델을 선별할 것인지 설정하는 하이퍼파라미터 

+) Pycaret 이전 버전에서는 Default Model과 Tuning된 모델을 비교하지 않아 오히려 Tuning된 모델이 Default Model보다 성능이 낮은 경우가 있었음
+) 이에 따라 하이퍼파라미터를 별도로 설정해주어야 함  
+) 버전 업데이트 이후, 해당 이슈 제거됨 > Pycaret 버전 확인 필요 

(5) Ensemble Models

  • Ensemble은 Classification, Regression에서만 적용 가능
  • 배깅과 부스팅 두 가지를 제공
  • 또한 추가적으로 파라미터 설정 가능
# 01 
bagged = ensemble_model(model, method='Bagging')

# 02
boosted = ensemble_model(model, method='Boosting') 

(6) Blend Models

  • compare_models를 통해 선택된 모델들을 블렌딩할 수 있음
  • 개인적으로 모델을 생성 후, 해당 모델들을 선택하여 블렌딩이 가능
# 01 - 1 
rf = create_model('rf')
xgb = create_model('xgboost') 
lgbm = create_model('lightgbm')

blender_base_model = blend_models(estimator_list = [lgbm,rf,xgb], optimize = 'MAPE')  

# 01 - 2 : 모델별 가중치 설정 
blender_base_model2 = blend_models(estimator_list = [lgbm,rf,xgb], optimize = 'MAPE', weights = [0.45,0.35,0.2])  

# 02 : compare_models를 통해 선택된 모델들 
blender_base_model3 = blend_models(estimator_list = compare_models(n_select = 5), method = 'soft')

# 1. optimize : Tuning시, 어떤 Metric을 기준으로하여 Tuning된 모델을 선별할 것인지 설정하는 하이퍼파라미터 (평가지표)
# 2. method : soft voting인지 hard voting인지 선택 
# 3. fold : 구간으로 나누어 검증할 횟수 

(7) Stack Models

# 01 
stacker = stack_models(estimator_list = [xgb, lgbm], meta_model = rf)

# 02 : compare_models를 통해 선택된 모델들 
top5 = compare_models(n_select = 5)
stacker = stack_models(estimator_list = top5[1:], meta_model.= top5[0])

3. Visualization

# 01 : residuals 
plot_model(__model__, plot='residuals')

# 02 : error 
plot_model(__model__, plot='error')

# 03 : feature > 변수중요도 
plot_model(__model__, plot='feature')

# 04 : learning
plot_model(__model__, plot='learning')

# 05 : cooks > OutLiers 
plot_model(__model__, plot='cooks') 

# 06 : confusion_matrix
plot_model(estimator = __model__, plot = 'confusion_matrix')

4. Prediction & Evaluation

(1) Predict Model

  • 앞선 과정들은 setup에서 입력한 파라미터와 데이터를 기반으로 train/valid로 나누어 학습을 진행
  • 이후, finalize_model() 함수를 통해 전체 데이터로 마지막 학습을 진행
  • 마지막으로 predict_model() 함수의 파라미터로 학습된 모델 변수, 테스트할 데이터를 입력해주면 prediction한 값이 출력
# 최종 모델 선택 
final_model = finalize_model(model)

# test 데이터 예측 
prediction = predict_model(final_model, data=test)

# score : label이 맞을 확률 / Label : 예측값 
predictions[['Score','Label']]

>>> prediction은 test 데이터의 데이터 프레임 형태를 그대로 가져가며, 마지막에 Label이라는 Column이 생성되면서 해당 값이 모델이 예측한 결과

(2) Evaluate Model

  • 마지막으로 모델을 평가하는 단계
  • target값과 예측된 값인 Label값을 입력한 후 평가를 할 Metric을 입력하게 되면 결과값이 출력
from pycaret.utils import check_metric
check_metric(prediction['_target_'], prediction['Label'], metric = 'Accuracy')

(3) Interpret Model

# SHAP (SHapley Additive exPlanations)
pip install shap 

interpret_model(__model__, plot='reason', observation=32)

5. Save & Load

(1) Save Model

  • 학습한 모델을 저장해주는 메서드
  • pickle file(.pkl)로 지정한 디렉토리에 저장 (디렉토리 경로를 입력하는 경우, .pkl(확장자명) 필수 X)
# 예시
save_model(model, './xgb') 

(2) Load Model

  • save_model()을 통해 저장한 모델을 불러오는 메서드
# 예시 
load_xgb = load_model('./xgb')

# Hyper-parameter Setting 확인 
load_xgb['trained_model']

+) Model을 Load할 때, Model을 Save했던 환경과 다른 곳에서 수행을 하게 된다면, Pandas의 버전이 같거나 더 최신 버전이어야 함 

참고

profile
2024.04.15 ~

0개의 댓글