1. Pycaret이란?
Auto ML을 해주는 파이썬 라이브러리
Auto ML이 생소할 수 있는데, 이전에 포스팅한 글이 있으니 참고하면 좋을 것 같다.
https://42-snoopy.tistory.com/entry/ML-25-AutoML-%EA%B0%9C%EC%9A%94
한마디로 AutoML은 데이터의 성격에 맞게 자동으로 분석 모델을 추천해주는 기법이라고 할 수 있고 pycaret은 AutoML의 한 종류이다.
Pycaret에서 제공하는 기능들
- Classification
- Regression
- Clustering
- Anomaly Detection
- Natural Language Processing
pycaret 사용 순서는 크게보면, 아래와 같이 정리할 수 있다.
0️⃣ 라이브러리 로드
1️⃣ setup
2️⃣ compare_models(모델성능 비교)
3️⃣ create_model (모델 생성)
4️⃣ tune_model(모델튜닝)
5️⃣ plot_model(결과 시각화)
6️⃣ predict_model(홀드아웃 예측)
7️⃣ finalize_model(홀드아웃을 포함한 전체 데이터에 대한 예측)
8️⃣ unseen predict(predict_model)
9️⃣ save_model(모델 저장)
🔟 load_model(저장된 모델 불러오기)
2. pycaret 설치 및 라이브러리 로드
주피터에서 실습을 진행해보고 싶었지만,
여건이 되지 않아 colab에서 실습을 진행하였다.
설치하기
!pip install pycaret
pycaret은 sklearn의 0.23.2 버전과 호환된다고 하여 sklearn 삭제 후 0.23.2 버전으로 재설치를 해주었다.
!pip uninstall sklearn -y
!pip install --upgrade sklearn
!pip install scikit-learn==0.23.2 --user
import sklearn
sklearn.__version__
0.23.2 버전임을 확인한다.
3. Initialize
(1) Setup
전달된 모든 매개변수를 기반으로 transfrom pipeline을 구축하는 함수
필수 파라미터
1️⃣ data: pandas.DataFrame
적용할 데이터
2️⃣ target: str
정답 값
# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')
# init setup - 분류
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')
# init setup - 회귀
rg = setup(data = train, target = 'box_off_num')
모든 변수의 데이터 유형을 자동으로 출력하고
올바르게 출력된 경우 빈 셀에 Enter키를 눌러 계속할 수 있다.
그럼 아래와 같이 출력된다.
✔️ Default Transformation (setup의 옵션)
setup 단계에서 진행되는 대부분의 전처리는 True or False 형태로 입력하면 된다.
다음 3가지는 default로 수행되는 전처리이다.
1️⃣ 결측값 대치
2️⃣ 원 핫 인코딩
3️⃣ train - test 분할
✔️ Experiment Logging (setup의 옵션)
setup의 선택적 파라미터를 이용하여 기계 학습 모델에 대한 모든 metric, hyper parameter 및 중요한 정보들을 자동으로 추적할 수 있다.
아래 코드에서는 log_experiment, experiment_name 등의 파라미터를 추가해주었다.
# load dataset
from pycaret.datasets import get_data
data = get_data('diabetes')
# init setup
from pycaret.classification import *
clf1 = setup(data, target = 'Class variable', log_experiment = True, experiment_name = 'diabetes1')
4. Train
(1) Compare_models
교차검증을 사용하여 사용할 수 있는 모든 모델의 성능을 훈련하고 평가하는 함수
CV 중에 평가된 metrics는 get_metrics 함수를 사용하여 접근할 수 있다.
사용자 지정 metrics은 add_metrics와 remove_metrics 함수를 이용하여 추가 및 삭제 가능
1️⃣ 모델 비교하기
# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')
# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')
# compare models
best = compare_models()
참고로 catboost의 경우 사전에 설치하지 않으면 보이지 않는다.
2️⃣ 한 개의 모델 대신 상위 N개의 모델 반환하기
compare_models()를 실행하면, 최고 성능의 모델만 반환하며, n_select를 이용하면 둘 이상의 모델을 반환할 수도 있다.
best = compare_models(n_select = 3)
결과에는 변경사항이 없지만, 하나의 모델 대신 상위 3개의 모델 목록이 포함되어 출력된다.
3️⃣ 정렬 기준으로 사용할 점수 지정하기
모델의 성능을 표시할 때, 어떤 점수를 기준으로 모델을 정렬할지 지정할 수 있다.
# compare models - F1 점수를 기준으로 정렬하기
best = compare_models(sort = 'F1')
4️⃣ 일부 모델만 비교하기
또한 비교할 모델을 include와 exclude를 통해 일부만 지정하여 확인할 수도 있다.
best = compare_models(include = ['rf', 'et', 'lightgbm','catboost'], sort='F1')
best = compare_models(exclude = ['catboost'], sort='F1')
# 회귀 모델에서 추가 옵션
best = compare_models(fold = 5, round = 3, sort = 'AUC', n_select = 15)
5️⃣ 최고 성능의 모델과 하이퍼파리미터 출력하기
print(best)를 사용하면 성능이 제일 뛰어난 모델을 하이퍼파라미터 값과 함께 출력해준다.
(2) Create_model
교차검증을 사용하여 사용할 수 있는 모든 모델의 성능을 훈련하고 평가하는 함수
CV 중에 평가된 metrics는 get_metrics 함수를 사용하여 접근할 수 있다.
사용자 지정 metrics은 add_metrics와 remove_metrics 함수를 이용하여 추가 및 삭제 가능
1️⃣ ridge classifier로 모델 생성하기
# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')
# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')
# train ridge classifier
ridge = create_model('ridge')
학습된 모델에 대한 metrics을 fold별로 표시하고 각 metrics에 대한 평균과 표준편차를 출력한다.
fold의 default = 10이며 fold의 개수는 당연히 변경할 수 있다.
2️⃣ fold 개수 변경하기
# train ridge classifier
ridge = create_model('ridge', fold = 5)
(3) Model library
사용가능한 모델의 리스트를 불러올 수 있다.
models()
5. Optimize
(1) tune_model
모델의 하이퍼파라미터를 튜닝하는 기능이다.
# train ridge classifier
ridge = create_model('ridge')
# 튜닝
tuned_ridge = tune_model(ridge)
하이퍼파라미터 비교
# 기본모델
print(ridge)
# 튜닝모델
print(tuned_ridge)
1️⃣ n_iter로 반복횟수 지정하기
가능한 시간에 따라 지정하면 된다.
# train ridge classifier
ridge = create_model('ridge')
# 튜닝
tuned_ridge = tune_model(ridge, n_iter = 50)
2️⃣ metrics 선택(optimize)
# train ridge classifier
ridge = create_model('ridge')
# 튜닝
tuned_ridge = tune_model(ridge, n_iter = 50, optimize = 'Accuracy')
(2) blend_models
# blender
ridge = create_model('ridge')
lda = create_model('lda')
catboost = create_model('catboost')
# blend_models
blend_models([ridge, lda, catboost])
type(blender), print(blender)
type(blender)
>>> sklearn.ensemble._voting.VotingClassifier
print(blender)
1️⃣ fold param 변경
# blender
ridge = create_model('ridge')
lda = create_model('lda')
catboost = create_model('catboost')
# blend_models
blend_models([ridge, lda, catboost], fold = 5)
2️⃣ n_select
# load dataset
from pycaret.datasets import get_data
diabetes = get_data('diabetes')
# init setup
from pycaret.classification import *
clf1 = setup(data = diabetes, target = 'Class variable')
# blend models
blender = blend_models(compare_models(n_select = 3))
3️⃣ voting 방식 변경
# blender
ridge = create_model('ridge')
lda = create_model('lda')
catboost = create_model('catboost')
# blend_models
blend_models([ridge, lda, catboost],method = 'soft')
4️⃣ 가중치 부여
blender = blend_models([ridge, lda, catboost], weights = [0.7, 0.2, 0.1])
물론 여기에 튜닝도 할 수 있다.
# tune blender
tuned_blender = tune_model(blender_weighted)
5️⃣ Automatically choose better
tuned_blender = tune_model(blender, choose_better = True, optimize = "Accuracy")
6. Analyze
[공식] https://pycaret.gitbook.io/docs/get-started/functions/analyze
(1) plot_model
# creating a model
lr = create_model('lr')
# plot model
plot_model(lr, plot = 'auc')
시각화한 그림을 save 옵션을 통해 저장할 수도 있다.
# creating a model
lr = create_model('lr')
# plot model
plot_model(lr, plot = 'auc', save = True)
plot_kwargs로 plot customize하기
딕셔너리 형태로 입력해주면 된다.
# creating a model
lr = create_model('lr')
# plot model
plot_model(lr, plot = 'confusion_matrix', plot_kwargs = {'percent' : True})
percent : true를 입력하면,
퍼센트 비율이 함께 출력된다.
use train data = True로 train data 사용하기
# creating a model
lr = create_model('lr')
# plot model
plot_model(lr, plot = 'auc', use_train_data = True)
(2) plot 종류
1️⃣ 분류(classification)
Plot Name
|
Plot
|
Area Under the Curve
|
‘auc’
|
Discrimination Threshold
|
‘threshold’
|
Precision Recall Curve
|
‘pr’
|
Confusion Matrix
|
‘confusion_matrix’
|
Class Prediction Error
|
‘error’
|
Classification Report
|
‘class_report’
|
Decision Boundary
|
‘boundary’
|
Recursive Feature Selection
|
‘rfe’
|
Learning Curve
|
‘learning’
|
Manifold Learning
|
‘manifold’
|
Calibration Curve
|
‘calibration’
|
Validation Curve
|
‘vc’
|
Dimension Learning
|
‘dimension’
|
Feature Importance (Top 10)
|
‘feature’
|
Feature IImportance (all)
|
'feature_all'
|
Model Hyperparameter
|
‘parameter’
|
Lift Curve
|
'lift'
|
Gain Curve
|
'gain'
|
KS Statistic Plot
|
'ks'
|
2️⃣ 회귀(regression)
Name
|
Plot
|
Residuals Plot
|
‘residuals’
|
Prediction Error Plot
|
‘error’
|
Cooks Distance Plot
|
‘cooks’
|
Recursive Feature Selection
|
‘rfe’
|
Learning Curve
|
‘learning’
|
Validation Curve
|
‘vc’
|
Manifold Learning
|
‘manifold’
|
Feature Importance (top 10)
|
‘feature’
|
Feature Importance (all)
|
'feature_all'
|
Model Hyperparameter
|
‘parameter’
|
3️⃣ clustering
Name
|
Plot
|
Cluster PCA Plot (2d)
|
‘cluster’
|
Cluster TSnE (3d)
|
‘tsne’
|
Elbow Plot
|
‘elbow’
|
Silhouette Plot
|
‘silhouette’
|
Distance Plot
|
‘distance’
|
Distribution Plot
|
‘distribution’
|
4️⃣ Anomaly Detection
Name
|
Plot
|
t-SNE (3d) Dimension Plot
|
‘tsne’
|
UMAP Dimensionality Plot
|
‘umap’
|
5️⃣ Natural Language Processing
Name
|
Plot
|
Word Token Frequency
|
‘frequency’
|
Word Distribution Plot
|
‘distribution’
|
Bigram Frequency Plot
|
‘bigram’
|
Trigram Frequency Plot
|
‘trigram’
|
Sentiment Polarity Plot
|
‘sentiment’
|
Part of Speech Frequency
|
‘pos’
|
t-SNE (3d) Dimension Plot
|
‘tsne’
|
Topic Model (pyLDAvis)
|
‘topic_model’
|
Topic Infer Distribution
|
‘topic_distribution’
|
Word cloud
|
‘wordcloud’
|
UMAP Dimensionality Plot
|
‘umap’
|
evaluate_model
학습된 모델의 성능을 분석하기 위한 모든 지표가 출력된다.
# create model
lr = create_model('lr')
# launch evaluate widget
evaluate_model(lr)
아래와 같이 plot type을 클릭하면 해당 타입의 plot이 출력되는 동적인 시각화 방법이다.
plot_model을 기반으로 작동된다.
7. Deploy
(1) predict_model
학습된 모델을 기반으로 정답값을 예측한다.
data가 None이면, hold-out 데이터에서 정답을 예측한다.
1️⃣ 홀드아웃 예측
# create a model
xgboost = create_model('xgboost')
# predict on hold-out
predict_model(xgboost)
(2) finalize_model
hold-out 집합을 포함한 전체 데이터 셋에 지정된 모델을 학습한다.
(만약 데이터를 가져오는 단계에서 frac을 사용하면, frac에서 설정한 비율의 데이터셋에 대해서만 학습을 진행함)
# create a model
rf = create_model('rf')
# finalize a model
finalize_model(rf)
(3) Predict_model(보이지 않는 데이터 예측)
위에서 언급한 바와 같이 데이터를 가져오는 단계에서 frac을 사용하여 데이터의 비율 설정할 수가 있다.
data = dataset.sample(frac=0.95, random_state=786)
data_unseen = dataset.drop(data.index)
data.reset_index(inplace=True, drop=True)
data_unseen.reset_index(inplace=True, drop=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))
unseen_predictions를 사용하면 초기에 불러오지 않은, 원본 데이터 세트의 5%를 포함하여 예측하게 된다.
unseen_predictions = predict_model(final_rf, data=data_unseen)
unseen_predictions.head()
(3) save_model
transform된 파이프라인과 학습된 모델 개체를 나중에 사용할 수 있도록 현재 작업 디렉토리에 pickle 파일로 저장하는 기능
# create a model
dt = create_model('dt')
# save pipeline
save_model(dt, 'dt_pipeline')
(4) load_model
저장된 파이프라인을 로드하는 기능
# save pipeline
save_model(dt, 'dt_pipeline')
# load pipeline
load_model('dt_pipeline')
[참고한 글]
Pycaret을 사용한 데이터 분석 (tistory.com)
[python] colab pycaret 설치 — 코딩하는 감자 (tistory.com)
반자동 Auto ML 라이브러리인 PyCaret 사용하기 (tistory.com)
'머신러닝과 딥러닝 > ML 개념정리' 카테고리의 다른 글
[ML] 27. (AutoML) Wandb 개요 (0) | 2022.11.17 |
---|---|
[ML] 25. AutoML 개요 (0) | 2022.11.14 |
[ML] 22. 머신러닝 분류모델과 분류모델의 알고리즘 개요 (1) | 2022.11.14 |
[ML] 21. 데이터 전처리 (10) - 파생변수 만들기 (0) | 2022.11.14 |
[ML] 20. 데이터 전처리 (9) - 인코딩(Ordinary-Encoding, label-Encoding, One-hot-Encoding) (0) | 2022.11.14 |
댓글