티스토리 뷰

반응형
  1. PyCaret
  2. H2O AutoML
  3. TPOT
  4. Auto-sklearn
  5. FLAML
  6. EvalML
  7. AutoKeras
  8. Auto-ViML
  9. AutoGluon
  10. MLBox

pycaret 사용법

!pip install pycaret
!pip install markupsafe==2.0.1
!pip install --upgrade pycaret

import pycaret
print(pycaret.__version__)

from pycaret.classification import * #분류
from pycaret.regression import * #회귀

3.3.0이 최신버전

exp = setup(data=train_df, target='Activity_dynamic', train_size=0.9, normalize=True, polynomial_features=True, remove_multicollinearity=True)

#train_df는 분리하지 않고 그냥 data로 넣을 수 있다.

 

setup 파라미터

  • train_size=1.0을 지정하면 전체 데이터를 훈련 데이터로 사용합니다.
  • test_data=None을 지정하면 테스트 데이터를 별도로 분리하지 않습니다.

data : Input data를 입력해주시면 됩니다. Train, Test를 별도로 분리하지 않고 입력해주시면 뒤의 train_size에 입력한 비율대로 Train,Test를 split 합니다. 

● target : 데이터셋에서 최종적으로 예측해야 하는 Column을 설정해주는 파라미터 입니다. data에서 지정해준 input data에 해당 column이 존재해야 가능합니다.

● session_id : Random seed를 설정해주는 부분입니다. 반복 실행을 진행 했을 때 동일한 결과를 나오도록 합니다.

● normalize : 데이터에 정규화를 할 것인지 True/False로 선택합니다.

● normalize_method : normalize를 True인 경우 어떤 방식으로 정규화를 진행할 것인지를 정합니다.

 ('minmax','maxabs','robust')

● transformation : Power Transformation을 통해서 데이터 샘플들의 분포가 가우시안 분포(정규 분포)에 더 가까워지도록 처리해주는 과정입니다.

  1. True 또는 'all': 모든 가능한 변환을 적용합니다. 이는 데이터 스케일링, 이상치 처리, 특성 엔지니어링 및 선택 등을 모두 수행합니다.
  2. 'scale': 데이터 스케일링만 수행합니다. 평균을 빼고 표준 편차로 나누어 특성을 정규화합니다.
  3. 'robust': RobustScaler를 사용하여 스케일링합니다. 이상치에 덜 민감한 스케일링 방법입니다.
  4. 'minmax': MinMaxScaler를 사용하여 스케일링합니다. 모든 특성을 [0, 1] 범위로 조정합니다.
  5. 'maxabs': MaxAbsScaler를 사용하여 스케일링합니다. 모든 특성을 절대값 최대치로 나누어 조정합니다.
  6. 'pca': PCA(주성분 분석)를 사용하여 차원 축소를 수행합니다.
  7. 'polar': 극좌표 변환을 수행합니다.

 

● fold_strategy : Fold starategy전략을 선택해서 설정할 수 있는 하이퍼파라미터 입니다. pycaret은 기본적으로 10-fold Cross-Validation을 수행합니다.

default = ‘stratifiedkfold’

  • 'kfold': 기본값으로 K-Fold 교차 검증을 수행합니다.
  • 'stratifiedkfold': Stratified K-Fold 교차 검증을 수행합니다. 각 fold에서 클래스의 비율을 유지하기 위해 샘플을 분할합니다.
  • 'groupkfold': Group K-Fold 교차 검증을 수행합니다. 그룹 간 데이터 누설을 방지하기 위해 그룹 정보를 사용하여 샘플을 분할합니다. 
  • ‘timeseries’

groupkfold, column name must be passed in fold_groups parameter. Example: setup(fold_strategy="groupkfold", fold_groups="COLUMN_NAME")

즉, fold_group의 기준이 있어야 한다.

 

  numeric_features=list(X_train.drop(columns = ['등록차량수']).columns), # 모든 변수가 숫자로써의 의미가 있다.

모델 학습을 위해 사용될 특성 중 숫자형 변수로 간주되어야 하는 특성을 지정하는 데 사용됩니다.

 

  polynomial_features=True : 다항회귀

  remove_multicollinearity=True : 다중공선성 제거

  use_gpu : gpu 사용 여부. True, false

 

불균형 처리

exp = setup(data, target='target_column', imbalanced_param='Balanced')

exp = setup(data, target='target_column', imbalanced_param='SMOTE')

