MLOps

[MLOps] 11. 교차검증 (Cross-validation)

mlslly 2024. 4. 22. 18:23

 

앞서 HPO를 통해 찾은 파라미터가 최적의 값인지 알아보는 방법은 무엇일까? 

하이퍼파라미터 최적화의 대표적인 툴인 Optuna 활용 예시는 아래 실습 포스팅을 참고. 

https://ysryuu.tistory.com/16

 

[MLOps] 9. Optuna 실습

Optuna란? 하이퍼파라미터를 최적화 할 수 있는 대표적인 프레임워크 중 하나에 대해 모른다면 아래 포스팅 참고. https://ysryuu.tistory.com/15 [MLOps] 8. 하이퍼파라미터 최적화 Hyperparameter Optmization이란?

ysryuu.tistory.com

 

교차검증  : 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 강의를 참고하여 작성함