본문 바로가기

[머신러닝] RandomSearchCV 사용 방법 및 GridSearchCV 차이점

hyunicecream 2024. 4. 12.

머신러닝 모델의 성능을 높이기 위해 여러 가지 방법을 고안하거나 실행해 보실 텐데, 이번에 HyperParmeter Tuning 방법 중 하나인 RandomSearchCV에 대한 설명 및 사용방법에 알아보고자 합니다. 추가로 GridSearchCV와 어떤 점이 다른지 비교해 보겠습니다.

1. RandomSearchCV 란?

RandomSearchCV는 머신러닝 모델의 하이퍼파라미터를 최적화하는 방법 중 하나입니다. 이 방법은 하이퍼파라미터의 특정 범위 내에서 무작위로 선택하여 모델을 평가하고, 이 중에서 가장 좋은 성능을 보이는 파라미터를 찾습니다. RandomSearchCV는 다양한 하이퍼파라미터 조합을 신속하게 탐색할 수 있는 장점이 있습니다.

사용자가 지정한 파라미터 값(시행 횟수 또는 시간) 내에서 실행되며, 각 시행에서 하이퍼파라미터의 새로운 조합을 테스트합니다. RandomSearchCV는 sklearn 라이브러리에서 제공하는 클래스로, 교차 검증을 사용하여 각 조합의 성능을 평가합니다. 이 과정은 병렬 처리도 지원하여 더 빠른 계산이 가능합니다. RandomSearchCV는 특히 하이퍼파라미터의 차원이 많거나, 탐색 공간이 클 때 유용하게 사용됩니다.

2. RandomSearchCV 4가지 장점

  1. 효율성: RandomSearchCV는 모든 가능한 조합을 평가하지 않고, 무작위로 선택된 하이퍼파라미터 조합을 사용하여 비교적 빠르게 최적의 조합을 찾을 수 있습니다. - GridsearchCV는 너무 오래 걸려요...
  2. 비용 효과적: 큰 파라미터 공간에 대해 더 적은 계산으로 좋은 결과를 얻을 수 있어, 계산 비용을 절감할 수 있습니다.
  3. 확장성: 파라미터 공간이 클 때 GridSearchCV에 비해 더 나은 성능을 발휘할 가능성이 높습니다.
  4. 유연성: 다양한 확률 분포에서 파라미터를 샘플링할 수 있어, 파라미터의 중요성에 따라 탐색 전략을 조정할 수 있습니다.

3. RandomSearchCV와 GridSearchCV의 차이점

특성 RandomSearchCV GridSearchCV
탐색 방식 무작위로 하이퍼파라미터 조합 선택 가능한 모든 하이퍼파라미터 조합을 체계적으로 탐색
속도 및 효율성 일반적으로 더 빠르며 하이퍼파라미터의 수가 많을 때 효율적 모든 조합을 평가하기 때문에 더 많은 시간과 계산력이 필요함
계산 비용 비교적 낮음 높음
과적합(Overfitting)의 위험 무작위 선택으로 과적합의 위험이 낮아질 수 있음 모든 가능한 조합을 탐색함으로써 최적의 값에 과적합 될 수 있음
파라미터 중요도 발견 중요하지 않는 파라미터에 의해 결과가 크게 좌우되지 않음 모든 파라미터의 영향을 평가하므로 중요 파라미터와 그렇지 않은 파라미터를 구분할 수 있음
유연성 하이퍼파라미터의 분포를 자유롭게 선택할 수 있음 고정된 간격으로 하이퍼파라미터 평가

4. RandomSearchCV 코드 공유

RandomizedSearchCV하이퍼파라미터 값과, 평가 방법에 원하시는 값을 넣으시면 될 것 같습니다. 또한 Random_state=42로 고정해주세요. 모델 학습 과정에서의 무작 요소 통제 및 일관된 방식을 유지하기 위해서입니다.

4. 1 전체 코드 설명

import numpy as np
import time
from sklearn.model_selection import RandomizedSearchCV
import xgboost as xgb
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor

# 결과 출력 함수
def print_results(model_name, rscv):
    print("="*100)
    print(f'{model_name} 최적 파라미터:', rscv.best_params_)
    rmse = np.sqrt(-rscv.best_score_)
    print(f'{model_name} 예측 RMSE: {rmse:.4f}')
    print("="*100)

# RandomizedSearchCV 실행 함수
def execute_random_search(model_name, model, params, X_train, y_train):
    print(f"{model_name}에 대한 RandomizedSearchCV 실행 중")
    start_time = time.time()  # 학습 시작 시간
    rscv = RandomizedSearchCV(estimator=model, param_distributions=params, n_iter=100, scoring='neg_mean_squared_error', cv=5, refit=True, n_jobs=-1, verbose=2, random_state=42)
    rscv.fit(X_train, y_train)
    end_time = time.time()  # 학습 종료 시간
    elapsed_time = int(end_time - start_time)  # 경과 시간을 정수 초로 변환
    hours, remainder = divmod(elapsed_time, 3600)  # 시간과 나머지(초) 계산
    minutes, seconds = divmod(remainder, 60)  # 분과 초 계산

    print_results(model_name, rscv)
    # "총 학습시간은 OO분 OO초 입니다."와 같은 형식으로 시간을 출력
    if hours > 0:
        print("총 학습시간은 {}시간 {}분 {}초 입니다.".format(hours, minutes, seconds))
    else:
        print("총 학습시간은 {}분 {}초 입니다.".format(minutes, seconds))