exp = setup(data, target='target_column', fix_imbalance=True) #자동으로 처리

'Balanced' 또는 'SMOTE' 값을 가질 수 있습니다.

'Balanced'로 설정하면 클래스 불균형을 고려하여 데이터를 샘플링하고, 'SMOTE'로 설정하면 Synthetic Minority Over-sampling Technique을 사용하여 소수 클래스를 증강시킵니다.

 

전체데이터로 학습하려면 train_size= 0.999

verbose = True/False

fold_shuffle = True #교차검증 신뢰 향상을 위한 fold_shuffle

 

피처 선택

feature_selection을 하면 해당 모델을 기반으로 피처 선택까 해준다.

exp = setup(data=data, target=target, 
            train_size=0.9,
            # verbose=False,
           # session_id=6134,  #random_state
            normalize=True, 
            normalize_method='robust',
            feature_selection=True,
            feature_selection_estimator='catboost', #피처 선택에 사용되는 모델
            fold_shuffle = True,
            polynomial_features=True,
            remove_multicollinearity=True,)

setup_info = get_config('train') #전처리된 데이터보기
print(setup_info.head())

 

0   crim     506 non-null    float64
 1   zn       506 non-null    float64
 2   indus    506 non-null    float64
 3   chas     506 non-null    int64  
 4   nox      506 non-null    float64
 5   rm       506 non-null    float64
 6   age      506 non-null    float64
 7   dis      506 non-null    float64
 8   rad      506 non-null    int64  
 9   tax      506 non-null    int64  
 10  ptratio  506 non-null    float64
 11  black    506 non-null    float64
 12  lstat    506 non-null    float64
 13  medv     506 non-null    float64
dtypes: float64(11), int64(3) #피처 선택 전

0   crim     455 non-null    float32
 1   zn       455 non-null    float32
 2   indus    455 non-null    float32
 3   chas     455 non-null    int8   
 4   nox      455 non-null    float32
 5   rm       455 non-null    float32
 6   age      455 non-null    float32
 7   dis      455 non-null    float32
 8   rad      455 non-null    int8   
 9   tax      455 non-null    int32  
 10  ptratio  455 non-null    float32
 11  black    455 non-null    float32
 12  lstat    455 non-null    float32 
 13  medv     455 non-null    float32
dtypes: float32(11), int32(1), int8(2) #피처 선택 후

각각 알아서 골라준 걸 볼 수 있다.

 

여기서 models() 를 쓰면, 쓸수 있는 모델들을 표시한다.

 

평가 지표를 add_metric으로 추가할 수 있다.

from pycaret.regression import *

from sklearn.metrics import log_loss
add_metric('logloss', 'Log Loss', log_loss, greater_is_better = False)

get_metrics() #추가되었는지 확인
remove_metric('logloss') #없애기

 

from sklearn.metrics import make_scorer, r2_score
from sklearn.model_selection import cross_val_score
from pycaret.regression import setup, add_metric

def cross_val_wrapper(estimator, X, y, **kwargs):
    scores = cross_val_score(estimator, X, y, scoring='r2', **kwargs)
    return scores.mean()

scorer = make_scorer(cross_val_wrapper, greater_is_better=True)

# 데이터 설정
clf = setup(data, target=target, session_id=123)

# 사용자 정의 메트릭 추가
add_metric('cross_mean', 'r2.mean',cross_val_wrapper) #첫번째에 함수 이름, 2번째에 표시 이름,
#3번째에 함수

모델 생성

 

best_5 = compare_models(sort='F1',fold=3, n_select=5) #데이터가 적으면 fold를 적게 준다.
models_list = ['lr', 'knn', 'nb', 'dt', 'svm', 'rbfsvm', 'gpc', 'mlp', 'ridge', 'rf', 'qda', 'ada', 'gbc', 'lda', 'et', 'xgboost', 'lightgbm', 'catboost']
best_5 = compare_models(include = models_list,sort='Accuracy', fold = 5)

models_list  = ['lr', 'lasso', 'ridge', 'en', 'lar', 'llar', 'omp', 'br', 'ard', 'par', 'ransac', 'tr', 'huber', 'kr', 'svm', 'knn', 'dt', 'rf', 'et', 'ada', 'gbr', 'mlp', 'xgboost', 'lightgbm', 'catboost']
#회귀 모델
당연하지만 회귀모델에서의 sort는 회귀 모델 지표만 가능

 

