1. Hyperparameter 튜닝문제
모델의 파라미터는 어떻게 설정해야 할까?
사용하려는 모델의 Docs를 참고하며 진행하자.
- RandomForestClassifier, XGBClassifier
- baysian optimization
1) grid search
- 옵션 값을 리스트로 놓고 돌리는 방법
단점: 사용자가 정한것만, 오래걸림
nlist = [50, 70, 100]
for n in nlist: # n, m in list # max_leaf = m
model = RandomForestClassifier(n_estimators = n)
model.fit(X_train, X_valid)
prediction = model.predict(X_valid)
print(accuracy(y_valid, prediction)) # 옵션값 바꿀때마다 성능 모니터링
2) random search
- 옵션 값의 범위를 지정해놓고 랜덤으로 뽑아서 돌리는 방법
단점: 성능 상관없이 무식하게 랜덤으로 뽑는 방법
3) 베이지안 최적화
- 옵션값을 랜덤으로 놓고 몇번 돌려본다음에, 최적의 옵션 값을 베이지안 기반으로 예측함.
- 다만 아래와 같이, 값이 소수로 나오기 때문에 파라미터가 int 형이라면 형에 맞게 넣어줘야 한다.
- n_estimatros = 50.23132132
- int(50.23132132) <- 50
# 베이지안 최적화
from bays_opt import BayesianOptization
# make moons 랜덤 이진분류 데이터
from sklearn.datasets import make_moons
4) 옵튜나 - 현재 최고로 쓰이는 기법
- 구간을 설정하면 알아서, 최적 값을 잡아준다.
ex)
1. 데이터, x-y나누기, 전처리(문자>숫자), train-valid쪼개기, 스케일링
2. 파라미터 튜닝
!pip install optuna
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import xgboost
import optuna
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import (
accuracy_score,
precision_score,
recall_score,
f1_score,
)
def objective(trial): # 옵튜나 객체
param = {
'n_estimators': trial.suggest_int('n_estimators', 100, 1000),
# 'criterion': trial.suggest_categorical('criterion', ['gini', 'entropy', 'log_loss']),
# 'max_depth': trial.suggest_int('max_depth', 1, 50),
# 'min_samples_split': trial.suggest_int('min_samples_split', 2, 20),
# 'min_samples_leaf': trial.suggest_int('min_samples_leaf', 1, 20),
# 'min_weight_fraction_leaf': trial.suggest_float('min_weight_fraction_leaf', 0.0, 0.5),
# 'max_features': trial.suggest_categorical('max_features', ['sqrt', 'log2', None]),
# 'max_leaf_nodes': trial.suggest_int('max_leaf_nodes', 10, 100),
# 'min_impurity_decrease': trial.suggest_float('min_impurity_decrease', 0.0, 0.5),
# 'bootstrap': trial.suggest_categorical('bootstrap', [True, False]),
# 'oob_score': trial.suggest_categorical('oob_score', [True, False]),
# 'warm_start': trial.suggest_categorical('warm_start', [True, False]),
# 'class_weight': trial.suggest_categorical('class_weight', [None, 'balanced', 'balanced_subsample']),
# 'ccp_alpha': trial.suggest_float('ccp_alpha', 0.0, 0.5),
# 'max_samples': trial.suggest_float('max_samples', 0.1, 1.0) if trial.suggest_categorical('use_max_samples', [True, False]) else None,
# 'random_state': 1, # 고정
# 'n_jobs': -1 # 고정
}
model = RandomForestClassifier(**param)
model.fit(X_train, y_train)
y_pred = model.predict(X_valid)
return f1_score(y_valid, y_pred, average='micro') # f1 score는 이진분류 이기 때문에 macro 꼭 해줄 것.
# 클래스 갯수가 비슷하게 있으면, macro. 아니면 micro
# Create the study
study = optuna.create_study(direction='maximize') # maximize 분류 # 회귀는 minimize
# 탐색함수, 시도할 횟수
study.optimize(objective, n_trials=100)
# best parameters
print('Best parameters', study.best_params)
model = RandomForestClassifier(**study.best_params) # 최적의 하이퍼 파라미터
model.fit(X_train, y_train)
# y_pred = model.predict(X_valid))
# print('f1_score: ', f1_score(y_valid), y_pred))
# 예측값
y_pred = model.predict(X_valid)
# 정확도
print("Accuracy:", accuracy_score(y_valid, y_pred))
# 정밀도, 재현율, F1 (macro 기준)
print("Precision (macro):", precision_score(y_valid, y_pred, average='macro'))
print("Recall (macro):", recall_score(y_valid, y_pred, average='macro'))
print("F1-score (macro):", f1_score(y_valid, y_pred, average='macro'))
2. Model selection
어떤 모델이 가장 좋을까?
1. Pycaret
- stack ( 여러개의 모델을 이용한 앙상블 ) 을 지원한다.
!pip install pycaret
데이터셋
#pycaret에서 제공하는 'juice' 데이터
from pycaret.datasets import get_data
data = get_data('juice')
#data.info()
print(data)
모델 비교 준비
from pycaret.classification import * # setup, compare_models
setup_clf = setup(data=data, target='Purchase')
class_top = compare_models()
class_top
2. Autogluon
- 데이터를 몽땅 다 주고서 모델별 스코어를 비교하는 라이브러리
Tags:
클라우드