앞서 HPO를 통해 찾은 파라미터가 최적의 값인지 알아보는 방법은 무엇일까?
하이퍼파라미터 최적화의 대표적인 툴인 Optuna 활용 예시는 아래 실습 포스팅을 참고.
교차검증 : K-fold Cross Validation 이란?
- 목적 : 전체 Training 데이터를 Train, test(valid) 로만 나누는 Hold out 방식이 valid data에 오버피팅 된다는 단점을 극복
- 방법 : 데이터 전체를 5등분하고, 5개중 1개를 test(valid) 데이터로 설정해서 학습. 이 과정을 test데이터의 위치를 바꿔가며 5번 반복 -> 최종 performance는 각 결과의 평균으로 간주
- 최종 모델 : 전체 데이터셋에 대해서 학습시킨 모델을 활용함
Holdout 검증 이후 전체 모델을 학습시키기
아래의 함수 부분을 추가함.
'''
'''
def train_best_model(params) :
run_name = f'{UNIQUE_PREFIX}-best-model'
with mlflow.start_run(run_name=run_name): # logging
#log parameter
mlflow.log_params(params)
# load data
iris = load_iris(as_frame=True)
X, y = iris['data'], iris['target']
# train model
clf = RandomForestClassifier(n_estimators=params['n_estimators'], max_depth=params['max_depth'], random_state=2024)
clf.fit(X, y)
return clf
if __name__ == '__main__' :
'''
'''
best_params = study.best_params
best_clf = train_best_model(best_params)
<optuna_train_best.py 파일 내용>
import uuid
import mlflow
import optuna
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
UNIQUE_PREFIX = str(uuid.uuid4())[:8]
def objective(trial) :
# suggest new parameter
trial.suggest_int('n_estimators',100,1000, step=100)
trial.suggest_int('max_depth', 3,10)
run_name = f'{UNIQUE_PREFIX}-{trial.number}'
with mlflow.start_run(run_name=run_name):
# log parameter
mlflow.log_params(trial.params)
# load data
iris = load_iris(as_frame=True)
X, y = iris['data'], iris['target']
X_train, X_valid, y_train, y_valid = train_test_split(X,y,test_size=0.3, random_state=2024)
# train model
clf = RandomForestClassifier(n_estimators=trial.params['n_estimators'], max_depth=trial.params['max_depth'], random_state=2024)
clf.fit(X_train, y_train)
# evaluate data
y_pred = clf.predict(X_valid)
acc_score = accuracy_score(y_valid, y_pred)
# log metrics
mlflow.log_metrics({'accuracy': acc_score})
return acc_score
def train_best_model(params) :
run_name = f'{UNIQUE_PREFIX}-best-model'
with mlflow.start_run(run_name=run_name): # logging
#log parameter
mlflow.log_params(params)
# load data
iris = load_iris(as_frame=True)
X, y = iris['data'], iris['target']
# train model
clf = RandomForestClassifier(n_estimators=params['n_estimators'], max_depth=params['max_depth'], random_state=2024)
clf.fit(X, y)
return clf
if __name__ == '__main__' :
# set mlflow
mlflow.set_tracking_uri('http://0.0.0.0:5001')
mlflow.set_experiment('hpo-tutorial')
# study
sampler = optuna.samplers.RandomSampler(seed=2024)
study = optuna.create_study(sampler=sampler, study_name = 'hpo-tutorial', direction='maximize')
# optimize
study.optimize(objective, n_trials=5)
best_params = study.best_params
best_clf = train_best_model(best_params)
파일 실행해보기
$ python3 optuna_train_best.py
MLflow 확인
실험 완료 후에 best model 저장된 것을 확인 가능. 실험 5개 추가 + best model 추가. 그러나 이 경우에는 metric을 산출할 수가 없기 때문에 accuracy는 기록이 안되고, 파라미터 정보만 확인 가능함
* 프로그래머스의 마키나락스 MLOPS 강의를 참고하여 작성함
'MLOps' 카테고리의 다른 글
[MLOps] 15. 모델 저장 개념 및 구조 (0) | 2024.04.29 |
---|---|
[MLOps] 12. 데이터 관리 (feat.MinIO 소개) (0) | 2024.04.22 |
[MLOps] 10. MLflow + Optuna 실습 (0) | 2024.04.22 |
[MLOps] 9. Optuna 실습 (0) | 2024.04.22 |
[MLOps] 8. 하이퍼파라미터 최적화 (1) | 2024.04.18 |