n_select :  학습에 수행한 모델을 n_select에서 설정해준 수만큼 성능 순서대로 모델을 저장해줍니다.

● sort : Metric의 이름을 입력해주시면 됩니다. 어떤 metric의 기준으로 성능을 sort할지 지정해줍니다.

● include : 어떤 모델들을 비교할지 설정해주는 함수 입니다. 여기서 특정 모델을 포함할 수 있습니다.

● exclude : include와 반대로 특정 모델을 제거하고 비교할 수 있습니다.

● fold : fold를 지정해줄 수 있습니다.

 

mlp,rfvsvm 모델은 포함하지 않는 경우가 대부분.

따라서 리스트로 따로 설정하여 'mlp', ' svm' 모델을 사용하여 포함할 수도 있다.

score grid를 dataframe 형식으로 사용하고 싶은 경우에는 pull()을 이용한다.

 

pull을 하면 해당 grid의 변수를 dataframe에 저장해준다.

 

tuned_model = tune_model(best_5[1]) # 상위 5개 모델 중 두 번째 모델 튜닝
tuned_model = [tune_model(i) for i in best_5] #혹은 전체 튜닝

 

 n_iter  이 값을 크게 해줄수록 성능이 더 좋아질 가능성은 높지만 시간이 오래 걸려서 더 많은 시간이 걸리므로 사용하려는 task에 맞게 설정해주시면 됩니다. 10이 default 입니다.

● optimize  튜닝을 할 때 어떤 Metric을 기준으로 모델을 선별할 것인지 결정하는 하이퍼파라미터 입니다. 

Passing custom grid

The tuning grid for hyperparameters is already defined by PyCaret for all the models in the library. However, if you wish you can define your own search space by passing a custom grid using custom_grid parameter.

 

params = {"max_depth": np.random.randint(1, (len(boston.columns)*.85),20),
          "max_features": np.random.randint(1, len(boston.columns),20),
          "min_samples_leaf": [2,3,4,5,6]}
          
# tune model
tuned_dt = tune_model(dt, custom_grid = params)

 

RandomGridSearch가 default 이다.

# tune model optuna
tune_model(dt, search_library = 'optuna') #베이지안 최적화

# tune model scikit-optimize
tune_model(dt, search_library = 'scikit-optimize') #베이지안 최적화 2

# tune model tune-sklearn
tune_model(dt, search_library = 'tune-sklearn', search_algorithm = 'hyperopt') #베이지안 최적화3
#다만 이 모델은 사용하려면 windows가 아니어야 함

 

tune-sklearn 쓰려면 파이썬 3.11 버전이 아니어야 한다.

 

blended = blend_models([best_5[0], best_5[1]], fold=5, method='soft')

blend_models(estimator_list = tuned_model,
	fold=10,
    method='soft',
    optimize='F1',
    choose_better = True #더 나은 모델 자동 선택
    )

 

블랜딩

 

estimatior_list  사용하고자 하는 모델 리스트를 넣어줍니다. 저의 경우 앞서 하이퍼파라미터 튜닝을 진행한 5개의 모델을 넣어줬습니다.

● fold  fold를 설정해주시면 됩니다.

● method  soft와 hard가 있는데 soft가 성능이 좀 더 좋다고 합니다. task에 따라 다르니 둘다해보시면 좋을 것 같습니다.

● optimize  평가하고자하는 metric을 지정해주시면 됩니다.

 

'Accuracy' 정확도를 기준으로 모델 선택
'auc' AUC (Area Under the Receiver Operating Characteristic Curve)를 기준으로 모델 선택
'recall' 재현율 (Recall)을 기준으로 모델 선택
'precision' 정밀도 (Precision)를 기준으로 모델 선택
'f1' F1 점수 (F1 Score)를 기준으로 모델 선택
'specificity' 특이도 (Specificity)를 기준으로 모델 선택
'mcc' 매튜스 상관계수 (MCC)를 기준으로 모델 선택
'r2' 결정계수 (R^2)를 기준으로 모델 선택
'rmse' 제곱근 평균 오차 (RMSE)를 기준으로 모델 선택
'mae' 평균 절대 오차 (MAE)를 기준으로 모델 선택

 

When method = 'soft', it predicts the class label based on the argmax of the sums of the predicted probabilities, which is recommended for an ensemble of well-calibrated classifiers.

When the method = 'hard' , it uses the predictions (hard labels) from input models instead of probabilities.

 