# 메인 함수
def run_random_search(X_train, y_train):
    models_params = {
        'XGBRegressor': (xgb.XGBRegressor(), {
            "max_depth": [5, 8, 10],
            "min_child_weight": [1, 3, 6, 8],
            "colsample_bytree": [0.3, 0.5, 0.7],
            "n_estimators": [90, 100, 200],
            "learning_rate": [0.05, 0.07, 0.1],
            "subsample": [0.6, 0.7, 0.8],
            "gamma": [0, 0.1, 0.2],
            "random_state": [42]
        }),
        'LGBMRegressor': (LGBMRegressor(force_row_wise=True, verbose=-1), {
            "learning_rate": [0.1, 0.15, 0.2],
            "max_depth": [6, 10, 20],
            "num_leaves": [31, 63, 127],
            "n_estimators": [150, 200, 300],
            "min_child_weight": [10, 20, 30],
            "colsample_bytree": [0.5, 0.7, 0.9],
            "random_state": [42]
        }),
        'CatBoostRegressor': (CatBoostRegressor(verbose=False), {
            "depth": [6, 8, 10],
            "iterations": [100, 150, 200, 300],
            "learning_rate": [0.09, 0.1, 0.15],
            "border_count": [128, 254, 512],
            "l2_leaf_reg": [3, 5, 9],
            "random_state": [42]
        }),
    }

    for model_name, (model, params) in models_params.items():
        execute_random_search(model_name, model, params, X_train, y_train)

# 실행
run_random_search(X_train, y_train)

4.2 RandomizedSearchCV 파라미터 설명

  • estimator: 하이퍼파라미터를 튜닝할 모델 객체입니다.
  • param_distributions: 탐색할 하이퍼파라미터의 분포를 사전(dictionary) 형태로 제공합니다. 무작위로 선택될 값의 리스트를 포함합니다.
  • n_iter: 하이퍼파라미터 설정의 수를 정의합니다. 여기서는 100번의 다른 조합으로 모델을 평가합니다.
  • scoring: 모델 평가 기준을 정의합니다. 이 예에서는 'neg_mean_squared_error'를 사용하여 평균 제곱 오차의 음수 값을 사용합니다.
  • cv: 교차 검증 분할 수를 지정합니다. 여기서는 5로 설정되어 있습니다.
  • refit: 최적의 파라미터를 찾은 후 주어진 데이터에 대해 모델을 다시 학습시킬지 여부를 결정합니다. True로 설정되어 있습니다.
  • n_jobs: 동시에 실행할 작업의 수를 지정합니다. -1은 가능한 모든 프로세서를 사용한다는 것을 의미합니다.
  • verbose: 로그 출력의 상세도를 조절합니다. 2로 설정되어 있어 중간 결과도 출력됩니다.

4.3 RandomizedSearchCV 사용 결과

사용하고 나면 다음과 같은 결과가 출력됩니다.

  • 전체 화면

전체 화면
전체 화면

  • 결과 확대 화면

결과 확대 화면
결과 확대 화면

5. 결론

개인적으로 하이퍼파라미터 튜닝 과정에서 시간은 정말 중요하다고 생각합니다.
만약 여러분이 GridSearchCV를 사용해 오면서 긴 학습 시간을 경험하셨다면, RandomSearchCV를 고려해 보시는 것을 추천드립니다. RandomSearchCV는 GridSearchCV에 비해 더 짧은 시간 안에 하이퍼파라미터의 효율적인 조합을 찾을 수 있습니다. 특히 많은 수의 하이퍼파라미터를 가진 모델에서 더욱 두드러집니다.

하이퍼파라미터 튜닝을 통해 여러분의 모델 성능을 최적화하고, 예측 정확도를 향상시켜 보세요!

그리고 Sklearn공식 홈페이지에 있는 RandomeSearchCV 링크를 공유드립니다 : 공식홈페이지 바로가기

추가적으로 GridSearchCV와 Optuna에 대한 설명도 첨부드려요 ~! 

 

[머신러닝] GridSearchCV 사용방법(예시)

GridSearchCV 안녕하세요. 이번에 GridSearchCV라는 모듈에 대한 설명과 사용 방법에 대해 예시로 보여주고자 합니다. GridSearchCV란 머신러닝에서 모델의 성능향상(고도화)을 위해 쓰이는 기법 중 하나입

hyunicecream.tistory.com

 

[머신러닝] Optuna 모델 최적화 - 하이퍼파라미터 튜닝 사용법

하이퍼파라미터 튜닝 방법 중 하나인 Optuna에 대해 소개하고자 합니다. Optuna에 대한 설명 및 기존의 GridSearchCV, RandomSearchCV와 어떤점이 다른지 알아보겠습니다. 1. Optuna란 무엇인가? Optuna는 기계

hyunicecream.tistory.com

 

댓글