인프런 커뮤니티 질문&답변

Idea님의 프로필 이미지
Idea

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

Bayesian Optimization 관련 질문드립니다.

작성

·

677

0

안녕하세요! 항상 좋은 강의 잘 듣고 있습니다 :)

다름이 아니라 수업을 들으며, 베이지안 최적화 방법을 통한 하이퍼 파라미터 튜닝 과정에서 헷갈리는 부분이 있어서 질문 올리게 되었습니다.

선생님이 예시로 보여주신 코드처럼 iteration을 수행할 때마다, 하이퍼 파라미터를 입력받아 학습하고 rmse 값을 반환하는 함수를 생성해주고자 합니다.

그런데 랜덤포레스트 모델에서 베이지안 최적화(cross validation 수행)을 하고자 할 때, 만약 평가 지표를 RMSE를 사용하고자 한다면 아래와 같이 코드를 작성하면 되는 것인가요?

구글링을 좀 해보니 함수 반환 값을 "return -mean_rmse"와 같이 뒤에 -1 을 곱해서 rmse 값을 최소화 해주어야 한다는 글을 몇 개 보았는데, 어떤 것이 맞는 건지 헷갈리네요...

즉, return 값에 "mean_rmse"를 해주는 것이 맞는지, 아니면 "-mean_rmse"를 해주는 것이 맞는지 궁금합니다.

rf_bayes_params = {
    'max_depth': (6, 12),
    'min_samples_leaf': (8, 18),
    'min_samples_split': (8, 20)
}

def rf_eval(max_depth, min_samples_leaf, min_samples_split):
    params = {
        # n_estimators 값은 100으로 고정
        'n_estimators': 100,
        # 호출 시, 실수형 값들이 들어오므로 정수형 하이퍼 파라미터는 정수형으로 변경해줘야 함
        'max_depth': int(round(max_depth)),
        'min_samples_leaf': int(round(min_samples_leaf)),
        'min_samples_split': int(round(min_samples_split))
    }
    
    rf = RandomForestRegressor(**params, n_jobs = -1, random_state = 1021)
    
    # Cross Validation
    neg_mse_scores = cross_val_score(rf, X_features, y_target, # CV를 수행할 것이므로, 전체 학습 데이터 셋을 사용
                                     scoring = 'neg_mean_squared_error',
                                     cv = 3)
    rmse_scores = np.sqrt(-1 * neg_mse_scores)
    mean_rmse = np.mean(rmse_scores)
    
    return mean_rmse

rf_bayes = BayesianOptimization(f = rf_eval, pbounds = rf_bayes_params, random_state = 1021)
rf_bayes.maximize(init_points = 5, n_iter = 25)

rf_bayes.res

답변 2

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까

Bayesian optimization은 object 함수를 최대화(maximize) 또는 최소화(minimize) 할 수 있는 방향성으로 최적화 할 수 있습니다.

정확도, ROC-AUC 같은 지표는 maximize 할 수 있어야 하고, RMSE 같은 지표는 minimize 해야 합니다(왜냐하면 rmse 오류에 대한 지표 이므로 최소화 해야 합니다). maximize형태의 지표를 사용하려면 maximize()를 minimize 형태의 지표를 사용하려면 minimize() 호출합니다. 따라서 여기에 맞춰서 objective 함수가 만들어져야 합니다.

사이킷런의 cross_val_score()에서 neg_mean_squared_error는 MSE에 -1을 곱한 값을 반환합니다. MSE는 양수인데 클수록 나쁜 지표입니다. 사이킷런은 지표값이 큰 값은 좋은 지표로 일괄 처리하므로 이를 위해 MSE*-1 값을 제공합니다. 

maximize() 는 큰 값으로 유도하므로 neg_mean_squared_error로, 만일 -1*neg_mean_squared_error(즉 양수 오류) 이라면 minimize()로 최적화 유도 해야 합니다.

감사합니다.

0

Idea님의 프로필 이미지
Idea
질문자

아...이제야 이해가 되었습니다. 답변 정말 감사드립니다!! :)

Idea님의 프로필 이미지
Idea

작성한 질문수

질문하기