목록에 RidgeClassifier가 있으면 soft가 되지 않는다.

# Assuming tuned_model is a list containing your estimators
new_estimator_list = [estimator for estimator in tuned_model if not isinstance(estimator, sklearn.linear_model.RidgeClassifier)]

blend = blend_models(estimator_list=new_estimator_list,
                     fold=10,
                     method='soft',
                     optimize='F1')

이럴때는 drop해서 사용

 

최종 사용할 모델을 finalize_model에 넣는다.

final_model= finalize_model(blend)
evaluate_model(final_model) #featrue importance 확인

 

 

앙상블 및 스태킹

bagged_top5 = [ensemble_model(i,choose_better = True) for i in tuned_top5]
stacker = stack_models(estimator_list = top5,choose_better = True)


boosted_dt = ensemble_model(dt, method = 'Boosting')

스태킹도 결은 같다.

단, method가 블랜딩과 다르므로 항목 참조.

https://pycaret.gitbook.io/docs/get-started/functions/optimize

 

대부분 스태킹의 method는 auto가 잘 나오는 거 같다.

 

배깅 모델은 boosting까지 진행해줄 수 있다.

n_estimators = 100을 넣으면 10인 estimator가 깊어진다.

 

 

 

 

predict_model()

# from pycaret.utils import check_metric 없어도 동작

prediction = predict_model(final_model,data=x_test) #예측하고자 하는 test 데이터
prediction

 

이거는 데이터에 대해서 나오고, y_pred로 하려면 다음과 같이 진행

tunning_model = tune_model(blend) #블렌드 된 녀석을 한번 더 튜닝
test_data= get_config('X_test')
y_test=get_config('y_test')

# test에 대한 전처리. 만약 setup 함수에서 옵션으로 전처리를 진행했다면 수행 
pipeline = get_config('pipeline')
test_auto_preprocessed = pipeline.transform(test_data)
y_pred = best_5.predict(test_auto_preprocessed)

 

y_pred = tunning_model.predict(test_auto_preprocessed)

 

여기까지 하면 y_pred가 정상적으로 나온다.

from sklearn.metrics import r2_score
from sklearn.metrics import classification_report #분류

print('R2-Score:', r2_score(y_test, y_pred))
print(classification_report(y_test, y_pred))

from sklearn.metrics import median_absolute_error #회귀
medae = median_absolute_error(y_test, y_pred)
print("MedAE:", medae)

 

x_pr_val_df = pd.DataFrame(x_pr_val)
val_y_df = pd.DataFrame(val_y)

train_data.to_csv(PATH+'train_data.csv', index=False)
train_y_df.to_csv(PATH+'train_y_df.csv', index=False)
x_pr_train_df.to_csv(PATH+'x_pr_train_df.csv', index=False)
x_pr_val_df.to_csv(PATH+'x_pr_val_df.csv', index=False)
val_y_df.to_csv(PATH+'val_y_df.csv', index=False)

#csv 파일로 저장

 

from sklearn.metrics import f1_score
f1_score(y_test,y_pred)
>0.9022556390977443

 

save_model(model, './model')

지정한 디렉토리에 저장

load_model( './model') 불러오기

 

 

최종적인 automl

# load dataset 
from pycaret.datasets import get_data 
data = get_data('diabetes') 

# init setup 
from pycaret.classification import *
clf1 = setup(data, target = 'Class variable') 

# compare models
top5 = compare_models(n_select = 5) 

# tune models
tuned_top5 = [tune_model(i) for i in top5]

# ensemble models
bagged_top5 = [ensemble_model(i) for i in tuned_top5]

# blend models
blender = blend_models(estimator_list = top5) 

# stack models
stacker = stack_models(estimator_list = top5) 

# automl 
best = automl(optimize = 'Recall')
print(best)
 

 

출처 : https://velog.io/@shrieking97/KT-%EC%97%90%EC%9D%B4%EB%B8%94%EC%8A%A4%EC%BF%A8-53%EC%9D%BC%EC%B0%A81

 

 

https://velog.io/@shrieking97/KT-%EC%97%90%EC%9D%B4%EB%B8%94%EC%8A%A4%EC%BF%A8-47%EC%9D%BC%EC%B0%A81

 

 

https://mz-moonzoo.tistory.com/5


https://pycaret.gitbook.io/docs/get-started/functions/optimize

 

https://github.com/pycaret/pycaret/blob/master/requirements-optional.txt #pycaret 요구사항

반응형